?? th28_lcd.asm
字號:
;-----------左右移動 -----------
A0 EQU P3.2 ;寄存器選擇信號
R_W EQU P3.3 ;讀_寫選擇信號
E1 EQU P3.6 ;使能信號1
E2 EQU P3.7 ;使能信號2
PD1 EQU 3DH ;122/2分成左右兩半屏122x32
COLUMN EQU 30H ;列地址寄存器(0-63H)
PAGE_ EQU 31H ;頁地址寄存器D1,DO:頁地址
CODE_ EQU 32H ;字符代碼寄存器
COUNT EQU 33H ;計數(shù)器
DIR EQU 34H
CTEMP EQU 38H
COM EQU 20H ;指令寄存器
DAT EQU 21H ;數(shù)據(jù)寄存器
ORG 0
LJMP MAIN
;-----------初始化程序
INIT: MOV COM,#0E2H ;復位
LCALL PR0
LCALL PR3
MOV COM,#0A4H ;關閉休閉狀態(tài)
LCALL PR0
LCALL PR3
MOV COM,#0A9H ;設置1/32占空比
LCALL PR0
LCALL PR3
MOV COM,#0A0H ;正向排序設置
LCALL PR0
LCALL PR3
MOV COM,#0C0H ;設置顯示起始行為第一行
LCALL PR0
LCALL PR3
MOV COM,#0AFH ;開顯示設置
LCALL PR0
LCALL PR3
RET
;-----------清屏程序
CLEAR: MOV R4,#00H ;頁面地址暫存器設置
CLEAR1: MOV A,R4 ;取頁地址值
ORL A,#0B8H ;"或"頁面地址設置代碼
MOV COM,A ;頁面地址設置
LCALL PR0
LCALL PR3
MOV COM,#00H ;列地址設置為"0"
LCALL PR0
LCALL PR3
MOV R3,#50H ;一頁清80個字節(jié)
CLEAR2: MOV DAT,#00H ;顯示數(shù)據(jù)為"0"
LCALL PR1
LCALL PR4
DJNZ R3,CLEAR2 ;頁內字節(jié)清零循環(huán)
INC R4
CJNE R4,#04H,CLEAR1 ;RAM區(qū)清零循環(huán)
RET
;--------------寫指令代碼子程序(E1)
PR0: CLR A0 ;AO=0
SETB R_W ;R_W=1
PR01: MOV P1,#0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV A,P1 ;讀狀態(tài)字
CLR E1 ;E1=0
JB ACC.7,PR01 ;判"忙"標志為"0",否再讀
CLR R_W ;R_W=0
MOV P1,COM ;寫指令代碼
SETB E1 ;E1=1
CLR E1 ;E1=0
RET
;-------------寫顯示數(shù)據(jù)子程序(E1)
PR1: CLR A0 ;A0=0
SETB R_W ;R_W=1
PR11: MOV P1,#0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV A,P1 ;讀狀態(tài)字
CLR E1 ;E1=0
JB ACC.7,PR11 ;判"忙"標志為"0"否,否再讀
SETB A0 ;A0=1
CLR R_W ;R_W=0
MOV P1,DAT ;寫數(shù)據(jù)
SETB E1 ;E1=1
CLR E1 ;E1=0
RET
;-------------讀顯示數(shù)據(jù)子程序(E1)
PR2: CLR A0 ;A0 =0
SETB R_W ;R_W=1
PR21: MOV P1,#0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV A,P1 ;讀狀態(tài)字
CLR E1 ;E1=0
JB ACC.7,PR21 ;判"忙"標志為"0"否,否再讀
SETB A0 ;A0=1
MOV P1, #0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV DAT,P1 ;讀數(shù)據(jù)
CLR E1 ;E1=0
RET
;--------------寫指令代碼子程序(E2)
PR3: CLR A0 ;A0 =0
SETB R_W ;R_W=1
PR31: MOV P1,#0FFH ;P1口置"1"
SETB E2 ;E1=1
MOV A,P1 ;讀狀態(tài)字
CLR E2 ;E1=0
JB ACC.7,PR31 ;判"忙"標志為"0",否再讀
CLR R_W ;R_W=0
MOV P1,COM ;寫指令代碼
SETB E2 ;E1=1
CLR E2 ;E1=0
RET
;-------------寫顯示數(shù)據(jù)子程序(E2)
PR4: CLR A0 ;A0=0
SETB R_W ;R_W=1
PR41: MOV P1,#0FFH ;P1口置"1"
SETB E2 ;E1=1
MOV A,P1 ;讀狀態(tài)字
CLR E2 ;E1=0
JB ACC.7,PR41 ;判"忙"標志為"0"否,否再讀
SETB A0 ;A0=1
CLR R_W ;R_W=0
MOV P1,DAT ;寫數(shù)據(jù)
SETB E2 ;E1=1
CLR E2 ;E1=0
RET
;-------------讀顯示數(shù)據(jù)子程序(E2)
PR5: CLR A0 ;A0 =0
SETB R_W ;R_W=1
PR51: MOV P1,#0FFH ;P1口置"1"
SETB E2 ;E2=1
MOV A,P1 ;讀狀態(tài)字
CLR E2 ;E2=0
JB ACC.7,PR51 ;判"忙"標志為"0"否,否再讀
SETB A0 ;A0=1
MOV P1, #0FFH ;P1口置"1"
SETB E2 ;E2=1
MOV DAT,P1 ;讀數(shù)據(jù)
CLR E2 ;E2=0
RET
;-------------中文顯示子程序
CCW_PR: MOV DPTR,#CCTAB ;確定字符字模塊首地址
MOV A,CODE_ ;取代碼
MOV B,#20H ;字模塊寬度為 32個字節(jié)
MUL AB ;代碼×32
ADD A,DPL ;字符字模塊首地址
MOV DPL,A ;=字模庫首地址+代碼×32
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH COLUMN ;列地址入棧
PUSH COLUMN ;列地址入棧
MOV CODE_,#00H ;代碼寄存器借用為間址寄存器
CCW_1: MOV COUNT,#10H ;計數(shù)器設置為 16
MOV A,PAGE_ ;讀頁地址寄存器
ANL A,#03H
ORL A,#0B8H ;"或"頁地址設置代碼
MOV COM,A ;寫頁地址設置指令
LCALL PR0
LCALL PR3
POP COLUMN ;取到地址值
MOV A,COLUMN ;讀列地址寄存器
CLR C
SUBB A,#PD1 ;列地址減模塊參數(shù)
JC CCW_2 ;<0為左半屏顯示區(qū)域(E1)
MOV COLUMN,A ;≥0為右半屏顯示區(qū)域(E2)
MOV A,PAGE_
SETB ACC.3 ;設置區(qū)域標志位。
MOV PAGE_,A ;"0"為E1,"1"為E2
CCW_2: MOV COM,COLUMN ;設置列地址值
MOV A,PAGE_ ;判區(qū)域標志以確定設置哪個控制器
JNB ACC.3,CCW_3
LCALL PR3 ;區(qū)域E2
LJMP CCW_4
CCW_3: LCALL PR0 ;區(qū)域E1
CCW_4: MOV A,CODE_ ;取間址寄存器值
MOVC A,@A+DPTR ;取漢字字模數(shù)據(jù)
MOV DAT,A ;寫數(shù)據(jù)
MOV A,PAGE_
JNB ACC.3,CCW_5
LCALL PR4 ;區(qū)域E2
LJMP CCW_6
CCW_5: LCALL PR1 ;區(qū)域E1
CCW_6: INC CODE_ ;間址寄存器加一
INC COLUMN ;列地址寄存器加一
MOV A,COLUMN ;判列地址是否超出區(qū)域范圍
CJNE A,#PD1,CCW_7
CCW_7: JC CCW_8 ;未超出則繼續(xù)
MOV A,PAGE_ ;超出則判是否在區(qū)域E2
JB ACC.3,CCW_8 ;在區(qū)域E2則退出
SETB ACC.3 ;在區(qū)域E1則修改成區(qū)域E2
MOV PAGE_,A
MOV COM,#00H ;設置區(qū)域E2列地址為"0"
LCALL PR3
CCW_8: DJNZ COUNT,CCW_4 ;當頁循環(huán)
MOV A,PAGE_ ;讀頁地址寄存器
JB ACC.7,CCW_9 ;判完成標志D7位,"1"則完成退出
INC A ;否則頁地址加一
SETB ACC.7 ;置完成位為"1"
CLR ACC.3
MOV PAGE_,A
MOV CODE_,#10H ;間址寄存器設置為 16
LJMP CCW_1 ;大循環(huán)
CCW_9: RET
;-------------中文字符庫-----------------
CCTAB:
DB 000H,040H,042H,042H,042H,042H,042H,0FEH ;天
DB 042H,042H,042H,042H,042H,042H,040H,000H
DB 000H,080H,040H,020H,010H,008H,006H,001H
DB 002H,004H,008H,010H,030H,060H,020H,000H
DB 080H,060H,000H,0FFH,010H,008H,07CH,054H ;煌
DB 056H,055H,054H,054H,054H,07CH,000H,000H
DB 040H,030H,00EH,003H,004H,038H,025H,025H
DB 025H,03FH,025H,025H,025H,035H,020H,000H
DB 010H,014H,094H,0D4H,0BFH,094H,09CH,014H ;教
DB 050H,0F8H,00FH,008H,088H,078H,008H,000H
DB 009H,009H,048H,088H,07EH,005H,044H,044H
DB 020H,020H,013H,00CH,033H,0C0H,040H,000H
DB 040H,020H,0F0H,00CH,003H,000H,038H,0C0H ;儀
DB 001H,00EH,004H,0E0H,01CH,000H,000H,000H
DB 000H,000H,0FFH,000H,040H,040H,020H,010H
DB 00BH,004H,00BH,010H,020H,060H,020H,000H
;----------------中文演示顯示程序段
MAIN:
LCALL INIT
LCALL CLEAR
LCALL CLEAR
MOV CTEMP,#0
MOV DIR,#0
AAA: MOV PAGE_,#01H
MOV COLUMN,CTEMP
MOV CODE_,#00H
LCALL CCW_PR
MOV PAGE_,#01H
MOV A,CTEMP
ADD A,#10H
MOV COLUMN,A
MOV CODE_,#01H
LCALL CCW_PR
MOV PAGE_,#01H
MOV A,CTEMP
ADD A,#20H
MOV COLUMN,A
MOV CODE_,#02H
LCALL CCW_PR
MOV PAGE_,#01H
MOV A,CTEMP
ADD A,#30H
MOV COLUMN,A
MOV CODE_,#03H
LCALL CCW_PR
; LJMP $
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV A,DIR
CJNE A,#0,LEFT
INC CTEMP
MOV A,CTEMP
CJNE A,#58,AAA
MOV DIR,#1
LJMP AAA
LEFT:
DEC CTEMP
MOV A,CTEMP
CJNE A,#0,AAA
MOV DIR,#0
LJMP AAA
;LCALL S_DOWN
;LCALL S_UP
;SJMP $
;-----------------------------------------
DELAY: MOV R6,#80H ;延時子程序
MOV R5,#00H
DELAY1: NOP
DJNZ R5,DELAY1
DJNZ R6,DELAY1
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -