其實看了本版的1602教程以后很容易就可以掌握12864了。
剛才看到有網(wǎng)友要12864教程,俺就把博客里以前練習的一個程序弄過來,算作參考吧。
不足之處請見諒。
這個程序浪費了我很多時間,因為我一直沒有找到datasheet,12864的型號實在太多了。為了這個程序,我在網(wǎng)上找了很多相關(guān)的例程,但大多都是C語言寫的,可惜俺沒學過C,用起來不順手,遂將其轉(zhuǎn)成匯編,但是轉(zhuǎn)后,程序運行不正常,郁悶啊。好不容易找個匯編的吧,又寫得很亂,沒有頭緒,沒有datasheet,看起來很費勁,最后終于找到一個相關(guān)的datasheet,這才完成這個程序??偨Y(jié)一下:與其費力分析別人的程序,不如看datasheet自己寫。下面總結(jié)一下datasheet。
→↑← ONE→且看datasheet:
12864點陣型LCD簡介
12864是一種圖形點陣液晶顯示器,它主要由行驅(qū)動器/列驅(qū)動器及128×64全點陣液晶顯示器組成??赏瓿蓤D形顯示,也可以顯示8×4個(16×16點陣)漢字。
在使用12864LCD前先必須了解以下功能器件才能進行編程。12864內(nèi)部功能器件及相關(guān)功能如下:
1. 指令寄存器(IR)
IR是用于寄存指令碼,與數(shù)據(jù)寄存器數(shù)據(jù)相對應。當D/I=0時,在E信號下降沿的作用下,指令碼寫入IR。
2.數(shù)據(jù)寄存器(DR)
DR是用于寄存數(shù)據(jù)的,與指令寄存器寄存指令相對應。當D/I=1時,在下降沿作用下,圖形顯示數(shù)據(jù)寫入DR,或在E信號高電平作用下由DR讀到DB7∽DB0數(shù)據(jù)總線。DR和DDRAM之間的數(shù)據(jù)傳輸是模塊內(nèi)部自動執(zhí)行的。
3.忙標志:BF
BF標志提供內(nèi)部工作情況。BF=1表示模塊在內(nèi)部操作,此時模塊不接受外部指令和數(shù)據(jù)。BF=0時,模塊為準備狀態(tài),隨時可接受外部指令和數(shù)據(jù)。
利用STATUS READ指令,可以將BF讀到DB7總線,從檢驗模塊之工作狀態(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信號控制的。
5.XY地址計數(shù)器
XY地址計數(shù)器是一個9位計數(shù)器。高3位是X地址計數(shù)器,低6位為Y地址計數(shù)器,XY地址計數(shù)器實際上是作為DDRAM的地址指針,X地址計數(shù)器為DDRAM的頁指針,Y地址計數(shù)器為DDRAM的Y地址指針。
X地址計數(shù)器是沒有記數(shù)功能的,只能用指令設(shè)置。
Y地址計數(shù)器具有循環(huán)記數(shù)功能,各顯示數(shù)據(jù)寫入后,Y地址自動加1,Y地址指針從0到63。
6.顯示數(shù)據(jù)RAM(DDRAM)
DDRAM是存儲圖形顯示數(shù)據(jù)的。數(shù)據(jù)為1表示顯示選擇,數(shù)據(jù)為0表示顯示非選擇。DDRAM與地址和顯示位置的關(guān)系見DDRAM地址表。
7.Z地址計數(shù)器
Z地址計數(shù)器是一個6位計數(shù)器,此計數(shù)器具備循環(huán)記數(shù)功能,它是用于顯示行掃描同步。當一行掃描完成,此地址計數(shù)器自動加1,指向下一行掃描數(shù)據(jù),RST復位后Z地址計數(shù)器為0。
Z地址計數(shù)器可以用指令DISPLAY START LINE預置。因此,顯示屏幕的起始行就由此指令控制,即DDRAM的數(shù)據(jù)從哪一行開始顯示在屏幕的第一行。此模塊的DDRAM共64行,屏幕可以循環(huán)滾動顯示64行。
12864LCD的指令系統(tǒng)及時序
該類液晶顯示模塊(即KS0108B及其兼容控制驅(qū)動器)的指令系統(tǒng)比較簡單,總共只有七種。其指令表如表2所示:
其他的自己下個datasheet好好看吧,這里不再截圖了。
不過我要強調(diào)關(guān)于行列和頁的解釋:從上向下共64行,每8行為一頁,共八頁,從左到右共128列,左半屏0到63列,右半屏0到63列。顯示的時候,每頁以列為單位顯示。
→↑← TWO→程序?qū)嵗?br>
;#############################################
;*********************************************
;程序名稱:LCD12864
;主控芯片:89c51,12MHZ
;編者心得:看別人程序不如仔細看datasheet
;移用核心:看datasheet按需要修改即可
;程序編寫者:buyixin (不亦心)
;編寫時間: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 ;用于記錄顯示個數(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è)置頁數(shù)(第4頁)
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 ;第五頁
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
;------實現(xiàn)左半屏顯示3個字---------------------------
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
;------實現(xiàn)右半屏顯示2個字-----------------------------
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)用延時子程序,這里用延時來代替忙信號檢測
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
;//////延時子程序//////////////////////////////////
DELAY: MOV R7,#25H
DJNZ R7,$
RET
;//////字型碼表////////////////////////////////////
TAB:
;-- 文字: 不 --
;-- 隸書12; 此字體下對應的點陣為:寬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; 此字體下對應的點陣為:寬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; 此字體下對應的點陣為:寬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; 此字體下對應的點陣為:寬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; 此字體下對應的點陣為:寬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→硬件連接及仿真效果圖(僅為仿真目的,不做實際應用)