[STM32H5] 【NUCLEO- H563ZI 测评】+TFT屏显示与图像显示

[复制链接]
925|3
 楼主| jinglixixi 发表于 2023-7-21 10:28 | 显示全部楼层 |阅读模式
#申请原创#

NUCLEO- H563ZI开发板是一款近于最小系统的开发工具,为此为它配置一个显示器件是十分必要,这样就有了一个人机交互的桥梁。
这里所配置的显示屏是一款2.2寸的TFT显示屏,其显示分辨率为240*320像素点,该显示屏以SPI方式工作。
为了省去线路连接的麻烦,显示屏是通过开发板的Arduino接口来完成,所使用的引脚如图1所示。
1.jpg
图1 使用引脚

显示屏与开发板的引脚连接关系为:
CS ---PA5
RST---PG9
DC ---PB5
SDA---PD14
SCL---PD15
BL ---PF3


对显示屏所用引脚的配置函数为:
  1. void tft_gpio(void)
  2. {
  3.   __HAL_RCC_GPIOA_CLK_ENABLE();
  4.   __HAL_RCC_GPIOB_CLK_ENABLE();
  5.   __HAL_RCC_GPIOD_CLK_ENABLE();
  6.   __HAL_RCC_GPIOF_CLK_ENABLE();
  7.   __HAL_RCC_GPIOG_CLK_ENABLE();
  8.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  9.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  10.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  11.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  12.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  13.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  14.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  15.   GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
  16.   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  17.   GPIO_InitStruct.Pin = GPIO_PIN_3;
  18.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  19.   GPIO_InitStruct.Pin = GPIO_PIN_9;
  20.   HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  21. }

对使用引脚输出高低电平的语句定义为:
#define LCD_CS_High()   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)    //CS
#define LCD_CS_Low()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define LCD_REST_High() HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_SET)    //RES
#define LCD_REST_Low()  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET)
#define LCD_DC_High()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET)   //DC
#define LCD_DC_Low()    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET)
#define LCD_SDI_High()  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET)    //DIN
#define LCD_SDI_Low()   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET)
#define LCD_SCK_High()  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET)   //CLK
#define LCD_SCK_Low()   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET)
#define LCD_LED_High()  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_SET)    //BLK
#define LCD_LED_Low()   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_RESET)


在GPIO口模拟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 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. }

用于显示满屏图像的显示函数为:
  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. int main(void)
  2. {
  3.   HAL_Init();
  4.   SystemClock_Config();
  5.   MX_GPIO_Init();
  6.   MX_ICACHE_Init();
  7.   LED1_GPIO_CLK_ENABLE();
  8.   LED2_GPIO_CLK_ENABLE();
  9.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  10.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  12.   GPIO_InitStruct.Pin = LED1_PIN;
  13.   HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
  14.   GPIO_InitStruct.Pin = LED2_PIN;
  15.   HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
  16.   tft_gpio();
  17.   tft_Init();
  18.   BACK_COLOR=YELLOW;
  19.   POINT_COLOR=RED;
  20.   LCD_Clear(YELLOW);
  21.   LCD_ShowString(80,30,"NUCLEO_H563ZI");
  22.   show_tb(60,20,0);
  23.   HAL_Delay(2000);
  24.   show_pic(gImage_123);
  25.   while (1)
  26.   {
  27.       HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
  28.       HAL_Delay(100);
  29.       HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
  30.       HAL_Delay(100);
  31.   }
  32. }

经程序的编译与下载,其显示效果如图2至图4所示。

2.jpg
图2 字符显示效果

3.jpg
图3 图片显示效果

4.jpg
图4  显示细节



数据采集存储 发表于 2023-8-17 17:07 | 显示全部楼层
有没有标准库的驱动,彩屏这部分驱动确实很难弄的。
 楼主| jinglixixi 发表于 2023-8-18 08:24 | 显示全部楼层
应该没有,最好能从商家获得一些资料作为参考。
明天真的好 发表于 2023-8-18 17:00 | 显示全部楼层
楼主可以显示动画吗?我想看看刷新的速度怎么样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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