STM32——LCD

一、引脚配置

查看引脚

将上述引脚都设置为GPIO_Output

二、导入驱动文件

将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。

当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。

三、LCD函数

cpp 复制代码
void LCD_Clear(u16 Color);
功能:清屏,设置整个屏幕颜色
void LCD_SetTextColor(vu16 Color);
功能:设置文本颜色
void LCD_SetBackColor(vu16 Color);
功能:设置文本背景色
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
功能:在指定行显示字符串
参数:Line 行号,共10行  Line0-Line9
   ptr 要显示的字符串,长度为20

**案例:**记录4个按键按下的次数,并在LCD显示

cpp 复制代码
//main.h
/* USER CODE BEGIN EFP */
void Key_Proc(void);
void Lcd_Proc(void);
/* USER CODE END EFP */

//main.c
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */

/* USER CODE BEGIN PV */
uint8_t key_val,key_up,key_down,key_old;
uint8_t B1_count,B2_count,B3_count,B4_count;
char buf[21];
/* USER CODE END PV */

int main(){
  /* USER CODE BEGIN 2 */
  LCD_Init();
  /* USER CODE END 2 */

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Key_Proc();
    Lcd_Proc();
  }
  /* USER CODE END 3 */
}

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){
  B1_count++;
 }
 if(key_down==2){
  B2_count++;
 }
 if(key_down==3){
  B3_count++;
 }
 if(key_down==4){
  B4_count++;
 }
}

void Lcd_Proc(void)
{
 sprintf(buf,"B1_Count:%d",B1_count);
 LCD_DisplayStringLine(Line1,(uint8_t*)buf);
 sprintf(buf,"B2_Count:%d",B2_count);
 LCD_DisplayStringLine(Line2,(uint8_t*)buf);
 sprintf(buf,"B3_Count:%d",B3_count);
 LCD_DisplayStringLine(Line3,(uint8_t*)buf);
 sprintf(buf,"B4_Count:%d",B4_count);
 LCD_DisplayStringLine(Line4,(uint8_t*)buf);
}

四、界面切换

可以设置一个变量 led_page 来记录当前的界面。按键按下时修改界面。

**案例:**做三个界面,B1来切换界面,第一个界面显示 Hello World! 第二个界面显示3个按键按下的次数, 第三个界面显示 page_3 。

在上一小节的代码进行改动:

cpp 复制代码
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){
  //切屏其实就是刷屏然后再写入
  LCD_Clear(Black);
  //先判断,再自加
  if(++lcd_page==3) 
    lcd_page=0;
 }
 if(key_down==2){
  B2_count++;
 }
}

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        ");
  }
}

上面代码有点小问题:如果在page_1的时候就点B2的话,切屏后显示的值为开始点B2的此时了。

五、高亮显示

**案例1:**修改上一个案例的第二个界面( lcd_page==1 ),设置三行,每行各对应一个计数值。

B2按键切换三个计数值,被选中的高亮。

B3按键修改被选中的计数值,令其加1。

cpp 复制代码
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){
  LCD_Clear(Black);
  if(++lcd_page==3) 
    lcd_page=0;
 }
 if(key_down==2 && lcd_page==1){    //切换需要计数的line
  if(++line_flag==3)
    line_flag=0;
 }
 if(key_down==3 && lcd_page==1){    //对指定的line进行计数
  if(line_flag==0){
    count1++;
  }
  if(line_flag==1){
    count2++;
  }
  if(line_flag==2){
    count3++;
  }
 }
}

void Lcd_Proc(void)
{
  if(lcd_page==0){
    LCD_DisplayStringLine(Line4,(uint8_t*)"     Hello World     ");
  }
  if(lcd_page==1){    //选中为绿,否则为白,并把计数显示
    if(line_flag==0)
      LCD_SetBackColor(Green);
    else
      LCD_SetBackColor(White);
      sprintf(buf,"       cout1:%03d      ",count1);
    LCD_DisplayStringLine(Line3,(uint8_t*)buf);

    if(line_flag==1)
      LCD_SetBackColor(Green);
    else
      LCD_SetBackColor(White);
        sprintf(buf,"       cout2:%03d      ",count2);
      LCD_DisplayStringLine(Line4,(uint8_t*)buf);

    if(line_flag==2)
      LCD_SetBackColor(Green);
    else
      LCD_SetBackColor(White);
        sprintf(buf,"       cout3:%03d      ",count3);
      LCD_DisplayStringLine(Line5,(uint8_t*)buf);
    }
  if(lcd_page==2){
    LCD_DisplayStringLine(Line4,(uint8_t*)"       page_3        ");
  }
}
相关推荐
典则14 分钟前
STM32FreeRtos入门(四)——任务状态和调度
stm32·单片机·嵌入式硬件
充哥单片机设计20 分钟前
【STM32项目开源】基于STM32的智能天然气火灾监控
stm32·单片机·嵌入式硬件
充哥单片机设计23 分钟前
【STM32项目开源】基于STM32的智能仓库火灾检测系统
stm32·单片机·嵌入式硬件
就叫飞六吧2 小时前
普中stm32大Dap烧录流程
stm32
A9better3 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机智能路灯控制系统
c语言·stm32·单片机·嵌入式硬件·51单片机
辰哥单片机设计13 小时前
TT直流减速电机(STM32)
stm32
A9better13 小时前
嵌入式开发学习日志36——stm32之USART串口通信前述
stm32·单片机·嵌入式硬件·学习
思诺学长13 小时前
BMS(电池管理系统)的主要功能和架构简述
单片机·嵌入式硬件
czhaii14 小时前
全局不关总中断的 RTOS / CosyOS-II for STCAI MCU
单片机