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        ");
  }
}
相关推荐
来自晴朗的明天2 小时前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
17(无规则自律)2 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
芯岭技术2 小时前
PY32MD310单片机:高性能、低功耗的32位电机控制微控制器
单片机·嵌入式硬件
wotaifuzao3 小时前
STM32 + FreeRTOS 的订阅通知组件架构
stm32·嵌入式硬件·架构·freertos·事件驱动·嵌入式架构
小龙报4 小时前
【51单片机】深度解析 51 串口 UART:原理、配置、收发实现与工程化应用全总结
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·51单片机
Lester_110111 小时前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件
小李独爱秋13 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
梁洪飞15 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
进击的小头15 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
宵时待雨18 小时前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件