显示器件的类型有多种多样,前面介绍了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>
  • 复制代码

    经程序的编译和下载,其测试效果如下图所示。

    image.png

    测试效果图