当前位置: 首页 > article >正文

STM32——LCD

一、引脚配置

查看引脚

将上述引脚都设置为GPIO_Output

二、导入驱动文件

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

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

三、LCD函数

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显示

//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 。

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

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。

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

 


http://www.kler.cn/a/516244.html

相关文章:

  • 19_PlayerPres持久化_创建角色窗口
  • 假期day1
  • Scrapy之一个item包含多级页面的处理方案
  • 观察者模式 - 观察者模式的应用场景
  • C++priority_queue模拟实现
  • 【C++】std::prev用法
  • Spring Boot中选择性加载Bean的几种方式
  • 如何使用 Node.js 构建一个简单的 API?
  • Python语言的安全开发
  • 把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用
  • 打破常规,Linux内核新的数据结构上场maple tree
  • 苍穹外卖—订单模块
  • 由于请求的竞态问题,前端仔喜提了一个bug
  • idea修改模块名导致程序编译出错
  • 【全栈】SprintBoot+vue3迷你商城(3)
  • 谷粒商城——商品服务-三级分类
  • 无界云剪音频教程:提升视频质感
  • 【游戏设计原理】79 - 可变奖励
  • MySQL下载安装DataGrip可视化工具
  • 【GPON实战】7360局端和C300局端流量统计指令
  • 如何实现各种类型的进度条
  • npm、cnpm 、yarn、pnpm的优势点和缺点
  • Prometheus+grafana实践:Doris数据库的监控
  • 30V/3A降压DCDC转换器CP8335封装可适用汽车系统
  • pinctrl子系统
  • Matlab实现TCN-BiLSTM时间卷积神经网络结合双向长短期记忆神经网络多特征分类预测(附模型研究报告)