lcd+80c196.asm
来自「80C196系列单片机控制128X64的点阵液晶显示」· 汇编 代码 · 共 311 行
ASM
311 行
R6 EQU 25H
R5 EQU 26H
DIR EQU 27H
CTEMP EQU 28H
R3 EQU 30H
R4 EQU 31H
CODE_ EQU 32H
COL1 EQU 33H
COL2 EQU 34H
COLUMN EQU 35H
COUNT EQU 36H
PAGE_ EQU 37H
PD1 EQU 38H
COM EQU 39H ;指令寄存器
DAT EQU 3AH ;数据寄存器
CWADD1 EQU 0E000H ;写指令代码地址(E1)
DWADD1 EQU 0E001H ;写显示数据地址(E1)
CRADD1 EQU 0E002H ;读状态字地址(E1)
DRADD1 EQU 0E003H ;读显示数据地址(E1)
CWADD2 EQU 0E004H ;写指令代码地址(E2)
DWADD2 EQU 0E005H ;写显示数进地址(E2)
CRADD2 EQU 0E006H ;读状态字地址(E2)
DRADD2 EQU 0E007H ;读显示数据地址(E2)
ORG 2080H
;LD SP, #0100H
JMP MAIN
;---------------------------------------
; 初始化程序
INIT: ;先锁定HSO.3,给液晶显示供电
LDB IOC2, #40H ;允许锁定HSO命令
LDB HSO_COMMAND, #0A3H ;触发正跳变事件
ADD HSO_TIME,T1, #000AH
;NOP
;NOP
;NOP
;NOP
;LDB HSO_COMMAND, #83H ;触发负跳变事件
;ADD HSO_TIME,T1, #0A00H
LDB COM, #40H ;设置显示起始列为第0列
LCALL PRO
LCALL PR3
LDB COM, #0B8H ;设页码,第0页
LCALL PRO
LCALL PR3
LDB COM, #0C0H ;设从第0行开始显示
LCALL PRO
LCALL PR3
LDB COM, #3FH ;开显示设置
LCALL PRO
LCALL PR3
RET
;------------------------------------------------
; 清屏
CLEAR: LDB R4,#00H ;页面地址暂存器设置
CLEAR1: LDB AL,R4 ;取页地址值
ORB AL,#0B8H ;"或"页面地址设置代码
LDB COM,AL ;页面地址设置
LCALL PRO
LCALL PR3
LDB COM,#00H ;列地址设置为"0"
LCALL PRO
LCALL PR3
LDB R3,#64 ;一页清64个字节
CLEAR2: LDB DAT,#0ffH ;显示数据为"FF"
LCALL PR1
LCALL PR4
DJNZ R3,CLEAR2 ;页内字节清零循环
INCB R4 ;页地址暂存器加一
CMPB R4,#08
JNE CLEAR1 ;RAM区清零循环
RET
;-----------------------------------
;1.写指令代码子程序(E1)
PRO:
PR01: LDB AL, CRADD1 ;读状态字
JBS AL,7,PR01 ;判"忙"标志为句"0",否再读
LDB AL,COM ;取指令代码
STB AL, CWADD1 ;写指令代码
RET
;------------------------------------
;2.写显示数据子程序(E1)
PR1:
PR11: LDB AL,CRADD1 ;读状态宇
JBS AL,7,PR11 ;判"忙"标志为"0",否再读
LDB AL,DAT ;取数据
STB AL,DWADD1 ;写数据
RET
;-------------------------------------
;3.读显示数据子程序(E1)
PR2:
PR21: LDB AL,CRADD1 ;读状态字
JBS AL,7,PR21 ;判"忙"标志为"0"否,否再读
LDB AL,DRADD1 ;读数据
LDB DAT,AL ;存数据
RET
;-------------------------------------
;4.写指令代码子程序(E2)
PR3:
PR31: LDB AL,CRADD2 ;读状态字
JBS AL, 7,PR31 ;判"忙"标志为"0"否,否再读
LDB AL,COM ;取指令代码
STB AL,CWADD2 ;写指令代码
RET
;-------------------------------------
; 5.写显示数据子程序(E2)
PR4:
PR41: LDB AL,CRADD2 ;读状态字
JBS AL,7,PR41 ;判"忙"标志为"0"否,否再读
LDB AL,DAT ;取数据
STB AL,DWADD2 ;写数据
RET
;---------------------------------------
; 6.读显示数据子程序(E2)
PR5:
PR51: LDB AL,CRADD2 ;读状态字
JBS AL, 7,PR51 ;判"忙"标志为"0",否再读
LDB AL,DRADD2 ;读数据
LDB DAT,AL ;存数据
RET
; 中文显示子程序
CCW_PR: LD BX,#CCTAB ;确定字符字模块首地址
LDB AL,#0 ;CODE_ ;取代码
LDB AH,0
MULUB AX,#20H ;代码×32
ADD BX,AX ;字模库首地址+代码×32
LDB COL2, #0 ;COLUMN ;列地址
LDB COL1,#00H ;代码寄存器借用为间址寄存器
CCW_1: LDB COUNT,#10H ;计数器设置为 16
LDB AL,#0 ;PAGE_ ;读页地址寄存器
ANDB AL,#03H ;取页地址有效值
ORB AL,#0B8H ;"或"页地址设置代码
LDB COM,AL ;设置页地址
LCALL PRO
LCALL PR3
LDB COLUMN,COL2 ;取列地址值
LDB AL,#0 ;COLUMN ;读列地址寄存器
CMPB AL,#0;#PD1
JLT CCW_2 ;<0为左半屏显示区域(E1)
SUBB AL,#0;#PD1
LDB COLUMN,AL ;≥0为右半屏显示区域(E2)
LDB AL,#0;PAGE_
;SETB ACC.3 ;设置区域标志位。
ORB AL,#08
LDB PAGE_,AL ;"0"为E1,"1"为E2
CCW_2: LDB COM,COLUMN ;设置列地址值
LDB AL,PAGE_ ;判区域标志以确定设置哪个控制器
JBC AL,3,CCW_3
LCALL PR3 ;区域E2
LJMP CCW_4
CCW_3: LCALL PRO ;区域E1
CCW_4: LDB AL,COL1 ;取间址寄存器值
LDB AH,0
ADD AX,BX
LDB AL,[AX] ;取汉字字模数据
LDB DAT,AL ;写数据
LDB AL,PAGE_
JBC AL,3,CCW_5
LCALL PR4 ;区域E2
LJMP CCW_6
CCW_5: LCALL PR1 ;区域E1
CCW_6: INCB COL1 ;间址寄存器加一
INCB COLUMN ;列地址寄存器加一
LDB AL,COLUMN ;判列地址是否超出区域范围、
CMPB AL,#PD1
CCW_7: JLT CCW_8 ;未超出则继续
LDB AL,PAGE_ ;超出则判是否在区域E2
JBS AL, 3,CCW_8 ;在区域E2则退出
;SETB ACC.3 ;在区域E1则修改成区域E2
ORB AL,#08
LDB PAGE_,AL
LDB COM,#00H ;设置区域E2列地址为"0"
LCALL PR3
CCW_8: DJNZ COUNT,CCW_4 ;当页循环
LDB AL,PAGE_ ;读页地址寄存器
JBS AL,7,CCW_9 ;判完成标志D7位,"1"则完成退出
INCB AL ;否则页地址加一
;SETB ACC.7 ;置完成位为"1"
ORB AL,#80H
ANDB AL,#0F7H ; CLR ACC.3
LDB PAGE_,AL
LDB CODE_,#10H ;间址寄存器设置为 16
LJMP CCW_1 ;大循环
CCW_9: RET
;--------------------------------------
;中文字符库
CCTAB:
small0:
;db 38h,44h,44h,44h,44h,44h,38h,00h ;0
small1:
;db 10h,30h,50h,10h,10h,10h,7ch,00h ;1
small2:
;db 38h,44h,04h,08h,10h,20h,7ch,00h ;2
small3:
;db 78h,84h,04h,38h,04h,84h,78h,00h ;3
DB 01h, 00h, 01h, 04h, 0FFh, 0FEh, 01h, 00h ;横排
DB 01h, 04h, 7Fh, 0FEh, 48h, 24h, 44h, 44h
DB 5Fh, 0F4h, 41h, 04h, 41h, 04h, 5Fh, 0F4h
DB 41h, 04h, 41h, 04h, 41h, 14h, 40h, 08h
DB 20h, 00h, 27h, 0FFh, 24h, 00h, 24h, 90h ;上下列排
DB 26h, 90h, 25h, 90h, 24h, 90h, 0FCh, 0FEh
DB 24h, 90h, 25h, 90h, 26h, 90h, 24h, 92h
DB 24h, 01h, 6Fh, 0FEh, 24h, 00h, 00h, 00h
DB 00h, 04h, 0FFh, 0E4h, 00h, 24h, 09h, 24h ;下上列排
DB 09h, 64h, 09h, 0A4h, 09h, 24h, 7Fh, 3Fh
DB 09h, 24h, 09h, 0A4h, 09h, 64h, 49h, 24h
DB 80h, 24h, 7Fh, 0F6h, 00h, 24h, 00h, 00h
DB 000H,004H,0e4H,024H,024H,064H,0b4H,02fH ; 南
DB 024H,0a4H,064H,024H,024H,0e6H,004H,000H
DB 000H,000H,07fH,004H,005H,005H,005H,07fH
DB 005H,005H,005H,025H,044H,03fH,000H,000H
;DB 000H,004H,004H,0e4H,024H,024H,025H,026H ; 京
;DB 024H,024H,024H,0e4H,006H,004H,000H,000H
;DB 000H,020H,010H,019H,00DH,041H,081H,07fH
;DB 001H,001H,005H,00dH,038H,010H,000H,000H
;DB 000H,080H,060H,0f8H,007H,00aH,028H,028H ; 伟
;DB 028H,0ffH,028H,028H,028H,028H,000H,000H
;DB 001H,000H,000H,0fFH,000H,001H,001H,001H
;DB 001H,0ffH,001H,021H,041H,03fH,000H,000H
;DB 008H,008H,089H,0ceH,028H,018H,002H,07aH ; 福
;DB 04aH,04aH,04aH,04aH,04aH,07aH,002H,000H
;DB 002H,001H,000H,0ffH,001H,002H,0ffH,049H
;DB 049H,049H,07fH,049H,049H,049H,0ffH,000H
;------------------------------------.
; 中文演示显示程序段
MAIN: LDB SP,#0E0H
LCALL INIT
LCALL CLEAR
LCALL CCW_PR
SJMP MAIN
LDB CTEMP,#0
LDB DIR,#0
AAA:
LDB PAGE_,#02H
LDB COLUMN,CTEMP
LDB CODE_,#00H
LCALL CCW_PR
LDB PAGE_,#02H
LDB AL,CTEMP
ADDB AL,#10H
LDB COLUMN,AL
LDB CODE_,#01H
LCALL CCW_PR
LDB PAGE_,#02H
LDB AL,CTEMP
ADDB AL,#20H
LDB COLUMN,AL
LDB CODE_,#02H
LCALL CCW_PR
LDB PAGE_,#02H
LDB AL,CTEMP
ADDB AL,#30H
LDB COLUMN,AL
LDB CODE_,#03H
LCALL CCW_PR
LCALL DELAY
LCALL DELAY
LCALL DELAY
LDB AL, DIR
CMPB AL,#0
JNE LEFT
INC CTEMP
LDB AL,CTEMP
CMPB AL,#58
JNE AAA
LDB DIR,#1
LJMP AAA
LEFT:
DEC CTEMP
LDB AL,CTEMP
CMPB AL,#0
JNE AAA
LDB DIR,#0
LJMP AAA
SJMP $
;----------------------------------
DELAY: LDB R6,#060H ;延时子程序
LDB R5,#00H
DELAY1: NOP
DJNZ R5,DELAY1
DJNZ R6,DELAY1
RET
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?