12864液晶顯示圖片原理(完整版)_第1頁
12864液晶顯示圖片原理(完整版)_第2頁
12864液晶顯示圖片原理(完整版)_第3頁
12864液晶顯示圖片原理(完整版)_第4頁
12864液晶顯示圖片原理(完整版)_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

51單片機(jī)綜合學(xué)習(xí)

12864液晶原理分析1

辛勤學(xué)習(xí)了好幾天,終于對12864液晶有了些初步了解~沒有視頻教程學(xué)起來真有些累,基本上內(nèi)部程序?qū)懭腠樞蚨际歉鶕?jù)程序自我變動,然后逆向反推出原理……芯片:YM12864RP-1控制芯片:ST7920A

帶中文字庫初步小結(jié):1、

控制芯片不同,寄存器定義會不同

2、

顯示方式有并行和串行,程序不同

3、

含字庫芯片顯示字符時(shí)不必對字符取模了

4、

對芯片的結(jié)構(gòu)地址一定要理解清楚

5、

顯示漢字時(shí)液晶芯片寫入數(shù)據(jù)的順序(即顯示的順序)要清楚

6、

顯示圖片時(shí)液晶芯片寫入數(shù)據(jù)的順序(即顯示的順序)要清楚

7、

顯示漢字時(shí)的二級單元(一級為八位數(shù)據(jù)寫入單元)要清楚

8、

顯示圖片時(shí)的二級單元(一級為八位數(shù)據(jù)寫入單元)要清楚

12864點(diǎn)陣液晶顯示模塊(LCM)就是由128*64個液晶顯示點(diǎn)組成的一個128列*64行的陣列。每個顯示點(diǎn)對應(yīng)一位二進(jìn)制數(shù),1表示亮,0表示滅。存儲這些點(diǎn)陣信息的RAM稱為顯示數(shù)據(jù)存儲器。要顯示某個圖形或漢字就是將相應(yīng)的點(diǎn)陣信息寫入到相應(yīng)的存儲單元中。圖形或漢字的點(diǎn)陣信息由自己設(shè)計(jì),問題的關(guān)鍵就是顯示點(diǎn)在液晶屏上的位置(行和列)與其在存儲器中的地址之間的關(guān)系。由于多數(shù)液晶顯示模塊的驅(qū)動電路是由一片行驅(qū)動器和兩片列驅(qū)動器構(gòu)成,所以12864液晶屏實(shí)際上是由左右兩塊獨(dú)立的64*64液晶屏拼接而成,每半屏有一個512*8bits顯示數(shù)據(jù)RAM。左右半屏驅(qū)動電路及存儲器分別由片選信號CS1和CS2選擇。顯示點(diǎn)在64*64液晶屏上的位置由行號(line,0~63)與列號(column,0~63)確定。512*8bitsRAM中某個存儲單元的地址由頁地址(Xpage,0~7)和列地址(Yaddress,0~63)確定。每個存儲單元存儲8個液晶點(diǎn)的顯示信息。

為了使液晶點(diǎn)位置信息與存儲地址的對應(yīng)關(guān)系更直觀關(guān),將64*64液晶屏從上至下8等分為8個顯示塊,每塊包括8行*64列個點(diǎn)陣。每列中的8行點(diǎn)陣信息構(gòu)成一個8bits二進(jìn)制數(shù),存儲在一個存儲單元中。(注意:二進(jìn)制的高低有效位順序與行號對應(yīng)關(guān)系因不同商家而不同)存放一個顯示塊的RAM區(qū)稱為存儲頁。即64*64液晶屏的點(diǎn)陣信息存儲在8個存儲頁中,每頁64個字節(jié),每個字節(jié)存儲一列(8行)點(diǎn)陣信息。因此存儲單元地址包括頁地址(Xpage,0~7)和列地址(Yaddress,0~63)。例如點(diǎn)亮128*64的屏中(20,30)位置上的液晶點(diǎn),因列地址30小于64,該點(diǎn)在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,該點(diǎn)在RAM中頁地址為2,在字節(jié)中的序號為4;所以將二進(jìn)制數(shù)據(jù)00010000(也可能是00001000,高低順序取決于制造商)寫入Xpage=2,Yaddress=29的存儲單元中即點(diǎn)亮(20,30)上的液晶點(diǎn)。

芯片的結(jié)構(gòu)一定要清楚!點(diǎn)陣LCD的顯示原理

在數(shù)字電路中,所有的數(shù)據(jù)都是以0和1保存的,對LCD控制器進(jìn)行不同的數(shù)據(jù)操作,可以得到不同的結(jié)果。對于顯示英文操作,由于英文字母種類很少,只需要8位(一字節(jié))即可。而對于中文,常用卻有6000以上,于是我們的DOS前輩想了一個辦法,就是將ASCII表的高128個很少用到的數(shù)值以兩個為一組來表示漢字,即漢字的內(nèi)碼。而剩下的低128位則留給英文字符使用,即英文的內(nèi)碼。

那么,得到了漢字的內(nèi)碼后,還僅是一組數(shù)字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數(shù)字,但它的意義卻與數(shù)字的意義有了根本的變化,它是用數(shù)字的各位信息來記載英文或漢字的形狀,如英文的'A'在字模的記載方式如圖1所示:

圖1“A”字模圖而中文的“你”在字模中的記載卻如圖2所示:

圖2“你”字模圖

圖3

圖4字符二級單元(圖3中陰影部分)

一個漢字的二級單元是一個16*16的區(qū)域,因些128*64液晶可以顯示4行8列共32個漢字(如圖3)。而它的一個二級單元如圖4(在無字庫時(shí),對漢字的取模有橫向跟縱向兩種,要注意),對于并行含有子庫芯片的顯示,只要設(shè)定好這個二級單元的地址(如0X80+i,這樣設(shè)定i的范圍為0~31,這里注意第一行會直接跳到第三行;或者根據(jù)自己需要如第二行0X90+i,i范圍為0~7;第三行0X88+i,i范圍為0~7;),然后直接把漢字寫入就OK了~(串行無字符庫的后面再做分析)

圖5:垂直坐標(biāo):上半屏00~1F,總共為32

水平坐標(biāo):上半屏水平坐標(biāo)分別為0X80+(00~07)

下半屏00~1F,總共為32

下半屏水平坐標(biāo)分別為0X88+(00~07)

圖片顯示芯片結(jié)構(gòu)分塊與漢字顯示不一樣

圖象顯示過程是這樣的:首先設(shè)置垂直地址,再設(shè)水平地址(連續(xù)寫入兩個字節(jié)的資料來完成垂直與水平的坐標(biāo)地址,然后在每個地址里寫入16位數(shù)據(jù))。垂直地址范圍AC5...AC0

水平地址范圍AC3…AC0

繪圖RAM的地址計(jì)數(shù)器(AC)只會對水平地址(X軸)自動加一,當(dāng)水平地址=0FH時(shí)會重新設(shè)為00H

但并不會對垂直地址做進(jìn)位自動加一,故當(dāng)連續(xù)寫入多筆資料時(shí),程序需自行判斷垂直地址是否需重新設(shè)定。GDRAM的坐標(biāo)地址與資料排列順序如圖5:分上下屏寫入。for(i=0;i<32;i++)

//上半屏32個垂直地址

{

write_com(0x80+i);

//

垂直地址write_com(0x80);

//

水平地址

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}}

帶中文字庫的128X64顯示模塊時(shí)應(yīng)注意以下幾點(diǎn):

①欲在某一個位置顯示中文字符時(shí),應(yīng)先設(shè)定顯示字符位置,即先設(shè)定顯示地址,再寫入中文字符編碼。

②顯示ASCII字符過程與顯示中文字符過程相同。不過在顯示連續(xù)字符時(shí),只須設(shè)定一次顯示地址,由模塊自動對地址加1指向下一個字符位置,否則,顯示的字符中將會有一個空ASCII字符位置。

③當(dāng)字符編碼為2字節(jié)時(shí),應(yīng)先寫入高位字節(jié),再寫入低位字節(jié)。

④模塊在接收指令前,向處理器必須先確認(rèn)模塊內(nèi)部處于非忙狀態(tài),即讀取BF標(biāo)志時(shí)BF需為“0”,方可接受新的指令。如果在送出一個指令前不檢查BF標(biāo)志,則在前一個指令和這個指令中間必須延遲一段較長的時(shí)間,即等待前一個指令確定執(zhí)行完成。指令執(zhí)行的時(shí)間請參考指令表中的指令執(zhí)行時(shí)間說明。⑤“RE”為基本指令集與擴(kuò)充指令集的選擇控制位。當(dāng)變更“RE”后,以后的指令集將維持在最后的狀態(tài),除非再次變更“RE”位,否則使用相同指令集時(shí),無需每次均重設(shè)“RE”位。

程序———————并行(串行后面再分析)——————————————————————————#include<stdio.h>

#include<reg52.h>

#include<intrins.h>

#include<string.h>#defineucharunsignedchar

#defineuintunsignedintucharcodeLCD_data1[];

ucharcodeLCD_data2[];

ucharcodeLCD_picture1[];

ucharcodeLCD_picture2[];sbitRS=P2^4;

sbitRW=P2^5;

sbitEN=P2^6;

sbitPSB=P2^1;

sbitRES=P2^3;sbitDataport=P0;

sbitBusyport=P0^7;//////////////////////////////////////////////////////////////

void

delay_ms(unsignedintn)

//延時(shí)10×n毫秒程序

{

unsignedinti,j;

for(i=0;i<n;i++)

for(j=0;j<2000;j++);

}void

delay(unsignedintm)

//1US延時(shí)程序

{

unsignedinti,j;

for(i=0;i<m;i++)

for(j=0;j<10;j++);

}

///////////////////////////////////////////////////////////////

//判LCM忙子函數(shù)voidcheck_LCD_busy(void)

{

Dataport=0xff;

RS=0;

RW=1;

EN=1;

while(Busyport);

EN=0;

}

///////////////////////////////////////////////////////////////

//寫命令子函數(shù)voidwrite_com(ucharCommand)

{

check_LCD_busy();

RW=0;

RS=0;

delay(1);

P0=Command;

EN=1;

delay(1);

EN=0;

}

////////////////////////////////////////////////////////////////

//寫數(shù)據(jù)子函數(shù)voidwrite_data(ucharData)

{

check_LCD_busy();

RW=0;

RS=1;

delay(1);

P0=Data;

EN=1;

delay(1);

EN=0;

}

/////////////////////////////////////////////////////////////////

//LCM清屏函數(shù)voidlcdClear(void)

{

write_com(0x01);

}

////////////////////////////////////////////////////////////////

//LCM復(fù)位函數(shù)voidreset()

{

RES=0;

//復(fù)位

delay(1);

//延時(shí)

RES=1;

//復(fù)位置高

delay(10);

}

///////////////////////////////////////////////////////////////

//顯示漢字voiddispString(ucharX,Y,uchar*msg)

//X為哪一行,Y為哪一列。msg為漢字

{

if(X==0)

X=0x80;

//第一行,漢字顯示坐標(biāo)

elseif(X==1)X=0x90;//第二行

elseif(X==2)X=0x88;//第三行

else

X=0x98;//第四行

Y=X+Y;

//Y為1往右移一位

write_com(Y);

//寫入坐標(biāo)

while(*msg)

{

write_data(*msg++);//顯示漢字

}

}

///////////////////////////////////////////////////////////////

//顯示圖象

voiddisppicture(ucharcode*adder)

{

uinti,j;

//*******顯示上半屏內(nèi)容設(shè)置

for(i=0;i<32;i++)

//上半屏32個列地址

{

write_com(0x80+i);

//SET

垂直地址VERTICALADD

write_com(0x80);

//SET

水平地址HORIZONTALADD

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

//*******顯示下半屏內(nèi)容設(shè)置

for(i=0;i<32;i++)

//

{

write_com(0x80+i);

//SET垂直地址VERTICALADD

write_com(0x88);

//SET水平地址HORIZONTALADD

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

}///////////////////////////////////////////////////////////////

//LCD字庫初始化函數(shù)voidlcdinit_str(void)

{

delay(40);

//大于40MS的延時(shí)程序

PSB=1;

//設(shè)置為8BIT并口工作模式

delay(1);

//延時(shí)

reset();

//復(fù)位

write_com(0x30);

//ExtendedFunctionSet:8BIT設(shè)置,RE=0:basicinstructionset,G=0:graphicdisplayOFF

delay(100);

//大于100uS的延時(shí)程序

write_com(0x30);

//FunctionSet

delay(37);

////大于37uS的延時(shí)程序

write_com(0x08);

//DisplayonControl

delay(100);

//大于100uS的延時(shí)程序

write_com(0x10);

//CursorDisplayControl光標(biāo)設(shè)置

delay(100);

//大于100uS的延時(shí)程序

write_com(0x0C);

//DisplayControl,D=1,顯示開

delay(100);

//大于100uS的延時(shí)程序

write_com(0x01);

//DisplayClear

delay(10);

//大于10mS的延時(shí)程序

write_com(0x06);

//EnryModeSet,光標(biāo)從右向左加1位移動

delay(100);

//大于100uS的延時(shí)程序

}

//////////////////////////////////////////////////////////////////

//LCD圖片(擴(kuò)展)初始化函數(shù)voidlcdinit_pic(void)

{

delay(40);

//大于40MS的延時(shí)程序

PSB=1;

//設(shè)置為8BIT并口工作模式

delay(1);

//延時(shí)

reset();

write_com(0x36);

//ExtendedFunctionSetRE=1:extendedinstruction

delay(100);

//大于100uS的延時(shí)程序

write_com(0x36);

//ExtendedFunctionSet:RE=1:extendedinstructionset

delay(37);

////大于37uS的延時(shí)程序

write_com(0x3E);

//EXFUNCTION(DL=8BITS,RE=1,G=1)

delay(100);

//大于100uS的延時(shí)程序

write_com(0x01);

//CLEARSCREEN

delay(100);

//大于100uS的延時(shí)程序

}

/////////////////////////////////////////////////////////////////voidmain()

{

while(1)

{

lcdinit_str();

delay_ms(10);//此延時(shí)如果沒有的話第一行會一直在第一列

dispString(0,1,"祖國江山好");

delay_ms(10);

dispString(1,1,"愛情少不了");

delay_ms(10);

dispString(2,1,"為了下一代");

delay_ms(10);

dispString(3,1,"趕緊談戀愛");

delay_ms(200);

delay_ms(200);

lcdClear();

delay_ms(10);

dispString(0,1,"大名吳建峰");

delay_ms(10);

dispString(1,1,"性別為非女");

delay_ms(10);

dispString(2,1,"芳齡二十二");

delay_ms(10);

dispString(3,1,"海拔一百六");

delay_ms(200);

delay_ms(200);

lcdinit_pic();

lcdClear();

delay_ms(10);

disppicture(LCD_picture1);

delay_ms(300);

delay_ms(300);

}

}

圖象代碼庫見最后!~

成果——————————————————————————————————

圖形取模方法(轉(zhuǎn)):128*64的像素能顯示的內(nèi)容就有限,也無法要求它能多清楚,如果將一個彩色的圖片轉(zhuǎn)換為單色位圖,效果就更差了,個人不建議用它來顯示彩色的圖片,如果真要用128*64的液晶顯示,建議如下:

1.盡量選擇顏色比較單一的圖片,當(dāng)然一種顏色的效果最好不過了;

2.圖片不能選擇的太大,要不縮小了就看不清楚了;

3.圖片的調(diào)整可以這樣(僅供參考):

1>調(diào)整圖片的寬高比大致為2:1;

2>將圖片縮小到128*64像素;

3>保存為單色位圖;

圖片的大小縮放不太好操作,我通常是這樣做的:你用畫圖程序打開你要顯示的圖片后,首先要操作的查看屬性(點(diǎn)擊菜單欄的圖像->屬性,單位選擇為像素后,寬高值就出來了),比如:寬:603,高:444,這顯然寬高比不是2:1,你就要調(diào)整了,444*2=888,現(xiàn)在為603,所以888/603=1.47,所以寬要放大為147%(點(diǎn)擊菜單欄的圖像->拉伸/扭曲,在拉伸里面的水平處改為147),現(xiàn)在就調(diào)整為2:1了;接下來就要將圖片縮小到128*64像素,先計(jì)算縮放的比例,128/888=0.144,所以相同的操作(點(diǎn)擊菜單欄的圖像->拉伸/扭曲,在拉伸里面的水平處改為14,垂直里面也要改為14);最后就是保存為單色位圖(文件->另存為->文件類型選擇為:單色位圖(.bmp))?試過顏色比較單一的,效果還可以,復(fù)雜的彩色圖片效果就很不理想了...

說明:在調(diào)整圖片的寬高比大致為2:1的過程中圖片會被拉伸變形,不過縮小到128*64像素后也不是太明顯...

圖片取模

圖片代碼——————————————————————————————————

ucharcodeLCD_picture1[]=

{

0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,

0x00,0x00,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,

0x03,0x00,0x07,0xEC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x37,0x80,

0x03,0x00,0x00,0xEC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x3F,0xC0,

0x03,0x00,0x0F,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x79,0x80,

0x03,0x00,0x0F,0x6B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x7F,0x00,

0x1F,0xF4,0x01,0xE9,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0xE0,0x18,0xFF,0x80,

0x1F,0xFC,0x00,0xFB,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0xC6,0x70,0x1B,0x1E,0xC0,

0x03,0x38,0x01,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x86,0x38,0xDB,0xFF,0xE0,

0x03,0x70,0x07,0x9E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x26,0x18,0xDB,0x8C,0x70,

0x7F,0xFF,0x87,0x27,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x01,0xFF,0xFF,0xB8,

0x7F,0xFF,0x80,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x0C,0x18,

0x07,0x80,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xFF,0xE0,

0x0F,0x00,0x00,0xFB,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF0,0xFF,0xE0,

0x1F,0x30,0x01,0xCF,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x0C,0x00,

0x3B,0x36,0x03,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xCC,0x00,

0x73,0x76,0x03,0x3F,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFC,0x00,

0x63,0xE6,0x00,0x3F,0xFF,0xFF,0xDC,0x80,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFC,0x00,

0x03,0xFE,0x00,0x7F,0xFF,0xFF,0xAF,0x60,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFC,0x00,

0x03,0xFE,0x00,0xFF,0xFF,0xFF,0xF5,0xC0,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFC,0x00,

0x00,0x00,0x01,0xFF,0xFF,0xFF,0x23,0x20,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFE,0x00,

0x00,0x00,0x03,0xFF,0x8F,0xE3,0xEC,0xA0,0x00,0x00,0x03,0xFF,0x1F,0xC7,0xFF,0x00,

0x00,0x00,0x03,0xFF,0x07,0xC1,0x92,0xC0,0x00,0x00,0x07,0xFE,0x0F,0x83,0xFF,0x80,

0x00,0x00,0x07,0xFF,0x03,0xC0,0xE9,0xC0,0x00,0x00,0x0F,0xFE,0x07,0x81,0xFF,0x80,

0x00,0x00,0x07,0xFE,0x03,0x80,0xED,0xE0,0x00,0x00,0x0F,0xFC,0x07,0x01,0xFF,0xC0,

0x00,0x00,0x0F,0xFE,0x1B,0xB0,0xDD,0xE0,0x00,0x00,0x1F,0xFC,0x37,0x61,0xFF,0xC0,

0x00,0x00,0x0F,0xFE,0x1B,0xB0,0xFF,0xE0,0x00,0x00,0x1F,0xFC,0x37,0x61,0xFF,0xC0,

0x00,0x00,0x0F,0xFE,0x1B,0xB0,0xFF,0xF0,0x00,0x00,0x1F,0xFC,0x37,0x61,0xFF,0xE0,

0x00,0x00,0x1F,0xFE,0x1B,0xB0,0xFF,0xF0,0x00,0x00,0x3F,0xFC,0x37,0x61,0xFF,0xE0,

0x00,0x00,0x1F,0xFF,0x03,0xC0,0xFF,0xF0,0x00,0x00,0x3F,0xFE,0x07,0x81,0xFF,0xE0,

0x00,0x00,0x1F,0xFF,0x07,0xC1,0xFF,0xF0,0x00,0x00,0x3F,0xFE,0x0F,0x83,0xFF,0xE0,

0x00,0x00,0x1F,0xFF,0x8C,0x63,0xFF,0xF0,0x00,0x00,0x3F,0xFF,0x1F,0xC7,0xFF,0xE0,

0x00,0x00,0x1F,0xDF,0xFC,0x7F,0xF7,0xF0,0x00,0x00,0x3F,0xFF,0xF0,0x7F,0xFF,0xE0,

0x00,0x00,0x1F,0x07,0xFF,0xFF,0xD1,0xF0,0x00,0x00,0x3F,0xFF,0xE0,0x3F,0xFF,0xE0,

0x00,0x00,0x1E,0x03,0xFF,0xFF,0x80,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x07,0xE0,

0x00,0x00,0x1E,0x03,0xFE,0xFF,0xC0,0xF0,0x00,0x00,0x3F,0xE0,0x00,0x00,0x0F,0xE0,

0x00,0x00,0x0C,0x01,0xF8,0x3F,0x80,0xE0,0x00,0x00,0x1F,0xE0,0x00,0x00,0x1F,0xC0,

0x00,0x00,0x0E,0x03,0xF0,0x1F,0xC0,0xE0,0x00,0x00,0x1F,0xF0,0x0F,0xC0,0x1F,0xC0,

0x00,0x00,0x1E,0x03,0xF0,0x1F,0x80,0xE0,0x00,0x00,0x1F,0xFC,0x0B,0x40,0x7F,0xC0,

0x00,0x00,0x7F,0x1F,0xF0,0x1F,0xC3,0xE0,0x00,0x00,0xFF,0xFF,0x0B,0x41,0xFF,0xC0,

0x00,0x00,0xFF,0xFF,0xF0,0x1F,0xF7,0xF0,0x00,0x01,0xFF,0xFF,0xC0,0x0F,0xFF,0xF0,

0x00,0x01,0xFF,0xFF,0xF8,0x3F,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xF8,0x7F,0xFF,0xF8,

0x00,0x03,0xFE,0x7F,0xFE,0xFF,0xFF,0xFE,0x00,0x07,0xFC,0xFF,0xFF,0xFF,0xFF,0xFC,

0x00,0x07,0xFC,0x1F,0xFF,0xFF,0xF8,0xFE,0x00,0x0F,0xF8,0x3F,0xFF,0xFF,0xF1,0xFC,

0x00,0x0F,0xF8,0x07,0xFF,0xFF,0xE0,0xFF,0x00,0x1F,0xF0,0x0F,0xFF,0xFF,0xC0,0xFE,

0x00,0x0F,0xF8,0x00,0xFF,0xFF,0x00,0x7F,0x80,0x1F,0xF0,0x01,0xFF,0xFE,0x00,0xFF,

0x00,0x1F,0xF0,0x00,0x02,0x00,0x00,0x7F,0x80,0x3F,0xE0,0x00,0x00,0x00,0x00,0x7F,

0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,0x7F,

0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x7F,0xE0,0x00,0x00,0x00,0x00,0x7F,

0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x1F,0xE0,0x7F,0xC0,0x00,0x00,0x00,0x00,0x3F,

0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x1F,0xE0,0x7F,0xC0,0x00,0x00,0x00,0x00,0x3F,

0x00,0x7F,0xE0,0x01,0xC0,0xE0,0x00,0x1F,0xE0,0xFF,0xC0,0x00,0x70,0xE0,0x00,0x3F,

0x00,0x7F,0xE0,0x03,0xF3,0xF0,0x00,0x1F,0xE0,0xFF,0xC0,0x00,0xF9,0xF0,0x00,0x3F,

0x00,0x7F,0xE0,0x07,0xFF,0xF8,0x00,0x1F,0xE0,0xFF,0xC0,0x01,0xFF,0xF8,0x00,0x3F,

0x00,0x7F,0xE0,0x07,0xFF,0xF8,0x00,0x1F,0xE0,0xFF,0xC0,0x01,0xFF,0xF8,0x00,0x3F,

0x00,0x7C,0xE0,0x07,0xFF,0xF8,0x00,0x1B,0xE0,0xF9,0xC0,0x01,0xFF,0xF8,0x00,0x37,

0x00,0x38,0xF0,0x03,0xFF,0xF0,0x00,0x39,0xE0,0xF1,0xE0,0x00,0xFF,0xF0,0x00,0x73,

0x00,0x30,0x70,0x01,0xFF,0xE0,0x00,0x30,0xC0,0x60,0xE0,0x00,0x7F,0xE0,0x00,0x61,

0x00,0x00,0x78,0x00,0xFF,0xC0,0x00,0x30,0x00,0x00,0xF0,0x00,0x3F,0xC0,0x00,0x60,

0x00,0x00,0x38,0x00,0x7F,0x80,0x00,0x60,0x00,0x00,0x70,0x00,0x1F,0x80,0x00,0xC0,

0x00,0x00,0x1C,0x00,0x3F,0x00,0x00,0xC0,0x00,0x00,0x38,0x00,0x0F,0x00,0x01,0x80,

0x00,0x00,0x0E,0x00,0x1E,0x00,0x00,0x80,0x00,0x00,0x1C,0x00,0x06,0x00,0x01,0x00,

0x00,0x00,0x07,0x00,0x0C,0x00,0x01,0x80,0x00,0x00,0x0E,0x00,0x06,0x00,0x03,0x00,

};12864液晶原理分析2專業(yè)—51單片機(jī)2010-02-2414:58:05閱讀165評論5字號:大中小[轉(zhuǎn)自本人QQ空間發(fā)表于2009年09月04日21:52]一、接口引腳(注意并口與串口)

二、接線方式

1、并口直接訪問

2、并口間接訪問

3、串口訪問

三、文本(漢字,字符)輸入1、文本顯示RAM(DDRAM)文本顯示RAM提供8個×4行的漢字空間,當(dāng)寫入文本顯示RAM時(shí),可以分別顯示CGROM、HCGROM與CGRAM的字型;

根據(jù)漢字顯示坐標(biāo)可以很容易地顯示漢字以及其它字符~

四、圖象輸入

1、繪圖RAM(GDRAM)

繪圖顯示RAM提供128×8個字節(jié)的記憶空間,在更改繪圖RAM時(shí),先連續(xù)寫入水平與垂直的坐標(biāo)值,再寫入兩個字節(jié)的數(shù)據(jù)到繪圖RAM,而地址計(jì)數(shù)器(AC)會對水平地址(X地址)自動加一,當(dāng)水平地址為0XFH時(shí)會重新設(shè)為00H;不會對垂直地址做進(jìn)位自動加1.。在寫入繪圖RAM的期間,繪圖顯示必須關(guān)閉,整個寫入繪圖RAM的步驟如下:

1、關(guān)閉繪圖顯示功能。

2、先將水平的位元組坐標(biāo)(X)寫入繪圖RAM地址;

再將垂直的坐標(biāo)(Y)寫入繪圖RAM地址;

將D15——D8寫入到RAM中;

將D7——D0寫入到RAM中;

打開繪圖顯示功能。

繪圖顯示的緩沖區(qū)對應(yīng)分布請參考“GDRAM坐標(biāo)”

GDRAM地址坐標(biāo)對于圖象顯示,這個地址表才是王道

水平方向X—以字節(jié)單位(2字節(jié)16位)

垂直方向Y—以位為單位

屏幕分上下兩屏,垂直坐標(biāo)上下屏都為Y:00—1F(也即0X80+Y),以位為單位;水平坐標(biāo)上半屏為X1:00—07(也即0X80+X1);下半屏為X2:08—0F(也0X80+X2)

由圖可以看到水平坐標(biāo)一個單位是兩字節(jié)(即16位D15~D0),X地址會自動加1,是直接加一個單位(即兩字節(jié)16位),比如00—》01(也即0X80+00—》0X80+01),從第一行第一列跳到第一行第二列。

(1)、整屏圖象顯示程序:voiddisppicture(ucharcode*adder)

{

uinti,j;

//*******顯示上半屏內(nèi)容設(shè)置

for(i=0;i<32;i++)

{

write_com(0x80+i);//垂直地址VERTICALADD

write_com(0x80);

//

水平地址HORIZONTALADD

for(j=0;j<16;j++)

//X坐標(biāo)方向以2字節(jié)為單位,Y坐標(biāo)方向以1位為單位,先連續(xù)寫入垂直與水平坐標(biāo),

{

//再寫入兩字節(jié)數(shù)據(jù)到GDRAM。這里是這樣進(jìn)行的:i=0時(shí),j=0,1時(shí),寫入兩字節(jié)到垂直(0X80+00)水平(0X80+00)這格(D15~D0)里;然后X坐標(biāo)地址自增1,地址變?yōu)榇怪保?X80+00)水平(0X80+01)這格,在j=2,3時(shí)寫入兩字節(jié),………一直到垂直(0X80+00)水平(0X80+07)這格,在j=14,15時(shí)寫入兩字節(jié),此時(shí)循環(huán)for(j=0;j<16;j++)結(jié)束跳出,剛好第一行128位寫完數(shù)據(jù);然后i++,開始寫第二行…

write_data(*adder);

adder++;

}

}

//*******顯示下半屏內(nèi)容設(shè)置

for(i=0;i<32;i++)

//

{

write_com(0x80+i);

//SET垂直地址

下半屏的垂直地址中上半屏一樣是0X80+Y(Y:00~1F)

write_com(0x88);

//SET水平地址

下半屏的水平地址是從0X80+08=0X88開始的

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

}

整屏圖形:

……(2)分塊圖形顯示

程序:

voidanti_nor_pic(ucharcpl_sign,ucharmenu_num)

{

uchari,j,x,y;

x=menu_num*3;

//計(jì)算圖片顯示坐標(biāo),由坐標(biāo)圖知圖片0/1/2/3/4/5的X坐標(biāo)分別

if(x>6)x--;

//為0X80+(00,03,06,08,0B,0E)

if(menu_num<3)y=16;

//0、1、2號圖片Y坐標(biāo)起始為0X80+16(上半屏從上往下第16行)

elsey=8;

//3、4、5號圖片Y坐標(biāo)起始為0X80+8(下半屏從上往下第8行)

if(cpl_sign==1)display_cnasc(0x82,4,menu_cn[menu_num]);

for(j=0;j<24;j++)

//圖片32*24(寬*高),即有24行

{

for(i=0;i<2;i++)

//一張圖片在X方向上占兩個單位(一個單位即16位兩字節(jié))在寫

{

//完一個單位后要向下一個單位寫,因?yàn)檫@里不是全屏顯示,要設(shè)定

wr_lcd(comm,0x34);

//關(guān)閉繪圖顯示功能

wr_lcd(comm,0x80+y);

//垂直地址

wr_lcd(comm,0x80+x+i);

//水平地址,事實(shí)上這里i可以不要,因?yàn)樗降刂窌詣蛹?,

wr_lcd(comm,0x30);

//但因?yàn)槭欠謮K,要有個for(i=0;i<2;i++)的循環(huán)。

if(cpl_sign==1)

//圖片反選

{

wr_lcd(dat,~menu_pic[menu_num][j*4+i*2]);

//寫入一字節(jié)

wr_lcd(dat,~menu_pic[menu_num][j*4+i*2+1]);

//再寫入一字節(jié)

}

else

//正常顯示

{

wr_lcd(dat,menu_pic[menu_num][j*4+i*2]);

wr_lcd(dat,menu_pic[menu_num][j*4+i*2+1]);

}

}

y++;

//垂直地址要由軟件設(shè)定自動加1

if(y==32&&menu_num<3){x+=8;y=0;}

//上下屏切換。0/1/2三幅圖Y坐標(biāo)由16加了

}

//16行,跳入下半屏,水平坐標(biāo)X變成0X80+08,垂直坐標(biāo)變成0X80+00

wr_lcd(comm,0x36);

}

分塊圖形(旁邊還未處理)待續(xù)……一、ST7920控制IC的LCD12864實(shí)現(xiàn)反白顯示

從使用手冊上可知,擴(kuò)展指令里的0x03+行號即可實(shí)現(xiàn)反白對應(yīng)行。但是ST7920控制器的128×64點(diǎn)陣液晶其實(shí)原理上等同256×32點(diǎn)陣,第三行對應(yīng)的DDRAM地址緊接第一行;第四行對應(yīng)的DDRAM地址緊接第二行。所以128×64點(diǎn)陣的液晶執(zhí)行反白功能時(shí)實(shí)用意義不大,因?yàn)橛脩魧Φ谝恍袌?zhí)行反白顯示操作時(shí),第三行必然也反白顯示;第二行反白,第四行也必然反白。

其實(shí)還是有辦法做到單行反白的,解決方法就是混用圖形顯示和字符顯示。其理論支持在于:在ST7920中,字符顯示的DDRAM和圖形的GDRAM是相互獨(dú)立的,而最后顯示到液晶上的結(jié)果,是兩個RAM中數(shù)據(jù)的異或。

具體來說:假如某個點(diǎn)上,繪圖RAM的沒有繪圖(數(shù)據(jù)為0),而字符RAM上有點(diǎn)陣(數(shù)據(jù)為1),那么異或的結(jié)果就是1,也就是說正常顯示字符;當(dāng)字符上RAM沒有點(diǎn)陣的時(shí)候,異或的結(jié)果是0,自然也就不顯示了。假如該點(diǎn)上繪圖RAM繪圖了(數(shù)據(jù)為1),當(dāng)字符RAM上有點(diǎn)陣(數(shù)據(jù)為1時(shí)),異或的結(jié)果為0,效果就是反白顯示;如果字符RAM沒有點(diǎn)陣(數(shù)據(jù)為0時(shí)),異或結(jié)果為1,效果就是顯示繪圖的背景。

所以,如果要在某個地方反白顯示,那么就在該點(diǎn)繪圖并且寫字,如果要取消反白,就重新用全0擦掉那個地方的繪圖!這樣一來可以實(shí)現(xiàn)任何地方、任意大小的反白顯示,反而比原指令中的單行反白的功能更好更強(qiáng)大。

二、對于整屏既有圖象又有文本,則可以用兩種方式實(shí)現(xiàn):

1、

首先文本DDRAM寫入要寫的字符,其余全部空格(即0X00),然后再在沒有字符的地方(即非點(diǎn)亮的晶格中,0X00)繪入圖象。DDRAM與GDRAM異或后就可以整屏實(shí)現(xiàn)圖象與文本。參見程序?qū)嵗?。

2、

首先圖象GDRAM繪入要繪的圖象,其余全部用con_disp()反白(或顯示圖象)函數(shù)(見程序?qū)嵗?)寫入0X00,然后再在沒有圖象的地方(即0X00)處寫入文本。同樣DDRAM與GDRAM異或后就可以整屏實(shí)現(xiàn)圖象與文本。參見程序?qū)嵗?.注意:根據(jù)最后顯示到液晶上的結(jié)果,是兩個RAM中數(shù)據(jù)的異或結(jié)果,我們可以知道,con_disp()反白(或顯示圖象)函數(shù)只能對文本字符進(jìn)行反白,而不能對圖形進(jìn)行反白,因?yàn)閏on_disp()反白(或顯示圖象)函數(shù)本身是一個繪圖函數(shù),數(shù)據(jù)是寫到GDRAM中去,只能與DDRAM(文本)異或,而不能與GDRAM(圖象)異或。那么圖象如何反白呢?我們在繪入圖象時(shí)可以用按位取反符號“~”,如write_data(~date),這樣就可以對你要繪入的圖象進(jìn)行取反了!如果用con_disp()反白(或顯示圖象)函數(shù)對GDRAM進(jìn)行反白,就會出現(xiàn)重疊覆蓋現(xiàn)象,如下圖:

。。。第一幅圖被反白函數(shù)覆蓋了

//////////////////////////////////////////////////

程序?qū)嵗?:(con_disp()反白(或顯示圖象)函數(shù))//反白或顯示圖片參數(shù)格式:(H)8bit數(shù)據(jù),(L)8bit數(shù)據(jù),X0坐標(biāo)(16bit),Y0坐標(biāo)(1bit),X坐標(biāo)(16bit),Y坐標(biāo)(1bit)*/

voidcon_disp(uchardata1,uchardata2,ucharx0,uchary0,ucharxl,ucharyl)

{

uchari,j;

for(j=0;j<yl;j++)

{

for(i=0;i<xl;i++)

{

write_com(0x34);

//擴(kuò)展功能

write_com(y0+j);

//寫Y坐標(biāo)

write_com(x0+i);

//寫X坐標(biāo)

write_com(0x30);

//普通功能

write_data(data1);

write_data(data2);

}

}

write_com(0x36);

//開繪圖顯示

}

1、這個函數(shù),X0,Y0是左上角坐標(biāo),X1,Y1分別是列數(shù)(水平坐標(biāo))和行數(shù)(垂直坐標(biāo))。因?yàn)樗阶鴺?biāo)是以二字節(jié)(16位)為單位,一次性要寫入兩字節(jié)(data1,data2),因此如果要反白則(data1,data2都為0XFF),如果要繪圖(data1,data2可以為其它,此繪圖函數(shù)主要用來繪制導(dǎo)航標(biāo)頭的)。

2、寫入資料到內(nèi)部RAM(包括DDRAM、GDRAM等)是基本操作指令,因此之前

要寫write_com(0X30);

寫DDRAM地址是基本操作指令,因此之前要寫write_com(0X30);

寫GDRAM地址是擴(kuò)展操作指令,因此之前要寫write_com(0X34);(此時(shí)要關(guān)繪圖顯示),然后寫完GDRAM數(shù)據(jù),最后要開繪圖顯示write_com(0X36);/////////////////////////////////////////////////////////

程序?qū)嵗?:(先文本再繪圖)///////////////////////////////////////////////////////////

//圖片菜單標(biāo)頭

voiddis_title_pic()

{

display_cnasc(0x80,"〓〓");

display_cnasc(0x82,"調(diào)

整");

display_cnasc(0x86,"〓〓");

//第一行為文本

display_cnasc(0x90,"

");

//第二行空格(即0X00)

display_cnasc(0x88,"

");

//第三行空格(即0X00)

display_cnasc(0x98,"

");

//第四行空格(即0X00)

}voidmain()

{

init_lcd();

dis_title_pic();

//首先顯示圖片菜單標(biāo)頭,即先全屏覆蓋文本

for(d=0;d<6;d++)

//然后再繪入六幅圖片

{

if(d==0)disppicture(1,d);

//disppicture()函數(shù)見個人資料12864分析2

else

disppicture(0,d);

}

}

~~~

////////////////////////////////////////////

程序?qū)嵗?:(先繪圖再文本)

/////////////////////////////////////////////

//圖片菜單標(biāo)頭

voiddis_title_pic()

{

display_cnasc(0x80,"〓〓");

display_cnasc(0x82,"調(diào)

整");

display_cnasc(0x86,"〓〓");

}voidmain()

{

Init_lcd();

for(d=0;d<6;d++)

//繪入圖象

{

if(d==0)disppicture(1,d);

//第一幅圖反白

else

disppicture(0,d);

//其余不反白

}

con_disp(0x00,0x00,0X80,0x80,8,16);

con_disp(0x00,0x00,0X82,0x80+16,1,16);

con_disp(0x00,0x00,0X85,0x80+16,1,16);

con_disp(0x00,0x00,0X8a,0x80,1,32);

con_disp(0x00,0x00,0X8d,0x80,1,32);

dis_title_pic();

//寫入文本}

~~~/////////////////////////////////////////////

程序?qū)嵗?:對于for(d=0;d<6;d++),我想也可以一個一個拆出來寫,試驗(yàn)下反白結(jié)果

voiddis_title_pic()

{

display_cnasc(0x80,"〓〓");

display_cnasc(0x82,"調(diào)

整");

display_cnasc(0x86,"〓〓");

}voidmain()

{

init_lcd();

disppicture(1,0);

//第一幅圖反白顯示

disppicture(0,1);

//第二幅圖正常顯示

disppicture(1,2);

//第三幅圖反白顯示

disppicture(0,3);//第四幅圖正常顯示

disppicture(1,4);//第五幅圖反白顯示

disppicture(0,5);//第六幅圖正常顯示

con_disp(0x00,0x00,0X80,0x80,8,16);

//GDRAM其余地方寫入0X00

con_disp(0x00,0x00,0X82,0x80+16,1,16);

con_disp(0x00,0x00,0X85,0x80+16,1,16);

con_disp(0x00,0x00,0X8a,0x80,1,32);

con_disp(0x00,0x00,0X8d,0x80,1,32);

dis_title_pic();

//寫入文本

~~1、3、5圖反白顯示~至此,通過以上繪圖原理以、反白原理和四個例程,就可以在12864液晶上任何位置顯示圖象或文本,可以隨意對液晶上任意塊塊進(jìn)行反白顯示,所以,可以通過12864液晶完成類似MP3顯示屏上的各種操作:進(jìn)入菜單頁面,通過按鍵選擇,被選擇的模塊反白,若MEU鍵按下剛進(jìn)入此菜單(比如時(shí)鐘)下面的頁面,然后再進(jìn)行各種設(shè)置……

當(dāng)然,還有很多問題尚未解決,其中一個:就是單單寫入文本(不占全屏),不出現(xiàn)花屏;而單單繪入圖象(不占全屏)時(shí),就會出現(xiàn)花屏,見下圖……(可能是:繪圖GDRAM要寫入全屏數(shù)據(jù),若只有部分?jǐn)?shù)據(jù),則其余地方芯片不知道寫入什么就會隨機(jī)寫入,然后出現(xiàn)花屏;而文本DDRAM本身芯片已經(jīng)有了一個分塊控制。而12864液晶不同的控制芯片具體情況不一樣),當(dāng)然我還不確定,有待以后繼續(xù)分析……

~~那么右邊這塊沒有花屏的顯示是根據(jù)程序?qū)嵗?,3作出來的,運(yùn)用GDRAM與DDRAM相異或原理,就是把左邊花屏處用con_disp()反白(或顯示圖象)函數(shù)全部繪0X00.~~~……好吧,暫時(shí)告一段落先……理解到這程度已經(jīng)死了好大一批腦細(xì)胞了……看到工具箱旁邊那個LCD12864很久沒用了(當(dāng)初買回來用的時(shí)候只是簡單地測試了一下),于是萌生了重新寫一次接口程序的想法(而且這次要給它加個圖片顯示的功能),好,說做就做,就用Atmega16和ICCAVR來做吧,最近這MCU和平臺用得比較熟練。

馬上從書堆里把當(dāng)初打印出來的中文datasheet給翻了出來,依葫蘆畫瓢地寫了個初始化程序。好,OK。編譯通過。于是又寫了一個可以自定義從XY坐標(biāo)值開始輸出顯示的函數(shù),再次編譯,也通過,OK。于是呼馬上寫了四行簡單的字符燒到單片機(jī)上試了一下,嘿嘿,一次通過。如下圖:

后來在進(jìn)一步測試的時(shí)候也出了點(diǎn)小問題。就是我是使用USBISP燒寫器把程序燒寫進(jìn)AVR的(此時(shí)實(shí)驗(yàn)板由USBISP燒寫器供電),想要實(shí)現(xiàn)從第一行的第一個字符開始連續(xù)顯示"0123456789"。剛燒寫完程序后能看到LCD12864上正常顯示"0123456789",但是把燒寫器從實(shí)驗(yàn)板上斷開連接,單獨(dú)用USB給實(shí)驗(yàn)板供電的時(shí)候,LCD的第一行只是顯示"123456789",第一個字符消失了……,左思右想地弄了一個多小時(shí)后,終于把問題給解決了,就是把初始化程序的延時(shí)適當(dāng)增加了些,真是奇怪。剛開始一直想不通為什么在燒寫器供電的情況下就正常顯示,而換到USB供電后就出了問題。后來再想想,估計(jì)是跟供電有關(guān)。在使用USBISP燒寫器供電的時(shí)候,LCD的背光燈明顯比用USB供電的時(shí)候來得亮,而且對比度也高很多,看來是因?yàn)閾Q到USB供電后,供電不怎么充足,以至于LCD在上電初始化的時(shí)候花上了更多的時(shí)間去初始化(因?yàn)楣╇姷土耍β市×?,跑起來有點(diǎn)力不從心,用的時(shí)間就久了嘛……我是覺得可以這樣去理解的)

接下來呢,就到了有點(diǎn)難度的畫圖了。當(dāng)初剛買到12864的時(shí)候只是簡單測試了字符顯示功能,除了因?yàn)楫媹D還不需要用到,另外一個原因就是那datasheet上關(guān)于畫圖那部分的內(nèi)容不怎么看得懂……?,F(xiàn)在重新拿起來看,依然一頭霧水……。馬上上網(wǎng)百度了一下“128647920顯示圖片”,看到了不少的例子程序,可是……就是沒看到有關(guān)于這部分功能實(shí)現(xiàn)的詳細(xì)思路和講解……下載下來的那些程序,基本上沒注釋,不是說晦澀難懂,但是至少看起來一團(tuán)糟,讓人家不想繼續(xù)看下去……于是還是硬著頭皮去啃那datasheet。上面對于畫圖這部分的內(nèi)容是這樣講解的:在仔細(xì)研究了上面關(guān)于它的X啊Y啊那些坐標(biāo)的定位啊寫滿了哪些地址會自增啊哪些不會啊什么的,最后感覺腦袋里有了一種朦朧的概念……喲西,反正不會弄壞,就先隨便寫個程序試試。

于是乎,嘀咕嘀咕……搗鼓搗鼓……反反復(fù)復(fù)又弄了一個多小時(shí)后,終于摸清了它顯示的規(guī)律……

LCD12864實(shí)現(xiàn)畫圖功能的思路:

首先,畫圖指令屬于擴(kuò)充指令集,要使用這些指令必須在12864初始化之后寫命令字(0x34????36吧)進(jìn)入擴(kuò)充指令集設(shè)定狀態(tài)。

接著要做的事就是指定我們的圖片要從哪里寫入(即寫入的XY坐標(biāo),這個是最關(guān)鍵,也是最難理解的部分)。因?yàn)槲覀冞@里是顯示一整個畫面的圖片,所以我們就從12864的第一個點(diǎn)開始顯示。那這個點(diǎn)的坐標(biāo)是怎么定位的呢?我們往這個點(diǎn)寫入數(shù)據(jù)后,要是接著再寫數(shù)據(jù),那坐標(biāo)值會怎樣變化呢?首先我們要弄清楚12864究竟是怎么把數(shù)據(jù)寫入到GDRAM(繪圖顯示RAM)中去的。12864(ST7920驅(qū)動芯片)把屏幕分成上下兩部分(如上圖中把垂直坐標(biāo)分成了兩部分的00~1F)。當(dāng)我們把坐標(biāo)值寫給LCD后(怎么寫后面會說),ST7920控制芯片對LCD屏幕的控制過程可以用下面的圖片來表示:(后來發(fā)現(xiàn)下面那幅圖片有點(diǎn)問題……它這里在水平坐標(biāo)上的00到0F,應(yīng)該理解為是同一面的,也就是在12864上,水平坐標(biāo)00到0F處于同一面,而不是上下屏的關(guān)系,[看00行]其實(shí)大家只要看箭頭,明白控制芯片是按什么順序?qū)慓DRAM的就可以了^_^)

如圖片上所標(biāo)注,在向GDRAM中寫入要顯示的圖片時(shí),我們先指定從X:00、Y:00處(也就是第①處)開始寫入數(shù)據(jù)(如何指定后面會說明),我們先在第①處寫圖形數(shù)據(jù)(按照圖片所標(biāo)注,第15位在最左邊,第0位在最右邊,即在寫入的時(shí)候LCD會先寫高位字節(jié),接著再寫低位字節(jié)),接著LCD會自動把坐標(biāo)定位到同一行第②處的開頭,此時(shí)我們可以接著告訴LCD在這里寫入圖形數(shù)據(jù),依此類推,當(dāng)我們寫滿16次后,第00行(包括上半屏和下半屏的)就全寫滿了。那么我們接下去寫入數(shù)據(jù)會出現(xiàn)什么情況呢?答案是LCD又自動從第00行的第

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論