Createdon:2012-8-30Author:zhangbin
本文引用地址:http://www.ex-cimer.com/article/201611/322839.htm
學習筆記
for12864
redesignedbyzhangbin
2012-08-30
versions:12_08_01
這是我對12864的學習筆記,12864液晶功能很全面,使用起來也很方便,能夠滿足一般的研究和工程應用的需求。
下面我就對幾個方面講述一下我對它學習過程中的一些體會。我會盡量全面的介紹,并且會主要針對一些特殊的應用和一些我認為要特別注意的地方進行較為詳細的說明。而對于那些較為固定的,常用的方面會簡略一些。
其中的不管串行模式還是并行模式,對液晶的寫指令,寫數(shù)據(jù),讀操作等這些基本的操作都是一些比較固定的,基礎的東西。我認為只要能夠看懂,并且能夠在不同的處理器上移植就夠了,沒有必要非要自己對著手冊時序圖寫出來。因為有人已經(jīng)寫好了,而且工作穩(wěn)定,我們只要在它的基礎上學會應用就可以了?,F(xiàn)在是知識爆炸時期,知識,信息迅速膨脹,我們要學會使用已有的成果,然后在這個基礎上自己再進行開發(fā)應用的研究。我們不必一定要從底層開始把別人已經(jīng)做的很成熟的東西再做一遍,這樣不但效率不高,而且我們一般人的精力也不允許。
好了,不說廢話了,下面就開始介紹,當然,那些基礎層面的東西我也會介紹的。
下面所涉及到的程序,是針對msp430g2553的,都是我已經(jīng)調(diào)通的,可以直接應用。
一,12864的介紹
1,液晶顯示模塊是128×64點陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內(nèi)置國標GB2312碼簡體中文字庫(16X16點陣)、128個字符(8X16點陣)及64X256點陣顯示RAM(GDRAM)??膳cCPU直接接口,提供兩種界面來連接微處理機:8-位并行及串行兩種連接方式。具有多種功能:光標顯示、畫面移位、睡眠模式等。
2,常用的12864液晶內(nèi)部都是使用ST7920控制器。
1),ST7920提供8位元,4位元及串行三種微處理器控制方式,大陸常用的是8位元和串行控制方式。
2),ST7920可以控制顯示字母,數(shù)字符號,中文字型和自定義的圖畫??梢杂脕盹@示圖形,演示動畫,繪制曲線等。
3),字符顯示RAM(DDRAM)
ST7920的字符顯示RAM(DDRAM)最多可以控制16字元*4行,LCD的顯示范圍為16字元*2行。
這里要注意,其實ST7920的DDRAM每一行可以控制16個漢字的,共有4行。但是LCD的每行只能顯示8個字符,為了顯示觀察的方便,在lcd制作的過程中,是將DDRAM的其中兩行拆分開成四行,然后在lcd上顯示,也即是DDRAM只用到了一半。
lcd的顯示字符的坐標地址如下表:
漢字顯示坐標
Line180H81H82H83H84H85H86H87H
Line290H91H92H93H94H95H96H97H
Line388H89H8AH8BH8CH8DH8EH8FH
Line498H99H9AH9BH9CH9DH9EH9FH
從上表不難看出,其中第一行和第三行是DDRAM中的同一行拆分來的,同理24行也是DDRAM中的同一行拆分而來的。
了解了這一點就不難理解下面程序中在換行顯示時,要認為手動地指定下一行的地址。例如:如果第一行顯示完了,下面的數(shù)據(jù)我要接著顯示在第二行,這樣才符合人觀察的習慣,那么我就要在換第二行顯示之前要手動地把顯示地址切換到第二行。要不然的話,第一行顯示完了,地址會自動增加,就會顯示到第三行上去,這樣的話我們觀察起來就不自然了。程序?qū)嵗龝谙旅嫔婕暗降摹?/p>
4),中文字庫ROM(CGROM)
內(nèi)置的是GB2312碼簡體中文字庫,共提供了8192個16*16點的中文字型。
5),半寬字型ROM(HCGROM)
提供126個16*8點半字寬的字母符號字型。
6),圖畫顯示RAM(GDRAM)
提供64*256位元的GDRAM
其中我們常用的RAM就是上面所提到的,還有一些CGRAM,IRAM這些我們不經(jīng)常使用,就不再介紹了。
上面介紹的DDRAM控制顯示漢字,字符。GDRAM控制顯示圖畫,上電后,默認DDRAM是打開的,控制液晶顯示。GDRAM默認不打開,它里面的數(shù)據(jù)是隨機的,如果此時打開了GDRAM的話,lcd會同時受到DDRAM和GDRAM的控制,由于GDRAM中的數(shù)據(jù)是隨機的,所以會顯示亂碼。所以在使用GDRAM之前要先清除里面的隨機數(shù)據(jù)。
清除GDRAM的函數(shù)如下:
voidClear_GDRAM(void)//清除GDRAM中的的隨機數(shù)據(jù)。因為上電后GDRAM中的數(shù)據(jù)是隨機的,如果不清除而直接打開GDRAM顯示時,會顯示亂碼
//所以在局部使用GDRAM顯示圖形時,要先清除隨機數(shù)據(jù)。如果是全局使用GDRAM,即整個lcd屏全部設置顯示數(shù)據(jù),則可以
//不必清除,因為新數(shù)據(jù)會把隨機數(shù)據(jù)給覆蓋掉
{
uchari,j,k;
wr_lcd(comm,0x34);//打開擴展指令集操作GDRAM是擴展指令集
i=0x80;
for(j=0;j<32;j++)
{
wr_lcd(comm,i++);
wr_lcd(comm,0x80);
for(k=0;k<16;k++)
{
wr_lcd(dat,0x00);//寫入空字符,就相當于清零
}
}
i=0x80;
for(j=0;j<32;j++)
{
wr_lcd(comm,i++);
wr_lcd(dat,0x88);
for(k=0;k<16;k++)
{
wr_lcd(dat,0x00);
}
}
wr_lcd(comm,0x30);//回到基本指令集
}
3,12864有兩種工作模式
1),并行模式和串行模式。并行模式就是常用的8位數(shù)據(jù)線,4為控制線。這種方式雖然占用的IO口較多,但是向液晶收發(fā)數(shù)據(jù)較容易實現(xiàn),數(shù)據(jù)傳輸速度較快。所以在一些連續(xù)顯示多幅圖畫,演示動畫或?qū)︼@示的實時性要求較高的場合應該考慮這種方式。其中在并行模式中,在向液晶寫數(shù)據(jù)或命令前,要進行液晶忙標志判斷BF,要確定液晶顯示不忙了,才能進行操作。
其中并行模式的液晶的讀寫數(shù)據(jù),命令函數(shù)如下:
voidWrite_Cmd(ucharcmd)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;//數(shù)據(jù)輸入單片機
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);//判斷忙標志等待忙
LCD_DataOut;//數(shù)據(jù)輸出到lcd
LCD_RW_L;
MCU2LCD_Data=cmd;//單片機向lcd輸入命令
LCD_EN_H;
_NOP();
LCD_EN_L;
}
voidWrite_Data(uchardat)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);//等待忙
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data=dat;//單片機向lcd中輸入數(shù)據(jù)
LCD_EN_H;
_NOP();
LCD_EN_L;
}
2),串行模式只用到了兩根線WREN于單片機進行通信。這種方式可以大大減少單片機IO口的開銷,適用于IO口資源有限的單片機(如msp430g2553)。但是這種方式實現(xiàn)起來較麻煩,數(shù)據(jù)的傳輸效率不高。對于一般的文字,簡單圖形的顯示還是可以的。(有可能是因為msp430g2553的處理能力較強,我現(xiàn)在用串行連接方式,顯示下面的幾幅圖畫,顯示效果很好,看不出有什么數(shù)據(jù)傳輸速度慢的問題)。
由于我用的是msp430g2553,所以我一直都是使用串行的控制模式。
//下面重點講一下串行的時序
//SCLK:串行同步時鐘線,每操作一位數(shù)據(jù)都要有一個SCLK跳變沿,而且在這里是上升沿有效。也即是說,每次SCLK由低電平變?yōu)楦唠娖降乃查g,液晶控
//制器將SID上的數(shù)據(jù)讀入或輸出。
//SID:串行數(shù)據(jù),每一次操作都由三個字節(jié)數(shù)據(jù)組成,第一個字節(jié)向控制器發(fā)送命令控制字,告訴控制器接下來是什么操作,若為寫指令則發(fā)送11111000
//(0xf8),若為若為寫數(shù)據(jù)則發(fā)送11111010(0xfa),若為讀狀態(tài)則發(fā)送11111100(0xfc),若為讀數(shù)據(jù)則發(fā)送11111110(0xfe)。
//第二個字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的高4位,第二個字節(jié)的低4位補0.
//第三個字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的低4位,第三個字節(jié)的低4位補0
//具體的可以觀察時序進行理解
其中數(shù)據(jù)的傳輸?shù)暮瘮?shù)如下:
//12864串行連接寫數(shù)據(jù),寫命令函數(shù)按照手冊上的時序進行編程
void wr_lcd(uchar dat_comm,uchar content)//
{//要寫的數(shù)據(jù)
uchar a,i,j;
delay_us(50);
a=content;
LCD_SCLK0; //en=0;
LCD_SID1;//wr=1
for(i=0;i<5;i++) //數(shù)據(jù)時序*****************8前5個高電平的同步碼
{
LCD_SCLK1;
LCD_SCLK0;
}
LCD_SID0;//wr=0寫操作
LCD_SCLK1;//en=1來一個時鐘
LCD_SCLK0;//en=0
if(dat_comm)
LCD_SID1;//RS=1寫數(shù)據(jù)
else
LCD_SID0;//RS=0寫指令
LCD_SCLK1; //來一個時鐘
LCD_SCLK0;
LCD_SID0;//控制字的最后一位為0
LCD_SCLK1;//來一個時鐘
LCD_SCLK0;
for(j=0;j<2;j++)//************一共2*4次循環(huán)寫寫一字節(jié)數(shù)據(jù),第一次大循環(huán)寫高4位,第二次大循環(huán)寫低4位
{
for(i=0;i<4;i++)
{
if(a&0x80)
LCD_SID1;
else
LCD_SID0;
a=a<<1;
LCD_SCLK1;
LCD_SCLK0;
}
LCD_SID0;
for(i=0;i<4;i++)//時鐘下面來4個時鐘脈沖
{
LCD_SCLK1;
LCD_SCLK0;
}
}
}
評論