- void tft_gpio(void)
- {
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOF_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_3;
- HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_9;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
- }
对使用引脚输出高低电平的语句定义为:
#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通讯的方式下,其发送字节数据的函数为:
- void LCD_Writ_Bus(unsigned char com)
- {
- unsigned char uci;
- for(uci=0;uci<8;uci++)
- {
- if(com & 0x80)
- {
- LCD_SDI_High();
- }
- else
- {
- LCD_SDI_Low();
- }
- com = com << 1;
- delay_1us(1);
- LCD_SCK_Low();
- delay_1us(1);
- LCD_SCK_High();
- delay_1us(1);
- }
- }
实现清屏的功能函数为:
- 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);
- }
- }
- }
实现字符串显示的函数为:
- void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
- {
- while(*p!='\0')
- {
- if(x>LCD_W-16){x=0;y+=16;}
- if(y>LCD_H-16){y=x=0;}
- LCD_ShowChar(x,y,*p,0);
- x+=8;
- p++;
- }
- }
用于显示满屏图像的显示函数为:
- void show_pic(const unsigned char *p)
- {
- int i,j;
- unsigned char picH,picL;
- Address_set(0,0,LCD_W-1,LCD_H-1);
- for(i=0;i<240;i++)
- {
- for(j=0;j<320;j++)
- {
- picH=*p++;
- picL=*p++;
- LCD_WR_DATA8(picH);
- LCD_WR_DATA8(picL);
- }
- }
- }
实现显示测试的主程序为:
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_ICACHE_Init();
- LED1_GPIO_CLK_ENABLE();
- LED2_GPIO_CLK_ENABLE();
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Pin = LED1_PIN;
- HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = LED2_PIN;
- HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
- tft_gpio();
- tft_Init();
- BACK_COLOR=YELLOW;
- POINT_COLOR=RED;
- LCD_Clear(YELLOW);
- LCD_ShowString(80,30,"NUCLEO_H563ZI");
- show_tb(60,20,0);
- HAL_Delay(2000);
- show_pic(gImage_123);
- while (1)
- {
- HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
- HAL_Delay(100);
- HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
- HAL_Delay(100);
- }
- }
经程序的编译与下载,其显示效果如图2至图4所示。
图2 字符显示效果
图3 图片显示效果
图4 显示细节