嵌入式设计与开发项目-LCD应用程序设计
一、实现的功能
- ①LCD每隔1秒更新一次数据,并把数据显示到屏幕的特定位置;
- ②通过LED1 ~ LED8显示0 ~ 255的数据,每隔1s增加1;
- ③把LED表示的数据实时显示到LCD显示屏上;
二、根据功能实现代码
1、主文件main.c
#include"key.h"
#include"led.h"
#include"lcd.h"
#include"stdio.h"
unsigned char ucSec;
unsigned char pucStr[21];
unsigned long ulTick_ms;
void LCD_Proc(void);
int main(void)
{
SysTick_Config(72000); //定时1ms(HCLK = 72MHz)
KEY_Init();
LED_Init();
STM3210B_LCD_Init(); //初始化LCD屏
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
while(1)
{
LED_Disp(ucSec);
LCD_Proc();
}
}
void LCD_Proc(void)
{
LCD_DisplayChar(Line3,176,ucSec/10+0x30); //0x30表示ASCLL码表中的0
LCD_SetBackColor(Red);
LCD_DisplayChar(Line3,160,ucSec%10+0x30); //取模换算让显示的数字保持在0~9范围内
LCD_SetBackColor(Blue);
pucStr[9] = ucSec/10+0x30;
pucStr[10] = ucSec%10+0x30; //把显示的数据保存到pucStr缓冲区中
LCD_DisplayStringLine(Line5,pucStr);
sprintf((char *)pucStr," %02u ",ucSec); //02 表示不足两位,前面补0输出;如果超过两位,则实际输出
LCD_SetBackColor(Red);
LCD_DisplayStringLine(Line7,pucStr);
LCD_SetBackColor(Blue);
}
//SysTick 中断处理程序
void SysTick_Handler(void)
{
ulTick_ms++;
if(ulTick_ms % 1000 ==0) //每隔1s加1
ucSec++;
}
主函数分析:❤️ ❤️ ❤️
- 使用LCD屏幕前需要①初始化LCD屏幕驱动–>②把LCD屏幕的格式化为特定的颜色–>③设置文件的背景色和字体颜色–>④进行相对应的字符和字符串显示;
- 通过除于10取得数据的十位数,通过对10取模可以得到数据的个位数;
- 熟练使用lcd.h所声明的高层库函数,根据函数名的定义,一般能够知道高层库函数的作用;
- 常用的实时显示数据的方法:使用sprintf()函数把数据按要求封装到pucStr数据中(02u 表示不足两位,前面补0输出;如果超过两位,则实际输出无符号的十进制数值);
- 通过SysTick_Handler(void)函数获取精确的时间;
2、240*320 TFT LCD 的lcd.h头文件
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LCD_H
#define __LCD_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/*----- High layer function -----*/
void STM3210B_LCD_Init(void);
void LCD_SetTextColor(vu16 Color);
void LCD_SetBackColor(vu16 Color);
void LCD_ClearLine(u8 Line);
void LCD_Clear(u16 Color);
void LCD_SetCursor(u8 Xpos, u16 Ypos);
void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c);
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii);
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width);
void LCD_WindowModeDisable(void);
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction);
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width);
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius);
void LCD_DrawMonoPict(uc32 *Pict);
void LCD_WriteBMP(u32 BmpAddress);
void LCD_DrawBMP(u32 BmpAddress);
void LCD_DrawPicture(const u8* picture);
/*----- Medium layer function -----*/
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
u16 LCD_ReadReg(u8 LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
u16 LCD_ReadRAM(void);
void LCD_PowerOn(void);
void LCD_DisplayOn(void);
void LCD_DisplayOff(void);
/*----- Low layer function -----*/
void LCD_CtrlLinesConfig(void);
void LCD_BusIn(void);
void LCD_BusOut(void);
#endif /* __LCD_H */
简要分析:❤️ ❤️
- 在底层库函数中,LCD_CtrlLinesConfig()把TFT LCD与STM32连接的PB9-CS#(片选)、PB8-RS(寄存器选择)、PB5-WR#(写选通)、PB10-RD#(读选通)设置为推挽输出,最后将PB9-CS#(片选)、PB5-WR#(写选通)、PB10-RD#(读选通)设置为高电平;LCD_BusIn()把PC0 ~ PC15(LCD_PD)配置为上拉输入,LCD_BusOut()把PC0 ~ PC15(LCD_PD)配置为通用推挽输出;
- 中层库函数主要用于LCD控制器中寄存器和显示缓冲的读写,需要根据TFT LCD的数据手册要求进行配置,也称为LCD驱动;而高层库函数直接可以调用;
三、实现功能过程的注意与学习点
1、注意点
- 使用各个外设前,需要调用其外设所对应的初始化函数,否则无法正常使用;
2、学习的知识点
1.通过sprintf函数按特定的格式实时更新LCD屏幕上的数据;
2. 通过(“/”、“%”)运算,获得数据各个位的单独数字;
3. 底层的驱动是设置特定的GPIO引脚的高低电平进行通讯的,即操作外设控制器中的寄存器的一些缓冲的读写;
❤️ ❤️ ❤️ ❤️ ❤️ ❤️