⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kychbiao_36.asm

📁 红外抄表器.rar
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	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 + -