LCD12864(不帶字庫(kù))其實(shí)看了本版的1602教程以后很容易就可以掌握12864了。
剛才看到有網(wǎng)友要12864教程,俺就把博客里以前練習(xí)的一個(gè)程序弄過來(lái),算作參考吧。 不足之處請(qǐng)見諒。 這個(gè)程序浪費(fèi)了我很多時(shí)間,因?yàn)槲乙恢睕]有找到datasheet,12864的型號(hào)實(shí)在太多了。為了這個(gè)程序,我在網(wǎng)上找了很多相關(guān)的例程,但大多都是C語(yǔ)言寫的,可惜俺沒學(xué)過C,用起來(lái)不順手,遂將其轉(zhuǎn)成匯編,但是轉(zhuǎn)后,程序運(yùn)行不正常,郁悶啊。好不容易找個(gè)匯編的吧,又寫得很亂,沒有頭緒,沒有datasheet,看起來(lái)很費(fèi)勁,最后終于找到一個(gè)相關(guān)的datasheet,這才完成這個(gè)程序??偨Y(jié)一下:與其費(fèi)力分析別人的程序,不如看datasheet自己寫。下面總結(jié)一下datasheet。 →↑← ONE→且看datasheet: 12864點(diǎn)陣型LCD簡(jiǎn)介 12864是一種圖形點(diǎn)陣液晶顯示器,它主要由行驅(qū)動(dòng)器/列驅(qū)動(dòng)器及128×64全點(diǎn)陣液晶顯示器組成。可完成圖形顯示,也可以顯示8×4個(gè)(16×16點(diǎn)陣)漢字。 ![]() 在使用12864LCD前先必須了解以下功能器件才能進(jìn)行編程。12864內(nèi)部功能器件及相關(guān)功能如下: 1. 指令寄存器(IR) IR是用于寄存指令碼,與數(shù)據(jù)寄存器數(shù)據(jù)相對(duì)應(yīng)。當(dāng)D/I=0時(shí),在E信號(hào)下降沿的作用下,指令碼寫入IR。 2.?dāng)?shù)據(jù)寄存器(DR) DR是用于寄存數(shù)據(jù)的,與指令寄存器寄存指令相對(duì)應(yīng)。當(dāng)D/I=1時(shí),在下降沿作用下,圖形顯示數(shù)據(jù)寫入DR,或在E信號(hào)高電平作用下由DR讀到DB7∽DB0數(shù)據(jù)總線。DR和DDRAM之間的數(shù)據(jù)傳輸是模塊內(nèi)部自動(dòng)執(zhí)行的。 3.忙標(biāo)志:BF BF標(biāo)志提供內(nèi)部工作情況。BF=1表示模塊在內(nèi)部操作,此時(shí)模塊不接受外部指令和數(shù)據(jù)。BF=0時(shí),模塊為準(zhǔn)備狀態(tài),隨時(shí)可接受外部指令和數(shù)據(jù)。 利用STATUS READ指令,可以將BF讀到DB7總線,從檢驗(yàn)?zāi)K之工作狀態(tài)。 4.顯示控制觸發(fā)器DFF 此觸發(fā)器是用于模塊屏幕顯示開和關(guān)的控制。DFF=1為開顯示(DISPLAY OFF),DDRAM的內(nèi)容就顯示在屏幕上,DFF=0為關(guān)顯示(DISPLAY OFF)。 DDF的狀態(tài)是指令DISPLAY ON/OFF和RST信號(hào)控制的。 5.XY地址計(jì)數(shù)器 XY地址計(jì)數(shù)器是一個(gè)9位計(jì)數(shù)器。高3位是X地址計(jì)數(shù)器,低6位為Y地址計(jì)數(shù)器,XY地址計(jì)數(shù)器實(shí)際上是作為DDRAM的地址指針,X地址計(jì)數(shù)器為DDRAM的頁(yè)指針,Y地址計(jì)數(shù)器為DDRAM的Y地址指針。 X地址計(jì)數(shù)器是沒有記數(shù)功能的,只能用指令設(shè)置。 Y地址計(jì)數(shù)器具有循環(huán)記數(shù)功能,各顯示數(shù)據(jù)寫入后,Y地址自動(dòng)加1,Y地址指針從0到63。 6.顯示數(shù)據(jù)RAM(DDRAM) DDRAM是存儲(chǔ)圖形顯示數(shù)據(jù)的。數(shù)據(jù)為1表示顯示選擇,數(shù)據(jù)為0表示顯示非選擇。DDRAM與地址和顯示位置的關(guān)系見DDRAM地址表。 7.Z地址計(jì)數(shù)器 Z地址計(jì)數(shù)器是一個(gè)6位計(jì)數(shù)器,此計(jì)數(shù)器具備循環(huán)記數(shù)功能,它是用于顯示行掃描同步。當(dāng)一行掃描完成,此地址計(jì)數(shù)器自動(dòng)加1,指向下一行掃描數(shù)據(jù),RST復(fù)位后Z地址計(jì)數(shù)器為0。 Z地址計(jì)數(shù)器可以用指令DISPLAY START LINE預(yù)置。因此,顯示屏幕的起始行就由此指令控制,即DDRAM的數(shù)據(jù)從哪一行開始顯示在屏幕的第一行。此模塊的DDRAM共64行,屏幕可以循環(huán)滾動(dòng)顯示64行。 12864LCD的指令系統(tǒng)及時(shí)序 該類液晶顯示模塊(即KS0108B及其兼容控制驅(qū)動(dòng)器)的指令系統(tǒng)比較簡(jiǎn)單,總共只有七種。其指令表如表2所示: ![]() 其他的自己下個(gè)datasheet好好看吧,這里不再截圖了。 不過我要強(qiáng)調(diào)關(guān)于行列和頁(yè)的解釋:從上向下共64行,每8行為一頁(yè),共八頁(yè),從左到右共128列,左半屏0到63列,右半屏0到63列。顯示的時(shí)候,每頁(yè)以列為單位顯示。 →↑← TWO→程序?qū)嵗?br> ;############################################# ;********************************************* ;程序名稱:LCD12864 ;主控芯片:89c51,12MHZ ;編者心得:看別人程序不如仔細(xì)看datasheet ;移用核心:看datasheet按需要修改即可 ;程序編寫者:buyixin (不亦心) ;編寫時(shí)間:2009年10月10日 20:33 ;不亦心的博客:http://hi.baidu.com/不亦心/ ;********************************************* ;############################################# ;//////變量申明/////////////////////////////// E BIT P3.0 ;LCD 使能端 RW BIT P3.1 ;LCD 讀/寫端 RS BIT P3.2 ;命令/數(shù)據(jù)控制端 CS1 BIT P3.3 ;左半屏 CS2 BIT P3.4 ;右半屏 WR_DATA DATA 30H ;數(shù)據(jù)暫存區(qū) Y DATA 31H ;列數(shù)據(jù)暫存區(qū) ;//////主程序開始////////////////////////////// ORG 0000H AJMP START ORG 0030H START: MOV SP,#60H ;設(shè)置堆棧 LCALL CLR_Screen ;調(diào)用清屏子程序 LCALL Init ;調(diào)用初始化子程序 ;------左半屏顯示------------------------------ REP: MOV R2,#00H ;用于記錄顯示個(gè)數(shù) MOV Y,#00H ;用于增加LCD列數(shù) MOV DPTR,#TAB ;取字碼 ;------左上半字顯示------------------------------ REP1: MOV R3,#10H ;記錄列數(shù) MOV WR_DATA,#0C0H ;設(shè)置行數(shù)(第一行開始顯示) LCALL WR_Left_COM ;調(diào)用左半屏寫命令子程序 MOV WR_DATA,#0BBH ;設(shè)置頁(yè)數(shù)(第4頁(yè)) LCALL WR_Left_COM CLR A ;設(shè)置顯示開始列數(shù) ADD A,Y ADD A,#50H MOV WR_DATA,A LCALL WR_Left_COM REP2: MOV A,#00H MOVC A,@A+DPTR MOV WR_DATA,A LCALL WR_Left_Byte ;調(diào)用左半屏寫數(shù)據(jù)子程序 INC DPTR DJNZ R3,REP2 ;------左下半字顯示-------------------------------- MOV R3,#10H;左下 MOV WR_DATA,#0C0H LCALL WR_Left_COM MOV WR_DATA,#0BCH ;第五頁(yè) LCALL WR_Left_COM CLR A ADD A,Y ADD A,#50H MOV WR_DATA,A LCALL WR_Left_COM REP3: MOV A,#00H MOVC A,@A+DPTR MOV WR_DATA,A LCALL WR_Left_Byte INC DPTR DJNZ R3,REP3 ;------實(shí)現(xiàn)左半屏顯示3個(gè)字--------------------------- INC R2 MOV A,y ADD A,#10H MOV Y,A CJNE R2,#03H,REP1 ;------右半屏顯示------------------------------------ MOV R2,#00H MOV Y,#00H ;------右上半字顯示---------------------------------- REP4: MOV R3,#10H MOV WR_DATA,#0C0H LCALL WR_Right_COM ;調(diào)用右半屏寫入命令子程序 MOV WR_DATA,#0BBH LCALL WR_Right_COM CLR A ADD A,Y ADD A,#40H MOV WR_DATA,A LCALL WR_Right_COM REP5: MOV A,#00H MOVC A,@A+DPTR MOV WR_DATA,A LCALL WR_Right_Byte ;調(diào)用右半屏寫入數(shù)據(jù)子程序 INC DPTR DJNZ R3,REP5 ;------右下半字顯示---------------------------------- MOV R3,#10H MOV WR_DATA,#0C0H LCALL WR_Right_COM MOV WR_DATA,#0BCH LCALL WR_Right_COM CLR A ADD A,Y ADD A,#40H MOV WR_DATA,A LCALL WR_Right_COM REP6: MOV A,#00H MOVC A,@A+DPTR MOV WR_DATA,A LCALL WR_Right_Byte INC DPTR DJNZ R3,REP6 ;------實(shí)現(xiàn)右半屏顯示2個(gè)字----------------------------- INC R2 MOV A,y ADD A,#10H MOV Y,A CJNE R2,#02H,REP4 ;------循環(huán)顯示---------------------------------------- LJMP REP ;//////初始化子程序/////////////////////////////////// Init: MOV WR_DATA,#3EH ;關(guān)顯示 LCALL WR_COM ;調(diào)用全屏寫入命令子程序 MOV WR_DATA,#3FH ;開顯示 LCALL WR_COM RET ;//////左半屏寫入字節(jié)子程序/////////////////////////// WR_Left_Byte: CLR CS1 ;選擇左半屏 SETB CS2 CLR RW ;寫 SETB RS ;選擇寫命令 MOV A,WR_DATA SETB E MOV P0,A CLR E LCALL DELAY ;調(diào)用延時(shí)子程序,這里用延時(shí)來(lái)代替忙信號(hào)檢測(cè) RET ;//////右半屏寫入字節(jié)子程序/////////////////////////////// WR_Right_Byte: SETB CS1 CLR CS2 CLR RW SETB RS MOV A,WR_DATA SETB E MOV P0,A CLR E LCALL DELAY RET ;//////全屏寫入字節(jié)子程序//////////////////////////////// WR_Byte: CLR CS1 CLR CS2 CLR RW SETB RS MOV A,WR_DATA SETB E MOV P0,A CLR E LCALL DELAY RET ;//////左半屏寫入命令子程序///////////////////////////// WR_Left_COM: CLR CS1 SETB CS2 CLR RS CLR RW MOV A,WR_DATA SETB E MOV P0,A CLR E LCALL DELAY RET ;//////右半屏寫入命令子程序////////////////////////////////// WR_Right_COM: SETB CS1 CLR CS2 CLR RS CLR RW MOV A,WR_DATA SETB E MOV P0,A CLR E LCALL DELAY RET ;//////全屏寫入命令字程序///////////////////////////////////// WR_COM: CLR CS1 CLR CS2 CLR RS CLR RW MOV A,WR_DATA SETB E MOV P0,A CLR E LCALL DELAY RET ;//////全屏清屏子程序////////////////////////////////////////// CLR_Screen: MOV WR_DATA,#0C0H LCALL WR_COM MOV R0,#0B8H MOV R1,#00H LOOP: MOV WR_DATA,R0 LCALL WR_COM MOV WR_DATA,#40H LCALL WR_COM LOOP1: MOV WR_DATA,#0FFH ;全屏清黑(這里我是用反色顯示漢字的) LCALL WR_Byte INC R1 CJNE R1,#40H,LOOP1 INC R0 CJNE R0,#0C0H,LOOP RET ;//////延時(shí)子程序////////////////////////////////// DELAY: MOV R7,#25H DJNZ R7,$ RET ;//////字型碼表//////////////////////////////////// TAB: ;-- 文字: 不 -- ;-- 隸書12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -- DB 0FFH,0FFH,0FFH,0DFH,0CFH,0CFH,0DFH,1FH,1FH,5FH,0DFH,0DFH,0DFH,0FFH,0FFH,0FFH DB 0FFH,0F7H,0F7H,0F3H,0FBH,0F9H,0FCH,0C0H,0C0H,0FFH,0FEH,0FCH,0F1H,0F3H,0F7H,0F7H ;-- 文字: 亦 -- ;-- 隸書12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -- DB 0FFH,0BFH,0BFH,0BFH,3FH,0DFH,1FH,0CFH,0CFH,1FH,0DFH,9FH,9FH,0BFH,0BFH,0FFH DB 0FFH,0FFH,0EBH,0ECH,0E6H,0F3H,0F8H,0EFH,0EFH,0E0H,0FFH,0FEH,0FDH,0FBH,0FFH,0FFH ;-- 文字: 心 -- ;-- 隸書12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -- DB 0FFH,0FFH,7FH,0FFH,7FH,0FFH,0FFH,3FH,8FH,0FFH,7FH,3FH,0BFH,0FFH,0FFH,0FFH DB 0F7H,0F1H,0F8H,0FFH,0FEH,0FEH,0FCH,0F9H,0F3H,0F1H,0E6H,0E7H,0C7H,0E7H,0E7H,0FFH ;-- 文字: 制 -- ;-- 隸書12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -- DB 0FFH,7FH,0BFH,8FH,0BFH,0FH,2FH,3FH,0BFH,0FFH,1FH,0FFH,0CFH,0FH,0FFH,0FFH DB 0FEH,0FEH,0EEH,0E0H,0FCH,0C0H,0FCH,0F9H,0E1H,0EFH,0E8H,0CFH,0C7H,0E0H,0FFH,0FFH ;-- 文字: 作 -- ;-- 隸書12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -- DB 0FFH,9FH,9FH,1FH,1FH,6FH,0BFH,9FH,0CFH,0FH,9FH,9FH,9FH,0BFH,0BFH,0FFH DB 0FFH,0FFH,0FFH,0E0H,0E0H,0FFH,0FFH,0FFH,0FFH,0C0H,0FAH,0FAH,0FAH,0FAH,0FBH,0FFH ;//////程序結(jié)束///////////////////////////////////////////// END 以上程序我用的是反顯。 →↑← THREE→硬件連接及仿真效果圖(僅為仿真目的,不做實(shí)際應(yīng)用) ![]() |
|