为增强表现力和丰富显示内容,给AG32VH407开发板配置一款SPI接口的TFT屏是十分必要的,该显示屏的分辨率为320*240像素点。
该TFT显示屏与开发板的连接关系为:
SCLK----PIN_62
SDIN----PIN_61
RST----PIN_59
DC ----PIN_58
CS ----PIN_57
为此VE文件中建立的映射关系为:
GPIO5_0 PIN_62
GPIO5_1 PIN_61
GPIO5_2 PIN_59
GPIO5_3 PIN_58
GPIO5_4 PIN_57
为便于向TFT显示屏提供高低电平,所作的语句定义为:
#define LCD_SCLK_Set GPIO_SetHigh(GPIO5,GPIO_BIT0)
#define LCD_SCLK_Clr GPIO_SetLow(GPIO5,GPIO_BIT0)
#define LCD_SDIN_Set GPIO_SetHigh(GPIO5,GPIO_BIT1)
#define LCD_SDIN_Clr GPIO_SetLow(GPIO5,GPIO_BIT1)
#define LCD_RST_Set GPIO_SetHigh(GPIO5,GPIO_BIT2)
#define LCD_RST_Clr GPIO_SetLow(GPIO5,GPIO_BIT2)
#define LCD_DC_Set GPIO_SetHigh(GPIO5,GPIO_BIT3)
#define LCD_DC_Clr GPIO_SetLow(GPIO5,GPIO_BIT3)
#define LCD_CS_Set GPIO_SetHigh(GPIO5,GPIO_BIT4)
#define LCD_CS_Clr GPIO_SetLow(GPIO5,GPIO_BIT4)
对所用引脚配置工作模式的函数为:
void TFT_config(void)
{
SYS_EnableAHBClock(APB_MASK_GPIO5);
GPIO_SetOutput(GPIO5,GPIO_BIT0);
GPIO_SetOutput(GPIO5,GPIO_BIT1);
GPIO_SetOutput(GPIO5,GPIO_BIT2);
GPIO_SetOutput(GPIO5,GPIO_BIT3);
GPIO_SetOutput(GPIO5,GPIO_BIT4);
}模拟SPI方式发送字节数据的函数为:
void LCD_Writ_Bus(unsigned char dat)
{
unsigned char i;
LCD_CS_Clr;
for(i=0;i<8;i++)
{
LCD_SCLK_Clr;
if(dat&0x80)
LCD_SDIN_Set;
else
LCD_SDIN_Clr;
LCD_SCLK_Set;
dat<<=1;
}
LCD_CS_Set;
}TFT屏初始化函数为:
void TFT_Init(void)
{
LCD_RST_Clr;
UTIL_IdleUs(20e3);
LCD_RST_Set;
UTIL_IdleUs(20e3);
LCD_CS_Clr;
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(0x48);
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);
UTIL_IdleUs(120e3);
LCD_WR_REG(0x29);
LCD_WR_REG(0x2c);
} 实现色彩清屏处理的函数为:
void LCD_Clear(unsigned int Color)
{
unsigned int i,j;
LCD_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_DATA(Color);
}
}
}在进行显示驱动测试时,为通过测试的效率,可在显示屏的初始化之后,直接以色彩清屏函数来测试,若屏幕被指定色彩所填充,则说明显示驱动有效;否则,说明驱动失败。
在配备字库的情况下,其实现字符显示的函数为:
void LCD_ShowCharh(unsigned int x,unsigned int y,char num,char mode)
{
char temp;
char pos,t;
unsigned int x0=x;
unsigned int colortemp=POINT_COLOR;
if(x>LCD_W-16||y>LCD_H-16)return;
num=num-' ';
LCD_Address_set(x,y,x+8-1,y+16-1);
if(!mode)
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01) POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x+pos,y-t);
temp>>=1;
}
}
}
else
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01) LCD_DrawPoint(x+pos,y-t);
temp>>=1;
}
}
}
POINT_COLOR=colortemp;
} 实现字符串显示的函数为:
void LCD_ShowStringh(unsigned int x,unsigned int y,const char *p)
{
while(*p!='\0')
{
LCD_ShowCharh(x,y,*p,0);
y-=8;
p++;
}
} 实现汉字显示的函数为:
void showhanzi16h(unsigned int x,unsigned int y,unsigned char index,unsigned char s)
{
unsigned char i,j,k;
const unsigned char *temp=hanzi16;
temp+=index*32;
for(j=0;j<16;j++)
{
for(k=0;k<2;k++)
{
for(i=0;i<8;i++)
{
if((*temp&(1<<i))!=0)
{
if(s==0) POINT_COLOR=WHITE;
else POINT_COLOR=RED;
}
else
{
if(s==0) POINT_COLOR=RED;
else POINT_COLOR=WHITE;
}
LCD_DrawPoint(x+j,y-k*8-i);
}
temp++;
}
}
}实现TFT显示屏驱动效果测试的主程序为:
int main(void)
{
board_init();
TFT_config();
TFT_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowStringh(10,80," 8:30:00");
showhanzi16h(10,240,0,0);
showhanzi16h(10,220,1,0);
showhanzi16h(10,200,2,0);
showhanzi16h(10,180,3,0);
showhanzi16h(10,160,4,0);
showhanzi16h(10,140,5,0);
while (1);
}经程序的编译与烧录,在按图1连接的情况下其测试效果如图2所示。

图1 器件连接

图2 显示效果
其实,该测试的意义还不止于此,在修改显示屏初始化程序和显示屏长宽参数的情况下,它还可以驱动更多的显示屏。
如驱动一款1.8寸显示屏的参数化函数为:
void Lcd_Init(void)
{
unsigned int i;
Lcd_Reset();
LCD_WR_REG(0x11);
UTIL_IdleUs(120e3);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x2D);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x2D);
LCD_WR_REG(0xB3);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x2D);
LCD_WR_REG(0xB4);
LCD_WR_DATA8(0x07);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0xA2);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x84);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0xC5);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x8A);
LCD_WR_DATA8(0x2A);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x8A);
LCD_WR_DATA8(0xEE);
LCD_WR_REG(0xC5);
LCD_WR_DATA8(0x0E);
LCD_WR_REG(0x36);
LCD_WR_DATA8(0xC0);
LCD_WR_REG(0xe0);
LCD_WR_DATA8(0x0f);
LCD_WR_DATA8(0x1a);
LCD_WR_DATA8(0x0f);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x2f);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x20);
LCD_WR_DATA8(0x22);
LCD_WR_DATA8(0x1f);
LCD_WR_DATA8(0x1b);
LCD_WR_DATA8(0x23);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xe1);
LCD_WR_DATA8(0x0f);
LCD_WR_DATA8(0x1b);
LCD_WR_DATA8(0x0f);
LCD_WR_DATA8(0x17);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x2c);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x2e);
LCD_WR_DATA8(0x30);
LCD_WR_DATA8(0x30);
LCD_WR_DATA8(0x39);
LCD_WR_DATA8(0x3f);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0x2a);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x7f);
LCD_WR_REG(0x2b);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x9f);
LCD_WR_REG(0xF0);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xF6);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0x29);
}将色彩擦除屏幕的函数改为:
void Lcd_Clear(unsigned int Color)
{
unsigned int i,m;
LCD_Address_set(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
LCD_WR_REG(0x2C);
for(i=0;i<X_MAX_PIXEL;i++)
{
for(m=0;m<Y_MAX_PIXEL;m++)
{
LCD_WR_DATA(Color);
}
}
}则经过程序的编译和下载,其测试效果如图3所示。

图3 测试效果
此外,在修改初始化程序及显示屏参数的情况下,对LCD屏也是起作用的,图4是一款0.96寸LCD屏,其测试效果见图5所示。

图4 器件连接

图5 测试效果
我要赚赏金
