本帖最后由 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);
}
}
|