在沁恒CH585开发板上,为了便于显示便给它配置了一个SPI接口的TFT显示屏,其分辨率为240*320像素点。
由于是采用硬件方式驱动,所选用的是SPI0,其引脚如图1所示。

图1 所用接口
为此,TFT显示屏的引脚连接关系为:
CS -----PA12
SCK -----PA13
MOSI-----PA14
RST ----PA1
DC ----PA2
对2个辅助引脚的配置函数为:
void TFT_CONFIG()
{
GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA );
}
配置SPI0的语句为:
GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
SPI0_MasterDefInit();
在SPI模式下发送字节数据的函数变为:
void LCD_Writ_Bus(unsigned char com)
{
GPIOA_ResetBits(GPIO_Pin_12);
SPI0_MasterSendByte(com);
}
用到的2个库函数的内容为:
void SPI0_MasterDefInit(void)
{
R8_SPI0_CLOCK_DIV = 4;
R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI0_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE;
R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF;
R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
}
void SPI0_MasterSendByte(uint8_t d)
{
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R16_SPI0_TOTAL_CNT = 1;
R8_SPI0_FIFO = d;
while(!(R8_SPI0_INT_FLAG & RB_SPI_FREE));
}
显示屏的初始化函数为:
void TFT_Init(void)
{
LCD_REST_Low();
DelayMs(20);
LCD_REST_High();
DelayMs(20);
LCD_CS_Low();
LCD_WR_REG(0xCB);
LCD_WR_DATA8(0x39);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x34);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0xCF);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0XC1);
LCD_WR_DATA8(0X30);
LCD_WR_REG(0xE8);
LCD_WR_DATA8(0x85);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0xEA);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xED);
LCD_WR_DATA8(0x64);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0X12);
LCD_WR_DATA8(0X81);
LCD_WR_REG(0xF7);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xC5);
LCD_WR_DATA8(0x3e);
LCD_WR_DATA8(0x28);
LCD_WR_REG(0xC7);
LCD_WR_DATA8(0x86);
LCD_WR_REG(0x36);
LCD_WR_DATA8(0xE8);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x55);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x18);
LCD_WR_REG(0xB6);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x82);
LCD_WR_DATA8(0x27);
LCD_WR_REG(0xF2);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x26);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x4E);
LCD_WR_DATA8(0xF1);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0XE1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0xC1);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0x11);
DelayMs(120);
LCD_WR_REG(0x29);
LCD_WR_REG(0x2c);
}
实现色彩清屏处理的函数为:
void LCD_Clear(unsigned int Color)
{
char VH,VL;
unsigned int i,j;
VH=Color>>8;
VL=Color;
Address_set(0,0,LCD_H-1,LCD_W-1);
for(i=0;i<LCD_H;i++)
{
for (j=0;j<LCD_W;j++)
{
LCD_WR_DATA8(VH);
LCD_WR_DATA8(VL);
}
}
}
通过添加字符及字符串显示函数,实现显示测试的主程序为:
int main()
{
uint8_t i;
HSECFG_Capacitance(HSECap_18p);
SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
TFT_CONFIG();
GPIOA_SetBits(GPIO_Pin_12);
GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
SPI0_MasterDefInit();
DelayMs(1);
TFT_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowChar(10,10,'V',0);
LCD_ShowString(10,30,"CH585");
while(1);
}
经编译和下载,其测试效果如图6所示,说明硬件驱动是成功的。

图2 测试效果