[方案相关] 【HC32L196PCTA测评】+ TFT屏显示篇

[复制链接]
2347|5
 楼主| jinglixixi 发表于 2023-8-11 21:53 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-8-11 21:58 编辑

#申请原创# @21小跑堂
在色彩显示方面TFT屏有着较好地性能,这里使用的是一款2.2寸显示屏,其显示分辨率为240*320像素点,它采用SPI方式工作。
TFT显示屏与开发板的连接关系为:
CS ---PE12
RST---PE3
DC ---PE4
SDA---PA12
SCL---PA11
BL ---PE5
TFT显示屏所用引脚的配置函数为:
  1. void tft_gpio(void)
  2. {
  3.     stc_gpio_cfg_t stcGpioCfg;
  4.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  5.     stcGpioCfg.enDir = GpioDirOut;
  6.     stcGpioCfg.enPu = GpioPuDisable;
  7.     stcGpioCfg.enPd = GpioPdEnable;
  8.     Gpio_Init(GpioPortA, GpioPin11, &stcGpioCfg);
  9.     Gpio_Init(GpioPortA, GpioPin12, &stcGpioCfg);
  10.     Gpio_Init(GpioPortE, GpioPin3, &stcGpioCfg);
  11.     Gpio_Init(GpioPortE, GpioPin4, &stcGpioCfg);
  12.     Gpio_Init(GpioPortE, GpioPin5, &stcGpioCfg);
  13.     Gpio_Init(GpioPortE, GpioPin12, &stcGpioCfg);
  14. }
各引脚输出高低电平的引脚定义为:
#define LCD_CS_High()     Gpio_SetIO(GpioPortE,GpioPin12)    //CS
#define LCD_CS_Low()     Gpio_ClrIO(GpioPortE, GpioPin12)
#define LCD_REST_High()   Gpio_SetIO(GpioPortE,GpioPin3)     //RES
#define LCD_REST_Low()    Gpio_ClrIO(GpioPortE,GpioPin3)
#define LCD_DC_High()     Gpio_SetIO(GpioPortE,GpioPin4)     //DC
#define LCD_DC_Low()     Gpio_ClrIO(GpioPortE, GpioPin4)
#define LCD_SDI_High()    Gpio_SetIO(GpioPortA,GpioPin12)    //DIN
#define LCD_SDI_Low()     Gpio_ClrIO(GpioPortA, GpioPin12)
#define LCD_SCK_High()    Gpio_SetIO(GpioPortA, GpioPin11)    //CLK
#define LCD_SCK_Low()     Gpio_ClrIO(GpioPortA,GpioPin11)
#define LCD_LED_High()    Gpio_SetIO(GpioPortE,GpioPin5)     //BLK
#define LCD_LED_Low()     Gpio_ClrIO(GpioPortE,GpioPin5)

TFT显示屏模拟SPI方式字节数据的函数为:
  1. void LCD_Writ_Bus(unsigned char com)
  2. {
  3.   unsigned char uci;
  4.   for(uci=0;uci<8;uci++)
  5.   {
  6.      if(com & 0x80)
  7.      {
  8.         LCD_SDI_High();
  9.      }
  10.      else
  11.      {
  12.       LCD_SDI_Low();
  13.      }
  14.      com = com << 1;
  15.      delay_1us(1);
  16.      LCD_SCK_Low();
  17.      delay_1us(1);
  18.      LCD_SCK_High();
  19.      delay_1us(1);
  20.   }
  21. }

实现以色彩清除屏幕的函数为:
  1. void LCD_Clear(unsigned int Color)
  2. {
  3.      char VH,VL;
  4.      unsigned int i,j;
  5.      VH=Color>>8;
  6.      VL=Color;        
  7.      Address_set(0,0,LCD_W-1,LCD_H-1);
  8.      for(i=0;i<LCD_W;i++)
  9.      {
  10.        for (j=0;j<LCD_H;j++)
  11.        {
  12.           LCD_WR_DATA8(VH);
  13.           LCD_WR_DATA8(VL);        
  14.        }
  15.      }
  16. }

实现图标显示的函数为:
  1. void show_tb(unsigned int x,unsigned int y,unsigned int n)
  2. {
  3.   unsigned int i,j,k;
  4.   unsigned int da;
  5.   k=0;
  6.   for(i=0;i<50;i++)
  7.   {
  8.     for(j=0;j<50;j++)
  9.     {
  10.        if(n==0) da=gImage_tb[k*2];
  11.        ...
  12.        da=da<<8;
  13.        if(n==0) da|=gImage_tb[k*2+1];
  14.        ...
  15.        POINT_COLOR=da;
  16.        LCD_DrawPoint(x-j,y+i);
  17.        k++;
  18.     }
  19.   }
  20. }

实现满屏图像显示的函数为:
  1. void show_pic(const unsigned char *p)
  2. {
  3.     int i,j;
  4.     unsigned char picH,picL;
  5.     Address_set(0,0,LCD_W-1,LCD_H-1);
  6.     for(i=0;i<240;i++)
  7.     {
  8.       for(j=0;j<320;j++)
  9.       {
  10.             picH=*p++;
  11.             picL=*p++;
  12.             LCD_WR_DATA8(picH);
  13.             LCD_WR_DATA8(picL);
  14.       }
  15.   }
  16. }

实现字符串显示的函数为:
  1. void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
  2. {
  3.     while(*p!='\0')
  4.     {      
  5.         if(x>LCD_W-16){x=0;y+=16;}
  6.         if(y>LCD_H-16){y=x=0;}
  7.         LCD_ShowChar(x,y,*p,0);
  8.         x+=8;
  9.         p++;
  10.     }
  11. }

进行TFT显示屏驱动测试的主程序为:
  1. int32_t main(void)
  2. {
  3.     App_LedInit();
  4.     tft_gpio();
  5.     tft_Init();
  6.     BACK_COLOR=YELLOW;
  7.     POINT_COLOR=RED;
  8.     LCD_Clear(YELLOW);
  9.     LCD_ShowString(80,30,"HC32L196");
  10.     show_tb(60,20,0);
  11.     delay1ms(2000);
  12.     show_pic(gImage_123);
  13.     while(1)
  14.     {
  15.         Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
  16.         delay1ms(1000);
  17.         Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
  18.         delay1ms(1000);
  19.     }
  20. }

经程序的编译与下载,其显示效果如图1和图2所示。
1.jpg
1 图像显示效果

2.jpg
2 图标及字符串显示效果


在添加汉字显示函数的情况下,可实现汉字的输出显示,其函数内容为:
  1. void showhanzi16(unsigned int x,unsigned int y,unsigned char index)        
  2. {
  3.         unsigned char i,j,k;
  4.         unsigned char *temp=hanzi16;
  5.         temp+=index*32;
  6.         for(j=0;j<16;j++)
  7.         {
  8.                 Lcd_SetXYP(x,y+j); //LCD_SetCursor(x,y+j);
  9.                 for(k=0;k<2;k++)
  10.                 {
  11.                         for(i=0;i<8;i++)
  12.                         {
  13.                                  if((*temp&(1<<i))!=0)
  14.                                 {
  15.                                         LCD_WR_DATA(POINT_COLOR);
  16.                                 }
  17.                                 else
  18.                                 {
  19.                                         LCD_WR_DATA(BACK_COLOR);
  20.                                 }
  21.                         }
  22.                         temp++;
  23.                 }
  24.          }
  25. }

在添加按键处理的情况下,可实现选择处理功能。
对按键使用引脚的配置函数为:
  1. void App_keyInit(void)
  2. {
  3.     stc_gpio_cfg_t stcGpioCfg;
  4.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  5.     stcGpioCfg.enDir = GpioDirIn;
  6.     stcGpioCfg.enPu = GpioPuEnable;
  7.     stcGpioCfg.enPd = GpioPdDisable;
  8.     Gpio_ClrIO(GpioPortA, GpioPin7);
  9.     Gpio_Init(GpioPortA, GpioPin7, &stcGpioCfg);
  10. }

实现汉字歌单选取功能的主程序为:
  1. int32_t main(void)
  2. {
  3.     int8_t i=0;
  4.     App_LedInit();
  5.     tft_gpio();
  6.     tft_Init();
  7.     BACK_COLOR=BLACK;
  8.     POINT_COLOR=RED;
  9.     LCD_Clear(BLACK);
  10.     show_tb(50,1,0);
  11.     LCD_DrawLine(0, 1, 239, 1);
  12.     LCD_DrawLine(50, 1, 50, 51);
  13.     LCD_DrawLine(0, 51, 239, 51);
  14.     LCD_DrawLine(0, 295, 239, 295);
  15.     POINT_COLOR=YELLOW;
  16.     showhanzi16(40,70,20);
  17.     showhanzi16(60,70,21);
  18.     showhanzi16(40,95,22);
  19.     showhanzi16(60,95,23);
  20.     showhanzi16(40,115,30);
  21.     showhanzi16(60,115,31);
  22.     showhanzi16(80,115,32);
  23.     showhanzi16(100,115,33);
  24.     showhanzi16(40,135,34);
  25.     showhanzi16(60,135,35);
  26.     showhanzi16(40,155,40);
  27.     showhanzi16(60,155,41);
  28.     showhanzi16(80,155,42);
  29.     showhanzi16(40,175,5);
  30.     showhanzi16(60,175,6);
  31.     showhanzi16(80,175,7);
  32.     showhanzi16(40,195,0);
  33.     showhanzi16(60,195,1);
  34.     showhanzi16(80,195,2);
  35.     showhanzi16(100,195,3);
  36.     showhanzi16(120,195,4);
  37.     showhanzi16(40,215,8);
  38.     showhanzi16(60,215,9);
  39.     showhanzi16(40,235,10);
  40.     showhanzi16(60,235,11);
  41.     POINT_COLOR=RED;
  42.     showhanzi16(18,71,28);
  43.     LCD_ShowString(80,20,"MP3 Player");
  44.     LCD_ShowString(50,301,"BY: jinglixixi");
  45.     App_keyInit();
  46.     while(1)
  47.     {
  48.         if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)

经程序的编译与下载,其显示效果如图3和图4所示。
3.jpg
3 中文显示效果

4.jpg
4 歌单选取效果




juventus9554 发表于 2023-8-11 22:16 | 显示全部楼层
支持,回头试试
helloheoo 发表于 2024-8-12 17:20 | 显示全部楼层
楼主,我也用的模拟的SPI,但是屏幕刷新的特别慢,你知道是什么原因吗
caigang13 发表于 2024-8-13 07:39 来自手机 | 显示全部楼层
想当年MP4刚出来的时候就是用的TFT LCD,那画质满满的回忆感。
21mengnan 发表于 2024-8-13 08:55 | 显示全部楼层
用硬件SPI试试看,是不是刷新更快。
chenjun89 发表于 2024-8-14 08:07 来自手机 | 显示全部楼层
你这个还是用的IIC通信的哇
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部