显示器件的类型有多种多样,前面介绍了I2C接口的OLED屏显示驱动,这次再介绍一种SPI接口的TFT屏显示驱动。
该显示屏为彩色显示屏,其分辨率为240*320像素点,可实现对图形或图像的显示处理。
为原打算使用硬件的方式来实现,但经测试尚未达到目标,只好先以模拟的方式来实现,后面再以此为基础改造成硬件的方式来实现。
在实现过程中,以软件的方式进行显示屏的复位,对时序的要求较高,且需要占用相应的引脚资源,为此可使用复位引脚以硬件方式来复位。
TFT屏与开发板的连接关系为:
CS ---PB0
DC---PB4
SDI---PC2
SCK---PC1
BLK---PB3
RST---REST
对所用引脚的配置函数为:
<pre>void tft_config(void)
{
PC1_INIT(PC1_GPIO);
PC2_INIT(PC2_GPIO);
PC->DIR_b.DIR1 = 0x1;
PC->DIR_b.DIR2 = 0x1;
PB0_INIT(PB0_GPIO);
PB3_INIT(PB3_GPIO);
PB4_INIT(PB4_GPIO);
PB->DIR_b.DIR0 = 0x1;
PB->DIR_b.DIR3 = 0x1;
PB->DIR_b.DIR4 = 0x1;
}</pre>复制代码
为便于控制高低电平的输出,对引脚的输出语句定义如下:
#define LCD_CS_High() PB->SET_b.SET0=1
#define LCD_CS_Low() PB->CLR_b.CLR0=1
#define LCD_DC_High() PB->SET_b.SET4=1
#define LCD_DC_Low() PB->CLR_b.CLR4=1
#define LCD_SDI_High() PC->SET_b.SET2=1
#define LCD_SDI_Low() PC->CLR_b.CLR2=1
#define LCD_SCK_High() PC->SET_b.SET1=1
#define LCD_SCK_Low() PC->CLR_b.CLR1=1
#define LCD_LED_High() PB->SET_b.SET3=1
#define LCD_LED_Low() PB->CLR_b.CLR3=1
对显示屏的初始化函数为:
<pre>void tft_Init(void)
{
LCD_CS_Low();
LCD_WR_REG(0xCB);
LCD_WR_DATA8(0x39);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x34);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0xCF);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0XC1);
LCD_WR_DATA8(0X30);
LCD_WR_REG(0xE8);
LCD_WR_DATA8(0x85);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0xEA);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xED);
LCD_WR_DATA8(0x64);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0X12);
LCD_WR_DATA8(0X81);
LCD_WR_REG(0xF7);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xC5);
LCD_WR_DATA8(0x3e);
LCD_WR_DATA8(0x28);
LCD_WR_REG(0xC7);
LCD_WR_DATA8(0x86);
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x88);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x55);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x18);
LCD_WR_REG(0xB6);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x82);
LCD_WR_DATA8(0x27);
LCD_WR_REG(0xF2);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x26);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x4E);
LCD_WR_DATA8(0xF1);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0XE1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0xC1);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0x11);
SYS_Delay(260);
LCD_WR_REG(0x29);
LCD_WR_REG(0x2c);
LCD_LED_High();
}</pre>复制代码
实现指定色彩擦除屏幕的函数为:
<pre>void LCD_Clear(unsigned int Color)
{
char VH,VL;
unsigned int i,j;
VH=Color>>8;
VL=Color;
Address_set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA8(VH);
LCD_WR_DATA8(VL);
}
}
}</pre>复制代码
实现显示驱动测试的主程序为:
<pre>int main(void)
{
PB12_INIT(PB12_GPIO);
PB->DIR_b.DIR12 = 0x1;
tft_config();
tft_Init();
LCD_Clear(BLACK);
SYS_Delay(0x4FFFF);
LCD_Clear(BLUE);
SYS_Delay(0x4FFFF);
LCD_Clear(GREEN);
SYS_Delay(0x4FFFF);
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_DrawLine(0, 24, 239, 24);
LCD_DrawLine(0, 300, 239, 300);
LCD_ShowString(20,4,"ME32G030");
LCD_ShowString(20,40,"2.2' TFT");
LCD_ShowString(20,302,"2025-4-30");
while(1)
{
PB->NOT_b .NOT12 =1;
SYS_Delay(0x4FFFF);
}
}</pre>复制代码经程序的编译和下载,其测试效果如下图所示。
测试效果图