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        ");
  }
}
相关推荐
Devlab6 小时前
LVGL设计大师——网页版anyui来了!!
嵌入式硬件·物联网·低代码·ui·iot
Dr.kangder10 小时前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
zlinear数据采集卡11 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛1392462567311 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
Rocktech_ruixun13 小时前
机器人端侧大模型部署对主板有哪些要求?瑞迅主控板分级方案对比
人工智能·嵌入式硬件·机器人
振南的单片机世界14 小时前
SysTick硬核拆解:既是HAL_Delay的“心跳”,也是RTOS的“节拍器”
arm开发·stm32·单片机·嵌入式硬件
Lzh编程小栈14 小时前
【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集
c语言·stm32·单片机·面试·职场和发展
Rocktech_ruixun15 小时前
机器人数据采集能力取决于什么?瑞迅科技RK3588/3576核心板方案深度解析
人工智能·嵌入式硬件·机器人
水果里面有苹果15 小时前
28-DRV8825PWPR步进电机驱动器
单片机
恒锐丰科技韩生15 小时前
率能 SS6625E|3.0~20V 单通道 H 桥直流电机驱动 SOP8 电子锁玩具机器人分享
嵌入式硬件·硬件工程