本帖最后由 QIANLILI 于 2018-4-14 10:35 编辑
TFT液晶屏的驱动 建议最好用低压的单片机 如果要用C51的最好用STC8F系列。宽电压。目前性价比也不错。另外,楼主贴出的只是液晶屏的初始化程序。 你还缺完整显示代码。 接线的话DB0-DB7可以接P1端口的P1.0-P1.7 另外 CS RST RS WRB RDB 也可以接P2端口的P2.0-P2.5 之后在程序中分别定义好。 液晶的背光电源和液晶的电源,电压不能超过标注电压。一般不能大于3.7伏。 虽然我也有试过接5伏的 但是烧坏的概率很大。 所以尽量选用宽电压单片机。 那样单片机的电压可以和液晶的一样,用稳压后3.3伏的电压就可。看楼主的提问,感觉楼主对单片机都不是很了解。 那么对液晶的驱动原理也应该不了解。 确实需要先把单片机的其它功能和例程都玩的很熟练了,才能驱动好液晶模块。
以下程序是驱动8位数据接口的液晶刷屏程序。你这个也是8位数据的。但是要套用,程序需要改动。液晶初始化代码换成你要用的液晶的。还有你那个液晶的WriteData用的是8位。我这程序用的是16位。需要改一下。
因为我没有你这种液晶屏。无法帮你修改程序及验证测试。你可以自己看一下代码。等你能看懂每一行的意思。那么你就能驱动好液晶屏了。
#define u8 unsigned char
#define u16 unsigned int
#define DBH P1
sbit CS = P3^2;
sbit RS = P3^3;
sbit RD = P3^4;
sbit WR = P3^5;
sbit RST = P3^6;
#define RED 0xF800
#define GREEN 0x07E0
#define BLUE 0x001F
#define WHITE 0xFFFF
#define BLACK 0x0000
void Delay1ms() [url=]//@12.000MHz[/url]
{
unsigned char i, j;
i = 16;
j = 147;
do
{
while (--j);
} while (--i);
}
void delayms(unsigned int dly)
{
unsigned int i;
for(i=0;i<dly;i++)
{
Delay1ms();
}
}
void WriteComm(u8 i)
{
CS=0;
RD=1;
RS=0;
DBH=i;
WR=0;
WR=1;
CS=1;
}
void WriteData(u16 color)
{
CS=0;
RD=1;
RS=1;
DBH=color>>8;
WR=0;
WR=1;
DBH=color;
WR=0;
WR=1;
CS=1;
}
void LCD_Init(void)
{
RST = 0;
delayms(100);
RST = 1;
delayms(100);
WriteComm(0x2C);
delayms(10);
WriteComm(0x02);
WriteComm(0x00);
WriteComm(0x28);
WriteComm(0x01);
WriteComm(0x45); //RAM Skip AREA set
WriteComm(0x00);
WriteComm(0x53);
WriteComm(0x00);
WriteComm(0x10);
WriteComm(0x03);
WriteComm(0x30);
WriteComm(0x1d);
WriteComm(0x32);
WriteComm(0x0e);
WriteComm(0x40);
WriteComm(0x80);
WriteComm(0x42); //Y ADDRESS
WriteComm(0x02);
WriteComm(130);
WriteComm(0x43); //X ADDRESS
WriteComm(0x04);
WriteComm(130);
WriteComm(0x34);
WriteComm(0x8d);
WriteComm(0x2a);
WriteComm(0x42);
WriteComm(0x55);
WriteComm(0x00);
WriteComm(0x56);
WriteComm(0x00);
WriteComm(0x57);
WriteComm(0x9f);
WriteComm(0x51);
}
void SETWINDOWS(u16 Xstart,u16 Xend,u16 Ystart,u16 Yend)
{
WriteComm(0x42);
WriteComm(Ystart);
WriteComm(Yend);
WriteComm(0x43);
WriteComm(Xstart);
WriteComm(Xend);
}
void DispColor(u16 color)
{
u16 i,j;
SETWINDOWS(0,130-1,0,130-1);
CS=0;
RD=1;
RS=1;
for(i=0;i<130;i++)
{
for(j=0;j<130;j++)
{
DBH=color>>8;
WR=0;
WR=1;
DBH=color;
WR=0;
WR=1;
}
}
CS=1;
}
void main(void)
{
LCD_Init();
DispColor(0xFFFF);
while(1)
{
DispColor(0xF800);
delayms(2000);
DispColor(0x07C0);
delayms(2000);
DispColor(0x003F);
delayms(2000);
}
}
|