STM32的GPIO_蓝桥杯LCD屏幕实验_驱动文件的使用

LCD简介

LCD显示原理

  • 液晶显示原理

    液晶在未加电场时透明,加电场后浑浊(无法反射所有光线从而显像)

  • LCD显示器工作原理

    把显示面板分为很多小栅格,每个格栅都由一个电极控制,通过改变电极就能控制格栅内液晶的排列,从而控制光路的导通

    显然,像控制数码管一样亲自配置引脚去控制每一个电极是不现实的,这就需要借助厂商提供的驱动来使用LCD

LCD的GPIO引脚配置

  • LCD的GPIO引脚连接

    开发板上的LCD_HDR-M-2.54共有30个引脚,如图

    image

    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的驱动导入

  • 后续使用其他驱动时步骤是相同的
  1. 复制文件

    将蓝桥杯嵌入式资源包提供的LCD驱动fonts.hlcd.h文件复制到自己工程的Core文件夹的Inc文件夹下

    led.c复制到自己工程的Core文件夹的Src文件夹中

  2. 在工程中导入

    进入Keil软件中打开自己的工程,单击工具栏上三个方块堆成三角的Manage Project Items按键,打开窗口后在中间的Grops一栏选择Application/User,单击右下角Add Files按键,添加Src文件夹中lcd.c文件,最后在右侧的Files一栏中选择刚刚添加的lcd.c,点OK

  3. 引入头文件

    main.c中加入一行#include "lcd.h"

  4. 开始调用函数

    上述准备完成之后,就能调用驱动提供的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");
    	}
    }
    

posted on 2025-05-08 19:54  无术师  阅读(220)  评论(0)    收藏  举报