开发板:国信长天CT117E(STM32F103RBT6)
环 境 :标准库 V3.5 官方LCD模板
软 件 :Keil-MDK 4
文章目录
1. STM3210B_LCD_Init() 初始化LED相关IO并对液晶进行初始化
3. LCD_SetTextColor(Blue) 显示文字的背景色
4. LCD_SetTextColor(White) 设置字体颜色
5. LCD_DisplayStringLine(Line2, u8 *ptr) 在指定行显示字符串
前言
因为CT117E开发板板载了一块2.4寸TFT彩屏,然后STM32可以通过对这块屏幕控制芯片的读写来让这个屏幕显示我们想要的数据、图案,或者从屏幕上放一些我们的数据等。
一、LCD液晶屏电路
原理图主要由两部分,一部分是控制管脚,另一部分是数据管脚。首先来看控制管脚:
控制主要是通过LCD CS#,RS,WR#,RD#,RESET#实现。如果需要写数据则需通过LD0-7 以及 HD0-7 实现。下面看这些管脚如何与STM32进行连接:
控制管脚分别 对应PB的几个口,即 PB9、PB8、PB5、PB10,而数据位则对应了PC口的所有管脚,从PC0到PC15。然后这个屏幕的寄存器还设计伽马之类的东西所以不用详细了解...
一些须知:
- 2.4寸TFT液晶彩屏
- 分辨率240*320,26.2万色(18位颜色)
- 掌握LCD驱动的操作即可
二、LCD编程操作方法
LCD 显示的原型是这个函数
-
int sprintf(char *buffer, const char *format, [argument] ... );
buffer
char型指针,指向要写入的字符串的缓冲区
比如定义一个十个字节的数组,把后面需要格式化的数组放进这个缓冲区即可
format
格式化字符串
argument
可选参数,可以是任何类型的数据
具体如何使用如下:
- 显示 EEPROM 数据的函数
void Display_Eeprom(u8 eeprom_val)
{
uint8_t temp[20];
sprintf(temp,"eeprom val:%d",eeprom_val);
LCD_DisplayStringLine(Line1,temp);
}
这是一个显示EEPROM数据的函数,其输入是一个u8类型的数据,即0-255。这里定义了一个缓存区temp[20],然后通过 sprintf ,通过 %d 格式化数据我们就可以把 eeprom_val 字符串写入temp缓冲区中,然后调用液晶屏的显示函数来显示一行。这样就完成了一个无符号整型的格式化。
- 显示一个 AD 数据的函数
void Display_Eeprom(u8 eeprom_val)
{
uint8_t temp[20];
sprintf(temp,"eeprom val:%d",eeprom_val);
LCD_DisplayStringLine(Line1,temp);
}
同样的,我们也可以进行小数的格式化。比如这里。缓冲区作为局部变量名字一样比较方便。
-
LCD操作常用函数
1. STM3210B_LCD_Init() 初始化LED相关IO并对液晶进行初始化
/*******************************************************************************
* Function Name : STM3210B_LCD_Init
* Description : Initializes the LCD.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void STM3210B_LCD_Init(void)
{
LCD_CtrlLinesConfig();
dummy = LCD_ReadReg(0);
if(dummy == 0x8230){
REG_8230_Init();
}
else{
REG_932X_Init();
}
dummy = LCD_ReadReg(0);
}
首先 LCD_CtrlLinesConfig() 是对GPIO进行时钟及速率的初始化。
然后读取LCD的寄存器芯片数据到变量 dummy,并对其进行配置。
2. LCD_Clear(White) 多种颜色清屏操作
/*******************************************************************************
* Function Name : LCD_Clear
* Description : Clears the hole LCD.
* Input : Color: the color of the background.
* Output : None
* Return : None
*******************************************************************************/
void LCD_Clear(u16 Color)
{
u32 index = 0;
LCD_SetCursor(0x00, 0x0000);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 76800; index++)
{
LCD_WriteRAM(Color);
}
}
可以自己写 0x000 - 0xFFF 之间的颜色。可选的颜色有:
White、Black、Grey、Blue、Blue2、Red、Magenta、Green、Cyan、Yellow
3. LCD_SetTextColor(Blue) 显示文字的背景色
/*******************************************************************************
* Function Name : LCD_SetBackColor
* Description : Sets the Background color.
* Input : - Color: specifies the Background color code RGB(5-6-5).
* Output : - BackColor: Background color global variable used by
* LCD_DrawChar and LCD_DrawPicture functions.
* Return : None
*******************************************************************************/
void LCD_SetBackColor(vu16 Color)
{
BackColor = Color;
}
4. LCD_SetTextColor(White) 设置字体颜色
/*******************************************************************************
* Function Name : LCD_SetTextColor
* Description : Sets the Text color.
* Input : - Color: specifies the Text color code RGB(5-6-5).
* Output : - TextColor: Text color global variable used by LCD_DrawChar
* and LCD_DrawPicture functions.
* Return : None
*******************************************************************************/
void LCD_SetTextColor(vu16 Color)
{
TextColor = Color;
}
5. LCD_DisplayStringLine(Line2, u8 *ptr) 在指定行显示字符串
/*******************************************************************************
* Function Name : LCD_DisplayStringLine
* Description : Displays a maximum of 20 char on the LCD.
* Input : - Line: the Line where to display the character shape .
* This parameter can be one of the following values:
* - Linex: where x can be 0..9
* - *ptr: pointer to string to display on LCD.
* Output : None
* Return : None
*******************************************************************************/
void LCD_DisplayStringLine(u8 Line, u8 *ptr)
{
u32 i = 0;
u16 refcolumn = 319;//319;
while ((*ptr != 0) && (i < 20)) // 20
{
LCD_DisplayChar(Line, refcolumn, *ptr);
refcolumn -= 16;
ptr++;
i++;
}
}
第一个变量,在哪一行写。一共有9行,这里变量名可填 Line0 - Line9
第二个是一个指针, 是可以指向缓冲区的一个 ptr 。经 sprintf 初始化,可以直接进行显示。
-
LCD中一些寄存器简介
有时候在写函数中,可能不会调用库函数,直接写寄存器以让其执行效率更高。因为LCD的操作一般比较高速,直接写寄存器的效率会比库函数高很多
打开参考手册 P145 查看即可
三、LCD官方库的使用
1. 简单操作与测试
引入库
#include "lcd.h"
#include "stdio.h"
添加函数
// LCD
void Display_AD(float ad_val)
{
uint8_t temp[20];
sprintf(temp,"ad val:%.2f",ad_val);
LCD_DisplayStringLine(Line2,temp);
}
void Display_Eeprom(u8 eeprom_val)
{
uint8_t temp[20];
sprintf(temp,"eeprom val:%d",eeprom_val);
LCD_DisplayStringLine(Line1,temp);
}
初始化
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
在 I2C 初始化后显示
Display_Eeprom(123);
Display_AD(3.21);
2. 按键增减变量并存储至EEPROM
定义一共无符号整数变量,将其显示在LCD屏上,通过按键可以实现变量的增减,同时把变量存储到EEPROM中,该变量范围是 0 - 65535
KB1:变量每次增加 1
KB2:变量每次减小 1
KB3:变量每次增加 100
KB4:变量每次减小 100
思路:
首先我们需要定义一个 u16 类型的变量,因为范围是 0 - 65535,赋初值为 0
u16 eeprom_val =0;
然后在while中进行按键操作,并做数据限制
/* Key Read */
if(key_flag) // 10ms
{
key_flag = 0;
// key threeline
Key_Read_Threeline();
if(Trg == 0x01) // KB1 pressed
{
Buzzer_ON();
if(eeprom_val < 65535)
eeprom_val += 1;
}
if(Trg == 0x02) // KB2 pressed
{
Buzzer_OFF();
if(eeprom_val > 0)
eeprom_val -= 1;
}
if(Trg == 0x04) // KB3 pressed
{
LED_Controls(0xff,1);
if(eeprom_val < 65436)
eeprom_val += 100;
}
if(Trg == 0x08)
{
LED_Controls(0xff,0);
if(eeprom_val > 99)
eeprom_val -= 100;
}
}
然后调用函数进行显示,将函数改为u16类型
Display_Eeprom(eeprom_val);
同时修改格式化,以避免残影
void Display_Eeprom(u16 eeprom_val)
{
uint8_t temp[20];
sprintf(temp,"eeprom val:%5d",eeprom_val);
LCD_DisplayStringLine(Line1,temp);
}
然后需要将 eeprom_val 存储进 EEPROM 中。我们记得 EEPROM 一个单元最多存储 255,那么为存储 0 - 65535 需要将数据分为低八位和高八位。
由于 EEPROM 的写入寿命是有限的,因此我们仅在按键按下后对其进行写操作。我们在按键后新增判断,然后调用写入函数。同时进行高低8位的分离,记高八位地址位 0x10,低8位地址为 0x11
但是看AT24C02数据手册,每次写入间隔至少要5ms,因此这里加入延时,稍微浪费点吧
if(Trg)
{
Write_AT24c02(0x10, eeprom_val/256);
Delay_Ms(5);
Write_AT24c02(0x11, eeprom_val%256);
}
同时在i2C初始化后对EEPROM进行读操作
eeprom_val = Read_AT24c02(0x10);
eeprom_val = eeprom_val*256 + Read_AT24c02(0x11);
总的来说,判断范围、sprintf格式化位数、EEPROM读写间隔
总结
本文仅仅简单介绍CT117E LCD操作