新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于8位單片機驅(qū)動液晶屏的應(yīng)用總結(jié)

關(guān)于8位單片機驅(qū)動液晶屏的應(yīng)用總結(jié)

作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
如何構(gòu)成一個顯示系統(tǒng):
電源+MCU+TFT液晶屏
呵呵,是不是覺得少了點什么?驅(qū)動IC那里去了?
其實驅(qū)動IC我們是看不到的,它被集成在了液晶屏中,我們只要知道它的寄存器的定義,利用液晶屏的端口會進(jìn)行讀寫即可。
電源:3.3V的直流電源,呵呵,這個不用細(xì)說,小功率的可以利用ASM1117-3;大功率的可以利用LM2596S-3.3(最高3A的輸出)來構(gòu)成一個電源。
MCU:主要是3個要求。
工作電壓,3.3V
夠大,
夠快。
夠大才能存的下程序和數(shù)據(jù),夠快才會圖像流暢。
本人手頭只有15L2K08S2這個單片機,8K程序存儲區(qū),2K的SRAM,最高時鐘33.1776MHz,最高輸出8MHz的外部時鐘,比起60S2的60KB的FLASH,小了不少,但是對于普通的不太復(fù)雜的應(yīng)用已經(jīng)足夠了,主要是搞通應(yīng)用的原理。
液晶屏:
以上列舉的液晶屏都是串口屏,所以屏的引出腳較少,除此之外還有引出管腳較多的并口屏,
當(dāng)然串口屏的數(shù)據(jù)是一位一位的送出的,速度相對是比較慢的。
在操作上,串口和并口原理差不多。這里就先介紹串口屏的使用。
好了,你有了上面的3大件下面在準(zhǔn)備點輔料。
1、數(shù)據(jù)線,USB轉(zhuǎn)串口數(shù)據(jù)線,用于燒寫MCU
2、字符LCD點陣提取軟件:百度一下吧,zimo221.exe
3、圖片點陣數(shù)據(jù)提取軟件:同樣百度,Image2Lcd.exe
4、編程軟件:KEIL
5、單片機燒寫軟件:這個不多說了,看你用的芯片而定。
好的,齊活了,準(zhǔn)備開工。
用導(dǎo)線將單片機的電源接口和LCD的電源及LED端口同3.3V電源的輸出連接起來。供電的問題解決了。
用導(dǎo)線將自己選擇的單片機的端口和LCD的REST、CS、SCL、AO、SDA一一對應(yīng)的連接起來。數(shù)據(jù)輸出的問題解決。
硬件問題解決,開始代碼的編寫
TFT初始化函數(shù):
也就是對液晶屏進(jìn)行基本的配置。
這個基本直接套用就行。(除了個別地方需要修改,后面會說)
TFT驅(qū)動芯片的手冊還是有必要看看的,最好是看英文原版內(nèi)容比較詳細(xì)。
也沒有必要全部看,但是下面初始化代碼中涉及到的指令及4wireSPI的時序圖,還是很有必要了解的,不然顯示的界面出了問題,就會感覺無從下手解決。
寫數(shù)據(jù)和寫命令
很明顯要想讓液晶屏顯示字符或圖像,必須要把要顯示的內(nèi)容轉(zhuǎn)換成數(shù)據(jù)寫到液晶屏的控制器,想寫內(nèi)容數(shù)據(jù)還要對液晶屏的控制寄存器進(jìn)行設(shè)置,也就是寫命令數(shù)據(jù)。只有一條SDA串口數(shù)據(jù)線,怎么區(qū)分是內(nèi)容數(shù)據(jù)還是命令數(shù)據(jù)呢,那就要靠AO(RS):寄存器選擇信號(低電平:選擇命令寄存器;高電平:選擇數(shù)據(jù)寄存器)。
寫命令
voidwrite_command(ucharc)
{
cs=0;//片選有效
rs=0;//選擇命令寄存器
bitdata=c;//送數(shù)據(jù)
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;//片選無效
}
寫數(shù)據(jù)
voidwrite_data(uchard)
{
cs=0;
rs=1;
bitdata=d;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
初始化
/*****************TFT初始化函數(shù)***************/
voidlcd_initial()
{
reset=0;
delay(100);
reset=1;
delay(100);
//------------------------------------------------------------------//
//-------------------SoftwareReset-------------------------------//
write_command(0x2A);//列地址設(shè)置
write_data(0x00);//列起始地址低8位
write_data(0x00);//列起始地址高8位
write_data(0x00);//列終止地址高8位
write_data(0x9F);//列終止地址低8位
//上面的列終止地址為什么設(shè)置成0x9f,0x9f=十進(jìn)制的159,1.8寸的屏的分辨率是128*160.
//也就是說有0-159共160列。下面的同樣的道理,只不過是說明行的起始和終止地址。
write_command(0x2B);//行地址設(shè)置
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0x7F);
write_command(0xCB);//功耗控制A
write_data(0x39);
write_data(0x2C);
write_data(0x00);
write_data(0x34);
write_data(0x02);
write_command(0xCF);//功耗控制B
write_data(0x00);
write_data(0XC1);
write_data(0X30);
write_command(0xE8);//驅(qū)動時序控制A
write_data(0x85);
write_data(0x00);
write_data(0x78);
write_command(0xEA);//驅(qū)動時序控制B
write_data(0x00);
write_data(0x00);
write_command(0xED);//電源序列控制
write_data(0x64);
write_data(0x03);
write_data(0X12);
write_data(0X81);
write_command(0xF7);//泵比控制
write_data(0x20);
write_command(0xC0);//Powercontrol功耗控制1
write_data(0x23);//VRH[5:0]`
write_command(0xC1);//Powercontrol功耗控制2
write_data(0x10);//SAP[2:0];BT[3:0]
write_command(0xC5);//VCMcontrol
write_data(0x3e);//對比度調(diào)節(jié)
write_data(0x28);
write_command(0xC7);//VCMcontrol2
write_data(0x86);//--
write_command(0x36);//MemoryAccessControl存儲器訪問控制
write_data(0x68);//C8//4868豎屏//28E8橫屏
//cc同c8
write_command(0x3A);//像素格式設(shè)置
write_data(0x55);
write_command(0xB1);//幀速率控制
write_data(0x00);
write_data(0x18);
write_command(0xB6);//DisplayFunctionControl
write_data(0x08);
write_data(0x82);
write_data(0x27);
write_command(0xF2);//3GammaFunctionDisable
write_data(0x00);
write_command(0x26);//Gammacurveselected
write_data(0x01);//共4條曲線供選擇,分別是1248;這里選擇1,
write_command(0xE0);//SetGamma
write_data(0x0F);
write_data(0x31);
write_data(0x2B);
write_data(0x0C);
write_data(0x0E);
write_data(0x08);
write_data(0x4E);
write_data(0xF1);
write_data(0x37);
write_data(0x07);
write_data(0x10);
write_data(0x03);
write_data(0x0E);
write_data(0x09);
write_data(0x00);
write_command(0XE1);//SetGamma
write_data(0x00);
write_data(0x0E);
write_data(0x14);
write_data(0x03);
write_data(0x11);
write_data(0x07);
write_data(0x31);
write_data(0xC1);
write_data(0x48);
write_data(0x08);
write_data(0x0F);
write_data(0x0C);
write_data(0x31);
write_data(0x36);
write_data(0x0F);
write_command(0x11);//ExitSleep
delay(120);
write_command(0x29);//Displayon
write_command(0x2c);
}
在寫入數(shù)據(jù)時要先確定,圖像的起始坐標(biāo)和終止坐標(biāo),可以用如下的代碼實現(xiàn)
staticvoidLCD_SetPos(unsignedintx0,unsignedintx1,unsignedinty0,unsignedinty1)//設(shè)置位置
{
write_command(0x2A);//列地址設(shè)置
write_data(x0>>8);//列起始地址高8位
write_data(x0);//列起始地址低8位
write_data(x1>>8);//列終止地址高8位
write_data(x1);//列終止地址低8位
write_command(0x2B);//頁地址設(shè)置
write_data(y0>>8);
write_data(y0);
write_data(y1>>8);
write_data(y1);
write_command(0x2c);//寫存儲器
}
寫命令時,先將命令的地址寫入,然后在將設(shè)定的數(shù)據(jù)寫入寄存器。如
write_command(0x2A);//列地址設(shè)置
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0x9F);
至于這些寫入的數(shù)據(jù)的意義及數(shù)值大小,請查閱液晶屏對應(yīng)的液晶屏的數(shù)據(jù)手冊。
了解一下顏色代碼:
幾種常用的顏色的代碼
#defineWhite0xFFFF//白
#defineBlack0x0000//黑
#defineRed0x001F//紅
#defineBlue0xF800//藍(lán)
#defineMagenta0xF81F//紫
#defineGreen0x07E0//綠
#defineCyan0x07FF//青
#defineYellow0xFFE0//黃
好了說了這么多,一個字暈。好吧,來點實際的簡單的,咱先啥字符也不顯示,
只是讓液晶屏顯示不同的顏色。
刷整個屏幕的顏色
可以用如下代碼實現(xiàn)
/*********顯示色彩******************/
voiddsp_single_colour(DH,DL)//前景顏色,背景顏色
{
unsignedinti,j;
for(i=0;i<128;i++)
for(j=0;j<160;j++)
{
write_data(DH>>8);
write_data(DH);
write_data(DL>>8);
write_data(DL);
}
}
延時函數(shù)
/******延時函數(shù)************************/
voiddelay(uinttime)
{
uinti,j;
for(i=0;ifor(j=0;j<500;j++);
}
好了,將上面的函數(shù)組合起來,準(zhǔn)備刷屏。
main()
{
lcd_initial();//TFT初始化
while(1)
{
LCD_SetPos(0,159,0,10);//設(shè)置位置
dsp_single_colour(Blue,Black);//
delay(2000);
LCD_SetPos(0,159,10,20);//設(shè)置位置
dsp_single_colour(Blue,Blue);//
delay(2000);
LCD_SetPos(0,159,20,30);//設(shè)置位置
dsp_single_colour(Green,White);//
delay(2000);
LCD_SetPos(0,159,30,40);//設(shè)置位置
dsp_single_colour(Green,Green);//
delay(2000);
LCD_SetPos(0,159,40,50);//設(shè)置位置
dsp_single_colour(Yellow,White);//
delay(2000);
LCD_SetPos(0,159,50,60);//設(shè)置位置
dsp_single_colour(Yellow,Yellow);//
delay(2000);
LCD_SetPos(0,159,60,70);//設(shè)置位置
dsp_single_colour(Black,White);//
delay(2000);
LCD_SetPos(0,159,70,80);//設(shè)置位置
dsp_single_colour(Black,Black);//
delay(2000);
LCD_SetPos(0,159,80,90);//設(shè)置位置
dsp_single_colour(Red,White);//
delay(2000);
LCD_SetPos(0,159,90,100);//設(shè)置位置
dsp_single_colour(Red,Red);//
delay(2000);
LCD_SetPos(0,159,100,110);//設(shè)置位置
dsp_single_colour(Magenta,Black);//
delay(2000);
LCD_SetPos(0,159,110,120);//設(shè)置位置
dsp_single_colour(Magenta,Magenta);//
delay(2000);
LCD_SetPos(0,159,0,120);//設(shè)置位置
dsp_single_colour(White,White);//只刷到第121行留下了7行
delay(2000);

關(guān)鍵詞: 8位單片機驅(qū)動液晶

評論


技術(shù)專區(qū)

關(guān)閉