專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

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

作者:huqin   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年03月16日   【字體:

對于人機界面中的液晶屏的使用大家都不陌生。從簡單的電子表到手機、平板電腦,顯示器、液晶電視都能看到他們的身影。早其我們常用的液晶屏,比如段碼LCD,1602,12232,12864,等非黑即透明.,隨著技術(shù)的不斷進步,現(xiàn)在在手機和平板電腦等電子設(shè)備上用的主要是TFT液晶屏,本人一直也是對液晶的顯示十分好奇,按捺不住,就淘了幾個小尺寸TFT液晶屏(呵呵,囊中羞澀)搗鼓搗鼓。發(fā)現(xiàn)這東西其實還是很好玩的,除了涉及的知識面比較廣,需要閱讀不少手冊及資料外,只要你要一定的單片機開發(fā)的基礎(chǔ),操作起來并不復(fù)雜,主要難點還是數(shù)據(jù)處理和字庫的制作上。下面就說道說道這個TFT液晶。

 
什么是TFT?
TFT液晶屏也就是thin film transistor 即薄膜晶體管顯示屏,它的每一個像素點都是由集成在其后的薄膜晶體管來驅(qū)動的。
常用TFT模塊尺寸:
對角線的尺寸:1.44、1.6、1.8、2.0、2.2、2.4、2.6、2.8、3.0、3.2、3.4、3.6、4.0、4.3、5.7、8.4、10.4、15、17、19、21英寸等。
本人使用過的,1.44、1.8、2.2
屏幕高寬比:4:3或16:9
分辨率:指水平像素和垂直像素的數(shù)量。
點距:相鄰兩個像素之間的距離。
刷新率:每秒更新的畫面數(shù)。
接口形式:并行接口和串行接口
顏色的表示
對于黑白或單色像素的信息可以用1個位來表示和存儲,
對于一個彩色像素的信息可以用1個多位二進制數(shù)來表示和存儲。
  用來表示彩色像素的二進制數(shù)的尾數(shù),稱之為顏色的顏色深度或顏色質(zhì)量
什么是真彩和偽彩
顏色深度在16為以上的稱為真彩色,顏色深度在16位以下的稱為偽彩色。
比如采用1個16位二進制數(shù)來表示一個彩色點:
   紅色               綠色               藍(lán)色
5位               6位               5位
R4 R3 R2 R1 R0 G5 G4G3   G2 G1G0B4B3B2B1B0
  高8位                      低8位
這就是所謂的5-6-5格式。
字符或圖像到底是怎樣顯示出來的?
 
 首先可將光看作是一種電磁波,以電場和磁場相互垂直而交互震蕩的方式向前傳播。電場在某個方向上震蕩,震蕩的幅度越大,光所具有的能量越大。某個方向上震蕩的光可以分解成兩個垂直方向上的分量。
偏光片:作用是讓某個方向上震蕩的光通過,而把垂直方向上震蕩的光擋住。
偏光片組
第一偏光片僅讓在某個方向上震蕩的光通過,而第二偏光片再把所通過的光擋住,即可阻絕光的行進,達(dá)到關(guān)閉光的效果。
液晶具有雙折射系數(shù)的特性,并且在不同的電場下,會有不同的排列方式,因此當(dāng)光通過液晶時,會受其影響而改變或保持其震蕩的方向,當(dāng)液晶不改變光的震蕩方向時,光無法通過第二個偏光板而被關(guān)閉,而當(dāng)液晶將光的震蕩方向改變時,光可以在分解成兩個分量,雖然一個分量無法通過第二個偏光片,但是仍還有一個分量可以通過第二個偏光片,而成為打開狀態(tài)。英雌,可用施加的電場來改變液晶的排列方式,來實現(xiàn)光的開關(guān)的來實現(xiàn)顯示功能。具體液晶是個什么東西,有那些種類,大家想了解就百度吧,這里就不再細(xì)談了。
電場是如何改變的?
首先了解一下TFT(thin-film transister )薄膜電晶體
主要結(jié)構(gòu)是一個非晶矽半導(dǎo)體薄膜,TFT 就有一個門極gate;一個源極source;和一個漏極drain.看看這幾電極的名稱是不是很熟悉,對了場效應(yīng)管也是這樣命名的,兩者類似,但又有不同之處。但是都可以理解成一個受控的開關(guān)。
這些開關(guān)以矩陣的方式進行排列。




 
彩色的TFT將水平方向的每個像素在次分成3個RGB像素,各個次像素的可以獨立的改變,故也分別對應(yīng)一個TFT。這樣3個次像素組成一個像素。

 
 
呵呵,看了上面的圖,是不是就想到了單片機矩陣按鍵的動態(tài)掃描程序。呵呵不錯,逆向思維,矩陣鍵盤的掃描是讀狀態(tài),這個是寫狀態(tài)。具體過程如下。
在水平方向上的同一條掃描線上,所有TFT的門極都連在一起,所以施加的電壓是一樣的,若在某一條掃面線上施加足夠大的正電壓,則這條掃描線上所有的TFT 都會被打開。此時該掃描線上的像素電極,會與垂直方向的資料線(漏極)連接,經(jīng)由對應(yīng)的資料線送入相應(yīng)的視信號,將像素電極充電到適當(dāng)?shù)碾妷�。接著施加足夠大的�?fù)電壓,關(guān)閉TFT,直到下次再重新寫入信號。其間使得電荷保存在液晶電容上;在按照這種方式掃描下一行。再送入下一行的視信號,如此依次將整個畫面的視信號寫入,在重新自第一行開始寫入,(一般重復(fù)的頻率為60-70Hz)。
對每個像素中的液晶光閥而言,液晶上所施加的電壓和光的穿透度具有一定的關(guān)系,因此,只要依據(jù)所要顯示的畫面,控制施加在液晶上的電壓,即可將各個像素設(shè)定在適當(dāng)?shù)墓獯┩付龋浜暇鶆虻谋彻庠淳惋@示出想要的畫面了。這就是主動式矩陣型液晶的顯示原理。
 
就幾款液晶屏的參數(shù)做一下總結(jié)說明
1、1.44寸液晶屏(以下數(shù)據(jù)來自液晶屏數(shù)據(jù)手冊)
LCD type :     1.45”active matrix TFT-LCD
Rsolution:      128(W)X128(H) Pixels
Display mode :   transmissive type
Display color:    262Kcolor
driverIC:         ILI9163C
Luminance:       120cd/m2
Contrast ratio:     400:1
Viewing direction:  6o’clock 
Interface :         4 wire SPI interface
Back light:         1 white  LED ,18ma ,3,15V
2、引腳說明:
       VCC:    電源  +3,3V
       GND:      電源地
       CS:      片選  (低電平有效)
       RST:     復(fù)位   (低電平有效)
       AO:      寄存器選擇信號(低電平:選擇命令寄存器;高電平:選擇數(shù)據(jù)寄存器)
       SDA:    data input in SPI mode  在SPI模式下的數(shù)據(jù)輸入
       SCL:    在SPI模式下的同步時鐘輸入
       LED:    背光LED電源,
呵呵,從引腳定義上就可以看出是不是在SPI模式下只需要4條IO口線就可以和MCU構(gòu)成一個顯示系統(tǒng)了。(其實還用一種模式只要3條IO口線就可以)。
再看1.8寸TFT的相關(guān)數(shù)據(jù)
顯示點陣數(shù):     128W  x   160H     dots
模塊外形尺寸:   34W  x  45.83H  x  2.65T    mm
可視區(qū)域:       28.03W x 35.04H   mm
像素尺寸:       0.06W   *   3   *  0.18H    mm
像素中心距:     0.18W   *  0.18H    mm
占空比:         1/400
視角:            6點鐘
LCD模式:       260k color
IC:              ST7735B
主要引腳定義:同1.44’
再看2.2英寸的屏
Size            2.2inch
Resolution:      240*320
Interface        4-wire SPI
Color depth      262k/65k
Technology      a-Si
Pixel pitch(mm):  0.141*0.141
Viewing direction: 6o’clock
LED numbers     4 LEDs
Driver IC        ILI9340C
主要引腳定義同1.44’英寸。
從上面不同尺寸液晶屏的引腳的定義看出,1.44英寸和1.8英寸及2.2英寸的TFT液晶屏,在和MCU構(gòu)成顯示系統(tǒng)時操作方式是一樣的(因為都是4線 SPI),盡管他們使用的驅(qū)動IC型號不同。但是只要你翻看IC的數(shù)據(jù)手冊就會發(fā)現(xiàn),他們的寄存器的定義基本是一樣的,操作原理相同。
如何構(gòu)成一個顯示系統(tǒng):
電源+MCU+TFT液晶屏
呵呵,是不是覺得少了點什么?驅(qū)動IC那里去了?
其實驅(qū)動IC我們是看不到的,它被集成在了液晶屏中,我們只要知道它的寄存器的定義,利用液晶屏的端口會進行讀寫即可。
電源: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ù)
也就是對液晶屏進行基本的配置。
這個基本直接套用就行。(除了個別地方需要修改,后面會說)
TFT驅(qū)動芯片的手冊還是有必要看看的,最好是看英文原版內(nèi)容比較詳細(xì)。
也沒有必要全部看,但是下面初始化代碼中涉及到的指令及4wireSPI的時序圖,還是很有必要了解的,不然顯示的界面出了問題,就會感覺無從下手解決。
寫數(shù)據(jù)和寫命令
很明顯要想讓液晶屏顯示字符或圖像,必須要把要顯示的內(nèi)容轉(zhuǎn)換成數(shù)據(jù)寫到液晶屏的控制器,想寫內(nèi)容數(shù)據(jù)還要對液晶屏的控制寄存器進行設(shè)置,也就是寫命令數(shù)據(jù)。只有一條SDA串口數(shù)據(jù)線,怎么區(qū)分是內(nèi)容數(shù)據(jù)還是命令數(shù)據(jù)呢,那就要靠 AO(RS):      寄存器選擇信號(低電平:選擇命令寄存器;高電平:選擇數(shù)據(jù)寄存器)。
 
 
 
 
寫命令
void  write_command(uchar c)
{
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ù)
void  write_data(uchar d)
{
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ù)***************/
 void lcd_initial()
{
 
   reset=0;
   delay(100);
   reset=1;
   delay(100);
 
//------------------------------------------------------------------//  
//-------------------Software Reset-------------------------------//
  
  write_command(0x2A);     //列地址設(shè)置
        write_data(0x00);    //列起始地址低8位
        write_data(0x00);    //列起始地址高8位
        write_data(0x00);    //列終止地址高8位
write_data(0x9F);     //列終止地址低8位
//上面的列終止地址為什么設(shè)置成0x9f,0x9f=十進制的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);    //Power control 功耗控制1
        write_data(0x23);   //VRH[5:0] `
 
        write_command(0xC1);    //Power control 功耗控制2
        write_data(0x10);   //SAP[2:0];BT[3:0] 
 
        write_command(0xC5);    //VCM control 
        write_data(0x3e); //對比度調(diào)節(jié)
        write_data(0x28); 
 
        write_command(0xC7);    //VCM control2 
        write_data(0x86);  //--
 
        write_command(0x36);  // Memory Access Control  存儲器訪問控制
        write_data(0x68); //C8   //48 68豎屏//28 E8 橫屏
                           //cc同c8
 
        write_command(0x3A); //像素格式設(shè)置   
        write_data(0x55); 
 
        write_command(0xB1);//幀速率控制    
        write_data(0x00);  
        write_data(0x18); 
 
        write_command(0xB6);    // Display Function Control 
        write_data(0x08); 
        write_data(0x82);
        write_data(0x27);  
 
        write_command(0xF2);    // 3Gamma Function Disable 
        write_data(0x00); 
 
        write_command(0x26);    //Gamma curve selected 
        write_data(0x01); //共4條曲線供選擇,分別是1248;這里選擇1,
 
        write_command(0xE0);    //Set Gamma 
        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);    //Set Gamma 
        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);    //Exit Sleep 
        delay(120); 
        write_command(0x29);    //Display on 
        write_command(0x2c); 
}
 
寫入數(shù)據(jù)時要先確定,圖像的起始坐標(biāo)和終止坐標(biāo),可以用如下的代碼實現(xiàn)
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)//設(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ù)手冊。
了解一下顏色代碼:
幾種常用的顏色的代碼
#define White          0xFFFF    //白
#define Black          0x0000     //黑
#define Red           0x001F     //紅
#define Blue            0xF800   //藍(lán)
#define Magenta        0xF81F   //紫
#define Green          0x07E0    //綠
#define Cyan           0x07FF    //青   
#define Yellow         0xFFE0    //黃
 
好了說了這么多,一個字暈。好吧,來點實際的簡單的,咱先啥字符也不顯示,
只是讓液晶屏顯示不同的顏色。
 
刷整個屏幕的顏色
可以用如下代碼實現(xiàn)
/*********顯示色彩******************/
void dsp_single_colour(DH,DL)//前景顏色,背景顏色
{
unsigned int i,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ù)************************/
void delay(uint time)
{
 uint i,j;
  for(i=0;i<time;i++)
   for(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) ;
 }
}
 
最終結(jié)果,滾動刷屏
 
 
感覺有點不對勁,不錯,最下面故意留了7行沒寫顏色數(shù)據(jù)�?梢钥吹饺绻粚懭魏螖�(shù)據(jù),屏的狀態(tài)就是花屏。
通過上面的說明了解了:
TFT液晶屏的操作原理,就是寫數(shù)據(jù)和寫命令。
通過對寫數(shù)據(jù)或?qū)懨畹拇a的分析,可以看到數(shù)據(jù)是怎樣輸送的。
TFT液晶屏的初始化工作的主要內(nèi)容。
常用的顏色代碼。
如何讓液晶屏顯示不同的顏色。
最后仔細(xì)觀察圖片,可以了解
什么是隔行掃面,前景顏色,背景顏色。
以及,花屏是什么原因造成的。
至于如何顯示字符,漢字,圖片,下回再說。
關(guān)于在tft上模擬現(xiàn)實七段數(shù)碼管詳見:http://www.torrancerestoration.com/bbs/dpj-30555-1.html
關(guān)閉窗口

相關(guān)文章