關(guān)于8位單片機(jī)驅(qū)動(dòng)液晶屏的應(yīng)用總結(jié)
如何構(gòu)成一個(gè)顯示系統(tǒng):
電源+MCU+TFT液晶屏
呵呵,是不是覺(jué)得少了點(diǎn)什么?驅(qū)動(dòng)IC那里去了?
其實(shí)驅(qū)動(dòng)IC我們是看不到的,它被集成在了液晶屏中,我們只要知道它的寄存器的定義,利用液晶屏的端口會(huì)進(jìn)行讀寫(xiě)即可。
電源:3.3V的直流電源,呵呵,這個(gè)不用細(xì)說(shuō),小功率的可以利用ASM1117-3;大功率的可以利用LM2596S-3.3(最高3A的輸出)來(lái)構(gòu)成一個(gè)電源。
MCU:主要是3個(gè)要求。
工作電壓,3.3V
夠大,
夠快。
夠大才能存的下程序和數(shù)據(jù),夠快才會(huì)圖像流暢。
本人手頭只有15L2K08S2這個(gè)單片機(jī),8K程序存儲(chǔ)區(qū),2K的SRAM,最高時(shí)鐘33.1776MHz,最高輸出8MHz的外部時(shí)鐘,比起60S2的60KB的FLASH,小了不少,但是對(duì)于普通的不太復(fù)雜的應(yīng)用已經(jīng)足夠了,主要是搞通應(yīng)用的原理。
液晶屏:
以上列舉的液晶屏都是串口屏,所以屏的引出腳較少,除此之外還有引出管腳較多的并口屏,
當(dāng)然串口屏的數(shù)據(jù)是一位一位的送出的,速度相對(duì)是比較慢的。
在操作上,串口和并口原理差不多。這里就先介紹串口屏的使用。
好了,你有了上面的3大件下面在準(zhǔn)備點(diǎn)輔料。
1、數(shù)據(jù)線,USB轉(zhuǎn)串口數(shù)據(jù)線,用于燒寫(xiě)MCU
2、字符LCD點(diǎn)陣提取軟件:百度一下吧,zimo221.exe
3、圖片點(diǎn)陣數(shù)據(jù)提取軟件:同樣百度,Image2Lcd.exe
4、編程軟件:KEIL
5、單片機(jī)燒寫(xiě)軟件:這個(gè)不多說(shuō)了,看你用的芯片而定。
好的,齊活了,準(zhǔn)備開(kāi)工。
用導(dǎo)線將單片機(jī)的電源接口和LCD的電源及LED端口同3.3V電源的輸出連接起來(lái)。供電的問(wèn)題解決了。
用導(dǎo)線將自己選擇的單片機(jī)的端口和LCD的REST、CS、SCL、AO、SDA一一對(duì)應(yīng)的連接起來(lái)。數(shù)據(jù)輸出的問(wèn)題解決。
硬件問(wèn)題解決,開(kāi)始代碼的編寫(xiě)
TFT初始化函數(shù):
也就是對(duì)液晶屏進(jìn)行基本的配置。
這個(gè)基本直接套用就行。(除了個(gè)別地方需要修改,后面會(huì)說(shuō))
TFT驅(qū)動(dòng)芯片的手冊(cè)還是有必要看看的,最好是看英文原版內(nèi)容比較詳細(xì)。
也沒(méi)有必要全部看,但是下面初始化代碼中涉及到的指令及4wireSPI的時(shí)序圖,還是很有必要了解的,不然顯示的界面出了問(wèn)題,就會(huì)感覺(jué)無(wú)從下手解決。
寫(xiě)數(shù)據(jù)和寫(xiě)命令
很明顯要想讓液晶屏顯示字符或圖像,必須要把要顯示的內(nèi)容轉(zhuǎn)換成數(shù)據(jù)寫(xiě)到液晶屏的控制器,想寫(xiě)內(nèi)容數(shù)據(jù)還要對(duì)液晶屏的控制寄存器進(jìn)行設(shè)置,也就是寫(xiě)命令數(shù)據(jù)。只有一條SDA串口數(shù)據(jù)線,怎么區(qū)分是內(nèi)容數(shù)據(jù)還是命令數(shù)據(jù)呢,那就要靠AO(RS):寄存器選擇信號(hào)(低電平:選擇命令寄存器;高電平:選擇數(shù)據(jù)寄存器)。
寫(xiě)命令
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;//片選無(wú)效
}
寫(xiě)數(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.
//也就是說(shuō)有0-159共160列。下面的同樣的道理,只不過(guò)是說(shuō)明行的起始和終止地址。
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ū)動(dòng)時(shí)序控制A
write_data(0x85);
write_data(0x00);
write_data(0x78);
write_command(0xEA);//驅(qū)動(dòng)時(shí)序控制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);//對(duì)比度調(diào)節(jié)
write_data(0x28);
write_command(0xC7);//VCMcontrol2
write_data(0x86);//--
write_command(0x36);//MemoryAccessControl存儲(chǔ)器訪問(wèn)控制
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);
}
在寫(xiě)入數(shù)據(jù)時(shí)要先確定,圖像的起始坐標(biāo)和終止坐標(biāo),可以用如下的代碼實(shí)現(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);//頁(yè)地址設(shè)置
write_data(y0>>8);
write_data(y0);
write_data(y1>>8);
write_data(y1);
write_command(0x2c);//寫(xiě)存儲(chǔ)器
}
寫(xiě)命令時(shí),先將命令的地址寫(xiě)入,然后在將設(shè)定的數(shù)據(jù)寫(xiě)入寄存器。如
write_command(0x2A);//列地址設(shè)置
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0x9F);
至于這些寫(xiě)入的數(shù)據(jù)的意義及數(shù)值大小,請(qǐng)查閱液晶屏對(duì)應(yīng)的液晶屏的數(shù)據(jù)手冊(cè)。
了解一下顏色代碼:
幾種常用的顏色的代碼
#defineWhite0xFFFF//白
#defineBlack0x0000//黑
#defineRed0x001F//紅
#defineBlue0xF800//藍(lán)
#defineMagenta0xF81F//紫
#defineGreen0x07E0//綠
#defineCyan0x07FF//青
#defineYellow0xFFE0//黃
好了說(shuō)了這么多,一個(gè)字暈。好吧,來(lái)點(diǎn)實(shí)際的簡(jiǎn)單的,咱先啥字符也不顯示,
只是讓液晶屏顯示不同的顏色。
刷整個(gè)屏幕的顏色
可以用如下代碼實(shí)現(xiàn)
/*********顯示色彩******************/
voiddsp_single_colour(DH,DL)//前景顏色,背景顏色
{
unsignedinti,j;