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