?? lcd12864_serial_char.asm
字號:
;12864的串行控制方式
;內置8192個16*16點陣字符,128個16*8個ASCII字符,可顯示8*4行行16*16點漢字
;8位通訊的設置,PSB端要置1,E在通信過程中一直要有效
;顯示圖形時,先寫入水平(0到15)與垂直(0到32)的坐標,再寫入兩個8位的資料
;注意:第0區的R5為LCD串行讀寫控制的RAM,不能在其程序的其他地方使用0區的R5,否則顯示不正常
;控制位定義
CS EQU P2.0
SID EQU P2.1
SCLK EQU P2.2
PSB EQU P2.3
RST EQU P2.5
;--------------------------
ORG 0000H
AJMP MAIN
;--------------------------
ORG 0030H
MAIN:
MOV SP,#5FH
LCALL LCD12864_INI ;初始化LCD
LCALL LCD12864_CHRS ;將四行字都顯示出來
AJMP $
;END OF MAIN
;*********************************LCD12864**********************************************
;初始化程序,寫指令,寫數據,寫行,忙檢測
;------------------------
LCD12864_INI:
;初始化
CLR PSB ;串口方式
SETB CS ;令LCD12864被選中,高電平有效
CLR SCLK ;時鐘置于低電平
CLR RST ;復位
MOV R4,#60
LCALL DELAYMS
SETB RST
NOP
MOV B,#20H ;基本指令操作(當并行時是4位并口方式,如果8位就是30H)
LCALL LCD12864_WR_OP_NO_CHK
MOV A,#01H ;清屏
LCALL LCD12864_WR_OP
MOV A,#06H ;指定資料寫入或讀取時,光標移動方向,AC自加1
LCALL LCD12864_WR_OP
MOV A,#0CH ;開顯示,關光標,不閃爍
LCALL LCD12864_WR_OP
CLR CS
RET
;-----------------------OK
LCD12864_CHRS:
;將表中的四行字都顯示出來
MOV A,#80H
MOV DPTR,#CHR1
LCALL LCD12864_CHR
MOV A,#90H
MOV DPTR,#CHR2
LCALL LCD12864_CHR
MOV A,#88H
MOV DPTR,#CHR3
LCALL LCD12864_CHR
MOV A,#98H
MOV DPTR,#CHR4
LCALL LCD12864_CHR
RET
;----------------------OK
LCD12864_CHR:
;顯示第一行字
LCALL LCD12864_WR_OP ;使DDRAM地址指到第n行首
MOV R1,#16
LC_LP:
CLR A
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT
INC DPTR
DJNZ R1,LC_LP
RET
;----------------------OK
LCD12864_WR_OP:
;將命令A寫入LCD12864
MOV B,A ;先將A的值保存起來
LCALL LCD12864_CHK_BUSY ;忙狀態檢測
LCD12864_WR_OP_NO_CHK:
SETB CS ;令LCD被選中
MOV A,#0F8H
MOV R5,#8
LWO_LP1:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWO_LP1
MOV A,B
ANL A,#0F0H
MOV R5,#8
LWO_LP2:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWO_LP2
MOV A,B
SWAP A
ANL A,#0F0H
MOV R5,#8
LWO_LP3:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWO_LP3
CLR CS
RET
;----------------------OK
LCD12864_WR_DAT:
;將數據A寫入LCD12864
MOV B,A
LCALL LCD12864_CHK_BUSY
SETB CS
MOV A,#0FAH
MOV R5,#8
LWD_LP1:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWD_LP1
MOV A,B
ANL A,#0F0H
MOV R5,#8
LWD_LP2:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWD_LP2
MOV A,B
SWAP A
ANL A,#0F0H
MOV R5,#8
LWD_LP3:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWD_LP3
CLR CS
RET
;-----------------------OK
LCD12864_CHK_BUSY:
;檢測忙位
MOV R7,B
SETB CS
MOV A,#0FCH
MOV R5,#8
LCB_LP1:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LCB_LP1
MOV R5,#8
LCB_LP2:
SETB SCLK
NOP
MOV C,SID
RLC A
CLR SCLK
DJNZ R5,LCB_LP2
MOV B,A
MOV R5,#8
LCB_LP3:
SETB SCLK
NOP
MOV C,SID
RLC A
CLR SCLK
DJNZ R5,LCB_LP3
SWAP A
ORL A,B
CLR CS
JB ACC.7,LCD12864_CHK_BUSY
MOV B,R7
RET
;----------
DELAYMS:
MOV R3,#185
DL:
NOP
NOP
NOP
DJNZ R3,DL
DJNZ R4,DELAYMS
RET
;----------------------
CHR1: DB "天降大任于斯人也"
CHR2: DB "必先苦其筋骨, 餓"
CHR3: DB "其體膚, 空泛其身"
CHR4: DB "行拂亂其所為...."
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -