目录
配置工作:
移植官方LCD驱动:
将比赛提供的液晶显示工程中这三个文件复制到自己的工程中
配置cubeMX:
重新配置LED,SYS上传代码时钟树
配置Keil:
配置工程
添加路径
在主文件中添加头文件
添加微库
测试一下,显示相关字符
关键代码:
/* 创建一个长度为 50 的字符数组 text */
uint8_t text[50];
uint8_t i=5;
/* 格式化并存储字符串 " DATE " 到 text 中 */
sprintf(text, " DATE ");
/* 在第一行显示 text 中的内容 */
LCD_DisplayStringLine(Line1, (unsigned char *)text);
/* 格式化并存储字符串 " CNBR:%d " 到 text 中,并将变量 i 的值填充到字符串中 */
sprintf(text, " CNBR:%d ",i);
/* 在第九行显示 text 中的内容 */
LCD_DisplayStringLine(Line9, (unsigned char *)text);
小试牛刀:
LCD与按键联动,通过按键进行LCD页面切换:
user.c
#include "user.h" // 包含用户定义的头文件
u8 ui=1; // 声明并初始化全局变量 ui 为 1,用于控制用户界面的切换
void KEY_proc() // 处理按键事件的函数
{
// 对四个按键进行单击、长按、双击的处理
if(single_key_flag[0]==1) // 按键1单次按下
{
ui+=1; // 控制 LCD 显示切换用户界面
if(ui>=3) ui=1; // 界面循环切换,保证 ui 的值在 1 和 2 之间循环
single_key_flag[0]=0; // 标志位清零,表示按键处理完成
}
// // 类似处理按键2、3、4的单击、长按、双击情况
// // 略...
}
u32 lcd_tick=0; // 声明全局变量 lcd_tick,用于控制 LCD 显示的更新频率
u8 text[50]; // 声明字符数组 text,用于存储要在 LCD 上显示的文本信息
void Disp_proc () // LCD 显示处理函数
{
if(uwTick-lcd_tick<100) // 控制 LCD 显示的更新频率
return; // 如果更新频率小于 100ms,则不更新 LCD 显示
lcd_tick=uwTick; // 更新 lcd_tick 的值为当前系统时钟计数
if(ui==1) // 当前用户界面为 1
{
uint8_t i=5; // 设置变量 i 的值为 5
sprintf(text, " DATE "); // 将字符串 " DATE " 格式化并存储到 text 中
LCD_DisplayStringLine(Line1, (unsigned char *)text); // 在第一行显示 text 中的内容
sprintf(text, " CNBR:%d ",i); // 将格式化后的 " CNBR:%d " 字符串中的 %d 替换为变量 i 的值
LCD_DisplayStringLine(Line9, (unsigned char *)text); // 在第九行显示 text 中的内容
}
if(ui==2) // 当前用户界面为 2
{
uint8_t j=7; // 设置变量 j 的值为 7
sprintf(text, " Para "); // 将字符串 " Para " 格式化并存储到 text 中
LCD_DisplayStringLine(Line1, (unsigned char *)text); // 在第一行显示 text 中的内容
sprintf(text, " CNBR:%d ",j); // 将格式化后的 " CNBR:%d " 字符串中的 %d 替换为变量 j 的值
LCD_DisplayStringLine(Line9, (unsigned char *)text); // 在第九行显示 text 中的内容
}
}
KEY_proc 函数用于处理按键事件,根据按键的状态判断并执行相应的操作,其中按下按键1会切换用户界面的显示;Disp_proc 函数用于控制 LCD 显示的内容,根据当前用户界面的选择,更新 LCD 上显示的信息。
user.h
#ifndef __USER_H // 如果未定义宏 __USER_H,则执行下面的代码
#define __USER_H // 定义宏 __USER_H,防止头文件被重复引用
#include "main.h" // 包含主头文件 main.h,其中定义了通用的系统配置和功能
#include "lcd.h" // 包含 LCD 相关的头文件 lcd.h,用于 LCD 的初始化和显示功能
#include "key.h" // 包含按键相关的头文件 key.h,用于处理按键事件
#include "led.h" // 包含 LED 相关的头文件 led.h,用于控制 LED 灯的亮灭
void KEY_proc(void); // 声明按键处理函数 KEY_proc,用于处理按键事件
void Disp_proc(void); // 声明显示处理函数 Disp_proc,用于控制 LCD 显示的内容
#endif // 结束宏定义的条件编译,防止头文件被重复引用
main.c
int main(void)
{
/* USER CODE BEGIN 1 */ // 在这里插入用户自定义的代码段1
/* USER CODE END 1 */ // 用户自定义的代码段1结束
/* MCU Configuration--------------------------------------------------------*/ // MCU 配置
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ // 复位所有外设,初始化 Flash 接口和 SysTick 定时器
HAL_Init(); // HAL 库初始化
/* USER CODE BEGIN Init */ // 用户自定义的代码段2开始
/* USER CODE END Init */ // 用户自定义的代码段2结束
/* Configure the system clock */ // 配置系统时钟
SystemClock_Config(); // 调用系统时钟配置函数
/* USER CODE BEGIN SysInit */ // 用户自定义的代码段3开始
/* USER CODE END SysInit */ // 用户自定义的代码段3结束
/* Initialize all configured peripherals */ // 初始化所有配置的外设
MX_GPIO_Init(); // 初始化 GPIO 外设
MX_TIM3_Init(); // 初始化定时器 TIM3
MX_TIM16_Init(); // 初始化定时器 TIM16
MX_TIM17_Init(); // 初始化定时器 TIM17
/* USER CODE BEGIN 2 */ // 用户自定义的代码段4开始
LED_disp (0); // 调用 LED 显示函数,将 LED 初始状态设置为关闭
HAL_TIM_Base_Start_IT(&htim3); // 启动 TIM3 定时器的基本定时器模式并启用定时器中断
LCD_Init(); // LCD 初始化
HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); // 启动 TIM16 定时器的 PWM 模式,并启用通道1
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); // 启动 TIM17 定时器的 PWM 模式,并启用通道1
/* USER CODE END 2 */ // 用户自定义的代码段4结束
/* Infinite loop */ // 无限循环
/* USER CODE BEGIN WHILE */ // 用户自定义的代码段5开始
LCD_Clear(Black); // 清屏,将背景色设置为黑色
LCD_SetBackColor(Black); // 设置背景色为黑色
LCD_SetTextColor(White); // 设置文本颜色为白色
while (1) // 进入无限循环
{
/* USER CODE END WHILE */ // 用户自定义的代码段5结束
/* USER CODE BEGIN 3 */ // 用户自定义的代码段6开始
KEY_proc(); // 处理按键事件
Disp_proc (); // 控制 LCD 显示内容
}
/* USER CODE END 3 */ // 用户自定义的代码段6结束
}
效果演示:
蓝桥杯嵌入式LCD效果演示