📄 9300.asm
字号:
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
CLR E1 ; E=0
RET
;////////////////////1.3 读显示数据子程序(左)
PR3: CLR CSB ; 片选设置为"01"
SETB CSA ;
CLR RS ; RS=0
SETB RW ; R/W=1
PR31: MOV DATBUS,#0FFH ; DATBUS口置"1"
NOP
NOP
NOP
NOP
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
MOV A,DATBUS ; 读状态字
NOP
NOP
NOP
NOP
NOP
CLR E1 ; E=0
JB ACC.7,PR31 ; 判"忙"标志为"0"否, 否再读
SETB RS ; RS=1
NOP
NOP
NOP
NOP
NOP
MOV DATBUS,#0FFH ; DATBUS口置"0"
NOP
NOP
NOP
NOP
SETB E1 ; E=1
MOV DAT1,DATBUS ; 读数据
NOP
NOP
NOP
NOP
NOP
CLR E1 ; E=0
RET
PR4: SETB CSB ; 片选设置为"10"
CLR CSA ;
CLR RS ; RS=0
SETB RW ; R/W=1
PR41: MOV DATBUS,#0FFH ; DATBUS口置"1"
NOP
NOP
NOP
NOP
NOP
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
NOP
MOV A,DATBUS ; 读状态字
CLR E1 ; E=0
JB ACC.7,PR41 ; 判"忙"标志为"0"否, 否再读
CLR RW ; R/W=0
MOV DATBUS,COM ; 写指令代码
NOP
NOP
NOP
NOP
NOP
NOP
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
NOP
CLR E1 ; E=0
RET
;写显示数据子程序(右)
PR5: SETB CSB ; 片选设置为"10"
CLR CSA ;
CLR RS ; RS=0
SETB RW ; R/W=1
PR51: MOV DATBUS,#0FFH ; DATBUS口置"1"
NOP
NOP
NOP
NOP
NOP
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
NOP
MOV A,DATBUS ; 读状态字
CLR E1 ; E=0
JB ACC.7,PR51 ; 判"忙"标志为"0"否, 否再读
SETB RS ; RS=1
CLR RW ; R/W=0
MOV DATBUS,DAT1 ; 写数据
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
NOP
CLR E1 ; E=0
RET
;/////////////////; 2.3 读显示数据子程序(右)
PR6: SETB CSB ; 片选设置为"10"
CLR CSA ;
CLR RS ; RS=0
SETB RW ; R/W=1
PR61: MOV DATBUS,#0FFH ; DATBUS口置"1"
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB E1 ; E=1
NOP
NOP
NOP
NOP
NOP
MOV A,DATBUS ; 读状态字
CLR E1 ; E=0
JB ACC.7,PR61 ; 判"忙"标志为"0"否, 否再读
SETB RS ; RS=1
MOV DATBUS,#0FFH ; DATBUS口置"0"
NOP
NOP
NOP
NOP
NOP
NOP
SETB E1 ; E=1
MOV DAT1,DATBUS ; 读数据
NOP
NOP
NOP
NOP
NOP
NOP
CLR E1 ; E=0
RET
CCW_PR: MOV DPTR,#CCTAB ; 确定字符字模块首地址
MOV A,CODE1 ; 取代码
MOV B,#20h ; 字模块宽度为32个字节
MUL AB ; 代码x32
ADD A,DPL ; 字符字模块首地址
MOV DPL,A ; = 字模库首地址 + 代码x 32
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH O_XL ; 列地址入栈
PUSH O_XL ; 列地址入栈
MOV CODE1,#00H ; 代码寄存器借用为间址寄存器
CCW_1:
MOV COUNT1,CONT0 ; 计数器设置为16
MOV A,O_YL ; 读页地址寄存器
ANL A,#07H
ORL A,#0B8H ; "或"页地址设置代码
MOV COM,A ; 写页地址设置指令
LCALL PR1
LCALL PR4
POP O_XL ; 取列地址值
MOV A,O_XL ; 读列地址寄存器
CLR C
SUBB A,#40H ; 列地址-64
JC CCW_2 ; 〈0为左屏显示区域
MOV O_XL,A ; ≥0为右屏显示区域
MOV A,O_YL
SETB ACC.5 ; 设置区域标志位.
MOV O_YL,A ; "00"为左,"10"为右
CCW_2: MOV COM,O_XL ; 设置列地址值
ORL COM,#40H ; "或"列地址指令标志位
MOV A,O_YL ; 判区域标志以确定设置哪个控制器
ANL A,#30H
CCW_31: CJNE A,#20H,CCW_32 ; "10"为右区
LCALL PR4
LJMP CCW_4
CCW_32: LCALL PR1 ; "00"为左区
CCW_4: MOV A,CODE1 ; 取间址寄存器值
MOVC A,@A+DPTR ; 取汉字字模数据
MOV DAT1,A ; 写数据
MOV A,O_YL ; 判区域标志
ANL A,#30H
CCW_41: CJNE A,#20H,CCW_42 ; "10"为右区
LCALL PR5
LJMP CCW_5
CCW_42: LCALL PR2 ; "00"为左区
CCW_5: INC CODE1 ; 间址寄存器加1
INC O_XL ; 列地址寄存器加1
MOV A,O_XL ; 判列地址是否超出区域范围
CJNE A,#40H,CCW_6
CCW_6: JC CCW_7 ; 未超出则继续
MOV O_XL,#00H
MOV A,O_YL ; 超出则判在何区域
JB ACC.5,CCW_8 ; 在右区域则退出
CCW_61: SETB ACC.5 ; 在左区则转右区
MOV O_YL,A
MOV COM,#40H ; 设置右区列地址为"0"
LCALL PR4
CCW_7: DJNZ COUNT1,CCW_4 ; 当页循环
CCW_8: MOV A,O_YL ; 读页地址寄存器
JB ACC.7,CCW_9 ; 判完成标志D7位, "1"则完成退出
INC A ; 否则页地址加1
SETB ACC.7 ; 置完成位为"1"
ANL A,#0CFH ; 清区域标志
MOV O_YL,A
MOV CODE1,#10H ; 间址寄存器设置为16
LJMP CCW_1 ; 大循环
CCW_9: RET
;============= 西文显示演示程序段 ====================
DISTEXT: MOV O_YL,#1H ; 8x8点阵字体, 第6页
MOV O_XL,#00H ; 起始列为第48列
MOV CODE1,#01H ; 字符代码
LCALL CW_PR
MOV O_YL,#2H
MOV O_XL,#00H
MOV CODE1,#02H
LCALL CW_PR
MOV O_YL,#0H
MOV O_XL,#00H
MOV CODE1,#03H
LCALL CW_PR
MOV O_YL,#3H
MOV O_XL,#0H
MOV CODE1,#1AH
LCALL CW_PR
MOV R7,#00H
MOV R6,#40H
LOOP: MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV CODE1,A
MOV O_YL,#05H ; 6X8点阵字体, 第4页
MOV O_XL,R6
LCALL CW_PR
INC R7
MOV A,#06H
ADD A,R6
MOV R6,A
CJNE R7,#08H,LOOP
ret
TAB1: DB 21h,22h,23h,24h,25h,26h,27h,28h
CW_PR: MOV DPTR,#CHTAB ; 确定字符字模块首地址
MOV A,CODE1 ; 取代码
MOV B,#08H ; 字模块宽度为8个字节
MUL AB ; 代码x8
ADD A,DPL ; 字符字模块首地址
MOV DPL,A ; = 字模库首地址 + 代码x 8
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV CODE1,#00H ; 借用为间址寄存器
MOV A,O_YL ; 读页地址寄存器
JB ACC.7,CW_1 ; 判字符体
MOV COUNT1,#08H ; 6x8点阵
JMP CW_2
CW_1: MOV COUNT1,#08H ; 8x8点阵
CW_2: ANL A,#07H ; 取页地址值
ORL A,#0B8H ; "或"页地址指令代码
MOV COM,A ; 写页地址指针
LCALL PR1
LCALL PR4
MOV A,O_XL ; 读列地址寄存器
CLR C
SUBB A,#40H ; 列地址-64
JC CW_3 ; 〈0为左屏显示区域
MOV O_XL,A ; ≥0为右屏显示区域
MOV A,O_YL
SETB ACC.5 ; 设置区域标志位.
MOV O_YL,A ; "00"为左,"10"为右
CW_3: MOV COM,O_XL ; 设置列地址值
ORL COM,#40H ; "或"列地址指令标志位
MOV A,O_YL ; 判区域标志以确定设置哪个控制器
ANL A,#30H
CW_31: CJNE A,#20H,CW_32 ; "10"为右区
LCALL PR4
LJMP CW_4
CW_32: LCALL PR1 ; "00"为左区
CW_4: MOV A,CODE1 ; 取间址寄存器值
MOVC A,@A+DPTR ; 取字符字模数据
MOV DAT1,A ; 写数据
MOV A,O_YL ; 判区域标志
ANL A,#30H
CW_41: CJNE A,#20H,CW_42 ; "10"为右区
LCALL PR5
LJMP CW_5
CW_42: LCALL PR2 ; "00"为左区
CW_5: INC CODE1 ; 间址加1
INC O_XL ; 列地址加1
MOV A,O_XL ; 判列地址是否超出区域范围
CJNE A,#40H,CW_6
CW_6: JC CW_9 ; 未超出则继续
MOV O_XL,#00H ;
MOV A,O_YL ; 超出则判在何区域
JB ACC.5,CW_91 ; 在右区域则退出
CW_61: SETB ACC.5 ; 在左区则转右区
MOV O_YL,A
MOV COM,#40H ; 设置右区列地址为"0"
LCALL PR4
CW_9: DJNZ COUNT1,CW_4 ; 循环
CW_91: RET
DISCHA: MOV O_YL,#00H ; 第3页
MOV O_XL,#00H ;
MOV CODE1,#0H ; 汉字代码
MOV CONT0,#0BH
LCALL CCW_PR ;1
MOV O_YL,#00H ; 第3页
MOV O_XL,#09H ;
MOV CODE1,#1H ; 汉字代码
MOV CONT0,#0BH
LCALL CCW_PR ;:
MOV O_YL,#00H ; 第3页
MOV O_XL,#0EH ;
MOV CODE1,#2H ; 汉字代码
MOV CONT0,#0FH
LCALL CCW_PR ;:
MOV O_YL,#00H ; 第3页
MOV O_XL,#1BH ;
MOV CODE1,#3H ; 汉字代码
MOV CONT0,#0BH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#2aH ;
MOV CODE1,#1H ; 汉字代码
MOV CONT0,#0bH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#2fH ;
MOV CODE1,#2H ; 汉字代码
MOV CONT0,#0FH
LCALL CCW_PR
;//////////////////////////////
MOV O_YL,#00H ; 第3页
MOV O_XL,#3fH ;
MOV CODE1,#0H ; 汉字代码
MOV CONT0,#0BH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#49H ;
MOV CODE1,#1H ; 汉字代码
MOV CONT0,#0BH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#4dH ;
MOV CODE1,#2H ; 汉字代码
MOV CONT0,#0FH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#5eH ;
MOV CODE1,#3H ; 汉字代码
MOV CONT0,#0BH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#6aH ;
MOV CODE1,#1H ; 汉字代码
MOV CONT0,#0bH
LCALL CCW_PR
MOV O_YL,#00H ; 第3页
MOV O_XL,#6fH ;
MOV CODE1,#2H ; 汉字代码
MOV CONT0,#0FH
LCALL CCW_PR
;OK
MOV O_YL,#02H ; 第3页
MOV O_XL,#4BH ;
MOV CODE1,#4H ; 汉字代码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -