STM32的GPIO_蓝桥杯LCD屏幕实验_驱动文件的使用
LCD简介
LCD显示原理
-
液晶显示原理
液晶在未加电场时透明,加电场后浑浊(无法反射所有光线从而显像)
-
LCD显示器工作原理
把显示面板分为很多小栅格,每个格栅都由一个电极控制,通过改变电极就能控制格栅内液晶的排列,从而控制光路的导通
显然,像控制数码管一样亲自配置引脚去控制每一个电极是不现实的,这就需要借助厂商提供的驱动来使用LCD
LCD的GPIO引脚配置
-
LCD的GPIO引脚连接
开发板上的LCD_HDR-M-2.54共有30个引脚,如图

PB9连接LCD_CS,PB5连接LCD_WR,PB8连接LCD_RS,PA8连接LCD_RD,PC0-15引脚连接LCD_D0-15
-
LCD的GPIO初始化配置
为使用LCD,需要将上文提到的PB9/8/5,PA8,PC0-15全部配置为GPIO_Output模式
LCD的驱动导入
- 后续使用其他驱动时步骤是相同的
-
复制文件
将蓝桥杯嵌入式资源包提供的LCD驱动
fonts.h和lcd.h文件复制到自己工程的Core文件夹的Inc文件夹下将
led.c复制到自己工程的Core文件夹的Src文件夹中 -
在工程中导入
进入Keil软件中打开自己的工程,单击工具栏上三个方块堆成三角的Manage Project Items按键,打开窗口后在中间的Grops一栏选择Application/User,单击右下角Add Files按键,添加Src文件夹中lcd.c文件,最后在右侧的Files一栏中选择刚刚添加的lcd.c,点OK
-
引入头文件
在
main.c中加入一行#include "lcd.h" -
开始调用函数
上述准备完成之后,就能调用驱动提供的
LCD_Init()函数直接初始化屏幕了
LCD的使用
LCD使用的库函数
-
清屏LCD_Clear
void LCD_Clear(u16 Color); //清屏,并且设置整个屏幕颜色 -
文本颜色LCD_SetTextColor
void LCD_SetTextColor(u16 Color); //设置文本颜色 -
文本背景色LCD_SetBackColor
void LCD_SetBackColor(u16 Color); -
颜色代码
上面三个设置颜色的函数使用数值
u16 Color来表示不同的颜色,在提供的头文件中有定义如下,在使用时直接写对应颜色名即可:/* LCD Color */ #define White 0xFFFF #define Black 0x0000 #define Grey 0xF7DE #define Blue 0x001F #define Blue2 0x051F #define Red 0xF800 #define Magenta 0xF81F #define Green 0x07E0 #define Cyan 0x7FFF #define Yel1ow 0xFFE0 -
显示字符串LCD_DisplayStringLine
void LCD_DisplayStringLine(u8 Line, u8 *ptr); //在指定行显示字符串 //Line是行号,本LCD的行号从Line0-Line9共能显示10行 //ptr是要显示的字符串,长度为20 -
sprintf函数
sprintf()和printf()两个函数都包含在头文件stdio.h中,在用法上几乎一样,区别在于前者会打印到字符串中,而后者是直接在命令行上输出(也就是学C语言输出Hello,world时的黑窗口)int sprintf(char *buffer, const char *format, [argument]); /*参数列表: buffer是一个char型指针,指向欲写入的字符串地址 format同样是char型指针,其指向格式字符串 [argument]是可选参数,其中可以是任何类型的数据 该函数返回int类型的字符串长度 */这个函数用于将其他数据类型格式化为字符串,这样就能在LCD上进行显示
代码实现
-
在LCD上显示字符串以外的数据
以一个显示按键被按下次数的实验为例
#include "stdio.h" uint8_t B1_count,B2_count,B3_count,B4_count; char buf[21];//因为LCD显示限制为20个字符,因此此处字符串设定为21 void Lcd_Proc(void) { sprintf(buf,"B1_Count:%d",B1_count); //将B1_count这个变量的数值以“B1_Count:数”的形式写入字符串buf中 LCD_DisplayStringLine(Line1,(uint8_t*)buf); //在LCD的第二行上显示这行字符串 } //在使用之前,记得在主函数区域写好初始化函数以及背景色、文本色的设置 /* USER CODE BEGIN 2 */ LCD_Init(); LCD_Clear(Black); LCD_SetBackColor(Black); LCD_SetTextColor(White); /* USER CODE END 2 */
功能拓展
LCD界面切换
-
切换不同界面显示不同的内容,实现方法是设置一个变量来记录当前的界面
案例:做三个界面,使用按钮在三个界面间切换,第一个界面显示Hello,world;第二个界面显示按钮按下次数,第三个界面显示
//用变量lcd_page记录当前所在页面 //在按键处理函数中写入改变lcd_page的语句 void Key_Proc(void) { key_val=Key_Scan(); key_down = key_val & (key_val^key_old); key_up = ~key_val & (key_val^key_old); key_old=key_val; if(key_down==1)//按钮1用于切屏 { LCD_Clear(Black); LCD_SetBackColor(Black); LCD_SetTextColor(White); //注意每次按下切换页面按键都要清屏,设置字体演示及其底色,否则无法正确清屏,若写在页面函数中会导致屏闪 if(++lcd_page==3) lcd_page=0;//让lcd_page在0到2间切换 } if(key_down==2)//按钮2用于界面2的按下计数 { B2_count++; } } //Lcd_Proc函数中写不同页面下LCD应该显示的内容 void Lcd_Proc(void) { if(lcd_page==0) { LCD_DisplayStringLine(Line4,(uint8_t*)" Hello World! "); } if(lcd_page==1) { sprintf(buf,"B2_Count:%d",B2_count);//输出按键次数 LCD_DisplayStringLine(Line1,(uint8_t*)buf); } if(lcd_page==2) { LCD_DisplayStringLine(Line4,(uint8_t*)"page_3"); } }
高亮显示
-
这是非常常用的效果,比如说在一页中有几行选项,用高亮来标记被选择的那行选项,实现方法是再设置一个变量来记录界面中不同的选项,并通过改变文本背景色来实现高亮
案例:上一个页面切换的案例的基础上,在第二个界面中设置三行,每行对应一个按键次数计数值,可以切换选中各个计数值
如果出现在切换行时文字颜色显示错误的情况,检测
sprintf函数中的参数是否正常,不要让LCD显示没有赋过初值的变量void Key_Proc(void) { key_val=Key_Scan(); key_down = key_val & (key_val^key_old); key_up = ~key_val & (key_val^key_old); key_old=key_val; if(key_down==1)//按钮1用于切屏 { LCD_Clear(Black); if(++lcd_page==3) lcd_page=0; } if(key_down==2 && lcd_page==1)//按钮2在界面2中用于切换选项 { if(++line_flag==3) line_flag=0;//使用line_flag变量区分选项 } if(key_down==3&&lcd_page==1) { if(line_flag==0) { count1++; } } } void Lcd_Proc(void) { if(lcd_page==0) { LCD_DisplayStringLine(Line4,(uint8_t*)" Hello World! "); } if(lcd_page==1) {//在同一页中使用line_flag变量来区分不同行的选项 if(line_flag==0) LCD_SetBackColor(Green); else LCD_SetBackColor(Black); sprintf(buf," count1:%03d ",count1); LCD_DisplayStringLine(Line3,(uint8_t*)buf); if(line_flag==1) LCD_SetBackColor(Green); else LCD_SetBackColor(Black); sprintf(buf," count2:%03d ",count2); LCD_DisplayStringLine(Line4,(uint8_t*)buf); if(line_flag==2) LCD_SetBackColor(Green); else LCD_SetBackColor(Black); sprintf(buf," count3:%03d ",count3); LCD_DisplayStringLine(Line5,(uint8_t*)buf); } if(lcd_page==2) { LCD_DisplayStringLine(Line4,(uint8_t*)"page_3"); } }
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/artlessist/p/18867043
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
浙公网安备 33010602011771号