📄 kychbiao_36.asm
字号:
JB PSW.5,WRDAT
INC R0
DJNZ R7,WRDAT0
LCALL ATW3
LCALL DL20MS
RET
DISJH: MOV O_YL,#02H
MOV O_XL,#00H
MOV CODE,#1DH
LCALL CCW_PR ;"机"
MOV O_YL,#02H
MOV O_XL,#10H
MOV CODE,#18H
LCALL CCW_PR ;"号"
RET
DISJIHAO:
MOV A,JIHAOH
SWAP A
ANL A,#0FH
MOV KINBUF,A
MOV A,JIHAOH
ANL A,#0FH
MOV KINBUF+1,A
MOV A,JIHAOL
SWAP A
ANL A,#0FH
MOV KINBUF+2,A
MOV A,JIHAOL
ANL A,#0FH
MOV KINBUF+3,A
;LCALL CALNUM
MOV O_YL,#02H
MOV O_XL,#20H
MOV CODE,KINBUF
LCALL CNW_PR
MOV O_YL,#02H
MOV O_XL,#28H
MOV CODE,KINBUF+1
LCALL CNW_PR
MOV O_YL,#02H
MOV O_XL,#30H
MOV CODE,KINBUF+2
LCALL CNW_PR ;显示机号
MOV O_YL,#02H
MOV O_XL,#38H
MOV CODE,KINBUF+3
LCALL CNW_PR
EDISJH: RET
DISHH: MOV O_YL,#02H
MOV O_XL,#48H
MOV CODE,#17H
LCALL CCW_PR ;"户"
MOV O_YL,#02H
MOV O_XL,#58H
MOV CODE,#18H
LCALL CCW_PR ;"号"
RET
DISHUHAO:
MOV A,HUHAO
LCALL CALNUM
MOV O_YL,#02H
MOV O_XL,#68H
MOV CODE,KINBUF+1
LCALL CNW_PR
MOV O_YL,#02H
MOV O_XL,#70H
MOV CODE,KINBUF+2
LCALL CNW_PR ;显示户号
EDISHH: RET
CALNUM: MOV B,#100
DIV AB
MOV KINBUF,A
MOV A,B
MOV B,#10
DIV AB
MOV KINBUF+1,A
MOV KINBUF+2,B
ECALNUM:RET
;R2-计数,R4-行号,R3-列号,R5-扫描码,R6-计数
SCANKEY:LCALL KEXAM
JNZ SCANK0
MOV KEYNUM,#0FFH ;无键按下
LJMP ESCANK
SCANK0: LCALL DLY10MS ;有键按下,延时去抖
LCALL KEXAM
JNZ SCANK1
MOV KEYNUM,#0FFH ;无键按下
LJMP ESCANK
SCANK1: MOV R4,#00H ;行号
MOV R6,#03H ;扫描行数
MOV R5,#0EFH ;第一行扫描码
SCAN10: MOV A,R5 ;输出扫描码
MOV P1,A
MOV A,P1
CPL A ;
ANL A,#0FH
JNZ CHK1 ;本行有键按下
LJMP CHK2 ;本行无键按下
CHK1: MOV R2,#4
CHK10: JB ACC.0,CALK1
RR A
DJNZ R2,CHK10 ;检测按键所在列
CHK2: MOV A,R5
RL A
MOV R5,A ;修正扫描码
INC R4 ;行号加1
DJNZ R6,SCAN10 ;扫描下一行
MOV KEYNUM,#0FFH ;未检测到按键
LJMP ESCANK
CALK1: CLR C
MOV A,#4
SUBB A,R2 ;计算列号
MOV B,#03H
MUL AB
ADD A,R4 ;计算键值
MOV KEYNUM,A
ESCANK: RET
KEXAM: MOV P1,#8FH
MOV A,P1
CPL A
ANL A,#0FH
RET
;;;;;;;;;;2字节BCD转换子程序;;;;;;;;;;;;;;
BCD4B: MOV A,R5
MOV R2,A
ACALL BCD2B
MOV B,#64H
MUL AB
MOV R6,A
XCH A,B
MOV R5,A
MOV A,R4
MOV R2,A
ACALL BCD2B
ADD A,R6
MOV R4,A
MOV A,R5
ADDC A,#00H
MOV R5,A
RET
;;;;;;;;;1字节BCD转换子程序;;;;;;;;
BCD2B: MOV A,R2
ANL A,#0F0H
SWAP A
MOV B,#0AH
MUL AB
MOV R3,A
MOV A,R2
ANL A,#0FH
ADD A,R2
MOV R2,A
RET
;;;;;;;;;双字节循环左移一位;;;;;;;;;;
;;;;入口R5高位,R4低位;;;;;;;
;;;;出口R5高位,R4低位;;;;;;
BINRL: CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R3,A
RET
;=============== 显示标题程序段 =======================
DISTITL:MOV O_YL,#02H
MOV O_XL,#18H
MOV CODE,#00H ;莱
LCALL CCW_PR
MOV O_YL,#02H
MOV O_XL,#28H
MOV CODE,#01H ;芜
LCALL CCW_PR
MOV O_YL,#02H
MOV O_XL,#38H
MOV CODE,#02H ;双
LCALL CCW_PR
MOV O_YL,#02H
MOV O_XL,#48H
MOV CODE,#03H ;威
LCALL CCW_PR
MOV O_YL,#00H
MOV O_XL,#08H
MOV CODE,#04H ;红
LCALL CCW_PR
MOV O_YL,#00H
MOV O_XL,#18H
MOV CODE,#05H ;外
LCALL CCW_PR
MOV O_YL,#00H
MOV O_XL,#28H
MOV CODE,#06H ;抄
LCALL CCW_PR
MOV O_YL,#00H
MOV O_XL,#38H
MOV CODE,#07H ;表
LCALL CCW_PR
MOV O_YL,#00H
MOV O_XL,#48H
MOV CODE,#08H ;系
LCALL CCW_PR
MOV O_YL,#00H
MOV O_XL,#58H
MOV CODE,#09H ;统
LCALL CCW_PR
RET
;***************************************************
; 直接驱动子程序由6个子程序组成:
; 1. 写指令代码子程序(左屏E1)PR0
; 2. 写显示数据子程序(左屏E1)PR1
; 3. 读显示数据子程序(左屏E1)PR2
; 4. 写指令代码子程序(右屏E2)PR3
; 5. 写显示数据子程序(右屏E2)PR4
; 6. 读显示数据子程序(右屏E2)PR5
; 占用内部寄存器:A,COM,DAT1
; 占用系统接口资源: CWADD1,CRADD1,DWADD1,DRADD1,CWADD2,CRADD2,DWADD2,DRADD2
; 程序输入变量:COM 或 DAT1
;------------写指令子程序(E1)-------------------------
PR1: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD1 ;设置读状态字地址
PR11: MOVX A,@DPTR ;读状态字
JB ACC.7,PR11 ;判"忙"标志为"0"否, 否再读
MOV DPTR,#CWADD1 ;设置写指令代码地址
MOV A,COM ;取指令代码
MOVX @DPTR,A ;写指令代码
POP DPH
POP DPL
RET
;=============写数据子程序(E1)===========================
PR2: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD1 ;设置读状态字地址
PR21: MOVX A,@DPTR ;读状态字
JB ACC.7,PR21 ;判"忙"标志为"0"否, 否再读
MOV DPTR,#DWADD1 ;设置写显示数据地址
MOV A,DAT1 ;取数据
MOVX @DPTR,A ;写数据
POP DPH
POP DPL
RET
;=============读数据子程序(E1)===========================
PR3: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD1 ;设置读状态字地址
PR31: MOVX A,@DPTR ;读状态字
JB ACC.7,PR31 ;判"忙"标志为"0"否, 否再读
MOV DPTR,#DRADD1 ;设置读显示数据地址
MOVX A,@DPTR ;读数据
MOV DAT1,A ;存数据
POP DPH
POP DPL
RET
;=============写指令子程序(E2)===========================
PR4: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD2 ;设置读状态字地址
PR41: MOVX A,@DPTR ;读状态字
JB ACC.7,PR41 ;判"忙"标志为"0"否, 否再读
MOV DPTR,#CWADD2 ;设置写指令代码地址
MOV A,COM ;取指令代码
MOVX @DPTR,A ;写指令代码
POP DPH
POP DPL
RET
;=============写数据子程序(E2)===========================
PR5: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD2 ;设置读状态字地址
PR51: MOVX A,@DPTR ;读状态字
JB ACC.7,PR51 ;判"忙"标志为"0"否, 否再读
MOV DPTR,#DWADD2 ;设置写显示数据地址
MOV A,DAT1 ;取数据
MOVX @DPTR,A ;写数据
POP DPH
POP DPL
RET
;=============读数据子程序(E2)===========================
PR6: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD2 ;设置读状态字地址
PR61: MOVX A,@DPTR ;读状态字
JB ACC.7,PR61 ;判"忙"标志为"0"否, 否再读
MOV DPTR,#DRADD2 ;设置读显示数据地址
MOVX A,@DPTR ;读数据
MOV DAT1,A ;存数据
POP DPH
POP DPL
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 初始化子程序INT
; 内部调用子程序:PR1,PR4
; 程序调用入口: INT
; 程序调用变量:无
INT: MOV COM,#0E2H ;复位
LCALL PR1
LCALL PR4
MOV COM,#0A4H ;关闭等待状态
LCALL PR1
LCALL PR4
MOV COM,#0A9H ;设置1/32占空比
LCALL PR1
LCALL PR4
MOV COM,#0A0H ;正向排序设置
LCALL PR1
LCALL PR4
MOV COM,#0C0H ;设置显示起始行为第一行
LCALL PR1
LCALL PR4
MOV COM,#0AFH ;开显示设置
LCALL PR1
LCALL PR4
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 清显示RAM 区(清屏)子程序CLEAR
; 占用内部寄存器:R3,R4
; 内部调用子程序:PR1,PR2,PR4,PR5
; 程序调用入口:CLEAR
CLEAR: MOV R4,#00H ;页面地址暂存器设置
CLEAR1: MOV A,R4 ;取页地址值
ORL A,#0B8H ;"或"页面地址设置代码
MOV COM,A ;页面地址设置
LCALL PR1
LCALL PR4
MOV COM,#00H ;列地址设置为"0"
LCALL PR1
LCALL PR4
MOV R3,#50H ;一页清80个字节
CLEAR2: MOV DAT1,#00H ;显示数据为"0"
LCALL PR2
LCALL PR5
DJNZ R3,CLEAR2 ;页内字节清零循环
INC R4 ;页地址暂存器加1
CJNE R4,#04H,CLEAR1 ;RAM 区清零循环
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 8*16点阵字符写入子程序CNW_PR
; 程序参数选择:PARA1
; 占用内部资源:O_XL,O_YL,CODE,COUNT1,A,DPTR
; 内部调用子程序:PR1,PR2,PR4,PR5
; 连接字库: CCTAB
; 程序调用入口: CCW_PR
; 程序输入变量: O_XL,O_YL,CODE
CNW_PR: MOV DPTR,#CNTAB ;确定字符字模块首地址
MOV A,CODE ;取代码
MOV B,#10H ;字模块宽度为16个字节
MUL AB ;代码x16
ADD A,DPL ;字符字模块首地址
MOV DPL,A ;=字模库首地址+代码x16
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH O_XL ;列地址入栈
PUSH O_XL ;列地址入栈
MOV CODE,#00H ;代码寄存器借用为间址寄存器
CNW_1: MOV COUNT1,#08H ;计数器设置为8
MOV A,O_YL ;读页地址寄存器
ANL A,#03H
ORL A,#0B8H ;"或"页地址设置代码
MOV COM,A ;写页地址设置指令
LCALL PR1
LCALL PR4
POP O_XL ;取列地址值
MOV A,O_XL ;读列地址寄存器
CLR C
SUBB A,#PARA1 ;列地址-模块参数
JC CNW_2 ;〈0为左半屏显示区域(E1)
MOV O_XL,A ;≥0为右半屏显示区域(E2)
MOV A,O_YL
SETB ACC.3 ;设置区域标志位.
MOV O_YL,A ;"0"为E1,"1"为E2
CNW_2: MOV COM,O_XL ;设置列地址值
MOV A,O_YL ;判区域标志以确定设置哪个控制器
JNB ACC.3,CNW_3
LCALL PR4 ;区域E2
LJMP CNW_4
CNW_3: LCALL PR1 ;区域E1
CNW_4: MOV A,CODE ;取间址寄存器值
MOVC A,@A+DPTR ;取汉字字模数据
JNB DISMOD,CNW_41
CPL A ;反白显示
CNW_41: MOV DAT1,A ;写数据
MOV A,O_YL
JNB ACC.3,CNW_5
LCALL PR5 ;区域E2
LJMP CNW_6
CNW_5: LCALL PR2 ;区域E1
CNW_6: INC CODE ;间址寄存器加1
INC O_XL ;列地址寄存器加1
MOV A,O_XL ;判列地址是否超出区域范围
CJNE A,#PARA1,CNW_7
CNW_7: JC CNW_8 ;未超出则继续
MOV A,O_YL ;超出则判是否在区域E2
JB ACC.3,CNW_8 ;在区域E2则退出
SETB ACC.3 ;在区域E1则修改成区域E2
MOV O_YL,A
MOV COM,#00H ;设置区域E2列地址为"0"
LCALL PR4
CNW_8: DJNZ COUNT1,CNW_4 ;当页循环
MOV A,O_YL ;读页地址寄存器
JB ACC.7,CNW_9 ;判完成标志D7位, "1"则完成退出
INC A ;否则页地址加1
SETB ACC.7 ;置完成位为"1"
CLR ACC.3
MOV O_YL,A
MOV CODE,#08H ;间址寄存器设置为16
LJMP CNW_1 ;大循环
CNW_9: RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 16*16点阵中文写入子程序CCW_PR
; 程序参数选择:PARA1
; 占用内部资源:O_XL,O_YL,CODE,COUNT1,A,DPTR
; 内部调用子程序:PR1,PR2,PR4,PR5
; 连接字库: CCTAB
; 程序调用入口: CCW_PR
; 程序输入变量: O_XL,O_YL,CODE
CCW_PR: MOV DPTR,#CCTAB ;确定字符字模块首地址
MOV A,CODE ;取代码
MOV B,#20H ;字模块宽度为32个字节
MUL AB ;代码x32
ADD A,DPL ;字符字模块首地址
MOV DPL,A ;=字模库首地址+代码x32
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH O_XL ;列地址入栈
PUSH O_XL ;列地址入栈
MOV CODE,#00H ;代码寄存器借用为间址寄存器
CCW_1: MOV COUNT1,#10H ;计数器设置为16
MOV A,O_YL ;读页地址寄存器
ANL A,#03H
ORL A,#0B8H ;"或"页地址设置代码
MOV COM,A ;写页地址设置指令
LCALL PR1
LCALL PR4
POP O_XL ;取列地址值
MOV A,O_XL ;读列地址寄存器
CLR C
SUBB A,#PARA1 ;列地址-模块参数
JC CCW_2 ;〈0为左半屏显示区域(E1)
MOV O_XL,A ;≥0为右半屏显示区域(E2)
MOV A,O_YL
SETB ACC.3 ;设置区域标志位.
MOV O_YL,A ;"0"为E1,"1"为E2
CCW_2: MOV COM,O_XL ;设置列地址值
MOV A,O_YL ;判区域标志以确定设置哪个控制器
JNB ACC.3,CCW_3
LCALL PR4 ;区域E2
LJMP CCW_4
CCW_3: LCALL PR1 ;区域E1
CCW_4: MOV A,CODE ;取间址寄存器值
MOVC A,@A+DPTR ;取汉字字模数据
MOV DAT1,A ;写数据
MOV A,O_YL
JNB ACC.3,CCW_5
LCALL PR5 ;区域E2
LJMP CCW_6
CCW_5: LCALL PR2 ;区域E1
CCW_6: INC CODE ;间址寄存器加1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -