NUCLEO- H563ZI开发板是一款近于最小系统的开发工具,为此为它配置一个显示器件是十分必要,这样就有了一个人机交互的桥梁。
这里所配置的显示屏是一款2.2寸的TFT显示屏,其显示分辨率为240*320像素点,该显示屏以SPI方式工作。
为了省去线路连接的麻烦,显示屏是通过开发板的Arduino接口来完成,所使用的引脚如图1所示。
图1 使用引脚
显示屏与开发板的引脚连接关系为:
CS ---PA5
RST---PG9
DC ---PB5
SDA---PD14
SCL---PD15
BL ---PF3
对显示屏所用引脚的配置函数为:
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 显示细节
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3315848-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。