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

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-Line9ptr 要显示的字符串,长度为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){    //切换需要计数的lineif(++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);elseLCD_SetBackColor(White);sprintf(buf,"       cout1:%03d      ",count1);LCD_DisplayStringLine(Line3,(uint8_t*)buf);if(line_flag==1)LCD_SetBackColor(Green);elseLCD_SetBackColor(White);sprintf(buf,"       cout2:%03d      ",count2);LCD_DisplayStringLine(Line4,(uint8_t*)buf);if(line_flag==2)LCD_SetBackColor(Green);elseLCD_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.lryc.cn/news/528887.html

相关文章:

  • 【redis进阶】分布式锁
  • 园区管理系统如何提升企业核心竞争力与资产管理智能化水平
  • AI大模型开发原理篇-3:词向量和词嵌入
  • 高精度算法:高精度减法
  • Java创建项目准备工作
  • 基于STM32的智能宠物喂食器设计
  • 在线课堂小程序设计与实现(LW+源码+讲解)
  • 为AI聊天工具添加一个知识系统 之77 详细设计之18 正则表达式 之5
  • 【Elasticsearch】 索引模板 ignore_missing_component_templates
  • Github 2025-01-29 C开源项目日报 Top10
  • 文件上传2
  • Unity敌人逻辑笔记
  • 高级编码参数
  • DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力
  • leetcode——合并K个有序链表(java)
  • 【Valgrind】安装报错: 报错有未满足的依赖关系: libc6,libc6-dbg
  • vue3和vue2的区别有哪些差异点
  • 论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)
  • NPM 使用介绍
  • http3网站的设置(AI不会配,得人工配)
  • Vue+Echarts 实现青岛自定义样式地图
  • Java教程练习:学生信息管理系统
  • 书生大模型实战营4
  • 麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例
  • 8. 网络编程
  • C++并发编程指南04
  • 常见的同态加密算法收集
  • 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用
  • 记录 | Docker的windows版安装
  • AI智慧社区--生成验证码