上一篇我们已经基于HAL库进行了基本的点灯,本章更进一步以SPI协议点亮TFT LCD屏幕。
这款屏幕采用的是ILI9320主控,SPI接口。显示尺寸为 176*220
TFT模块与开发板的接线方式如下:
//*****************************************************************************
//CS P1.2
//RST P1.3
//RS P1.4
//SDA P1.5
//CLK P1.6
//*****************************************************************************
硬件准备完毕,接下来就是软件编写环节。
本例采用IO口模拟SPI协议,这样具备快速移植的优点,当然速度不及硬件SPI。
TFT模块涉及到的5个控制引脚分别对应IO的高低。
#define CS_1 Cy_GPIO_Set(GPIO_PRT1, 2u);
#define CS_0 Cy_GPIO_Clr(GPIO_PRT1, 2u);
#define RST_1 Cy_GPIO_Set(GPIO_PRT1, 3u);
#define RST_0 Cy_GPIO_Clr(GPIO_PRT1, 3u);
#define RS_1 Cy_GPIO_Set(GPIO_PRT1, 4u);
#define RS_0 Cy_GPIO_Clr(GPIO_PRT1, 4u);
#define SDA_1 Cy_GPIO_Set(GPIO_PRT1, 5u);
#define SDA_0 Cy_GPIO_Clr(GPIO_PRT1, 5u);
#define CLK_1 Cy_GPIO_Set(GPIO_PRT1, 6u);
#define CLK_0 Cy_GPIO_Clr(GPIO_PRT1, 6u);
程序首要进行IO的设置:
输出模式
在模拟SPi协议环节,关键的串行发送一个byte的函数为:
在显示图片环节:
首先对目标图片进行取模操作:
(注意宽度不要超过屏幕显示宽度176)
生成了一个巨大的数组:
显示图片的函数如下:
//取模方式 水平扫描 从左到右 低位在前
void showimage(const unsigned char *p) //显示40*40 QQ图片
{
int i;
unsigned char picH,picL;
Lcd_Clear(white);//清屏
Lcd_SetRegion(0,70,175,152); //坐标设置
for(i=0;i<176*82;i++)
{
picL=*(p+i*2); //数据低位在前
picH=*(p+i*2+1);
Lcd_WriteData_16Bit(picH<<8 | picL);
}
}
最终main函数如下。
int main(void)
{
Cy_GPIO_Pin_FastInit(GPIO_PRT1,2u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,3u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,4u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,5u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,6u,CY_GPIO_DM_PULLDOWN,0,0);
Lcd_Init(); //初始化LCD
delayms(10); //延时一段时间
Lcd_Clear(black );
Show_RGB(0,0,176,44,blue);
Show_RGB(0,44,176,88,green);
Show_RGB(0,88,176,132,magenta);
Show_RGB(0,132,176,176,red);
Show_RGB(0,176,176,220,yellow);
Show_RGB(0,0,176,44,yellow);
Show_RGB(0,44,176,88,red);
Show_RGB(0,88,176,132,blue2);
Show_RGB(0,132,176,176,green);
Show_RGB(0,176,176,220,blue);
delayms(10); //延时一段时间
showimage(gImage_infineon);
}
附上源代码:
程序包括了刷屏,和显示图片两部分:
TFT