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

📄 实验1-缺联机.asm

📁 红外抄表器.rar
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        LJMP FAIL1       ;抄表失败
BGNCB1: MOV O_YL,#00H
        MOV O_XL,#00H
        MOV CODE,#0AH
        LCALL CCW_PR      ;"正"
        MOV O_YL,#00H
        MOV O_XL,#10H
        MOV CODE,#0BH
        LCALL CCW_PR      ;"在"
        MOV O_YL,#00H
        MOV O_XL,#20H
        MOV CODE,#06H
        LCALL CCW_PR      ;"抄"
        MOV O_YL,#00H
        MOV O_XL,#30H
        MOV CODE,#07H
        LCALL CCW_PR      ;"表"
        LCALL DL100MS
        LCALL DL100MS
        LCALL DL100MS     ;
        MOV R3,#30H       ;命令字
        MOV R4,#04H       ;数据长度
        LCALL IRT         ;调用红外发射程序

;=============接受数据=============
        CLR RI
        MOV COUNT2,#3     ;接收数据头缓冲区
        MOV R0,#DAT
WAITA0: MOV DLCNT,#250
WAIT1:  JB RI,BEGIN1
        LCALL DLY1MS
        DJNZ DLCNT,WAIT1
        LJMP FAIL1
BEGIN1: MOV A,SBUF
        CLR RI
        MOV @R0,A
        INC R0
        DJNZ COUNT2,WAITA0
        MOV R0,#DAT       ;数据头
        MOV A,@R0
        XRL A,#62H        ;判断命令字是否正确
        JZ  CONT0
        LJMP FAIL1
CONT0:  INC R0
        INC R0            ;命令字
        MOV A,@R0
        XRL A,#62H         ;判断命令字是否正确
        JZ CONT1
        LJMP FAIL1
CONT1:  DEC R0            ;数据长度
        MOV A,@R0
        MOV DATNUM,A      ;数据长度
        MOV COUNT2,A
        MOV R0,#DAT+3
WAITA1: MOV DLCNT,#250     ;超时设置
WAIT2:  JB RI,BEGIN2
        LCALL DLY1MS
        DJNZ DLCNT,WAIT2
        LJMP FAIL1
BEGIN2: MOV A,SBUF
        CLR RI
        MOV @R0,A
        INC R0
        DJNZ COUNT2,WAITA1

;抄表结束
CB_COM: MOV R0,#DAT+3    ;指向表地址存储单元
        MOV A,@R0
        XRL A,JIHAOH
        JZ CB_COM01
        LJMP FAIL1
CB_COM01:INC R0
        MOV A,@R0
        XRL A,JIHAOL
        JZ CB_COM02
        LJMP FAIL1
CB_COM02:MOV A,DATNUM        ;第3个字节为数据长度
        XRL A,#04H
        JZ SUC1
        LJMP FAIL1
;抄表成功
SUC1:   MOV A,JIHAOH
        MOV R5,A
        MOV A,JIHAOL
        MOV R4,A
        LCALL BCD4B        ;两压缩BCD码转16进制,转换后高位存R5中,低位存R4中
        MOV A,R5
        MOV DAT16H,A
        MOV A,R4
        MOV DAT16L,A
        CLR C
        SUBB A,#01H
        JC SUC1_1
        MOV R4,A
        MOV A,DAT16H
        MOV R5,A
        LJMP SUC1_2
SUC1_1: MOV A,DAT16H
        CLR C
        SUBB A,#01H
        MOV R5,A
        MOV R4,#0FFH
SUC1_2: LCALL BINRL   ;左移一位
        LCALL BINRL
        MOV A,R5
        MOV ADDRH,A     ;每户分配4字节存储空间,两位地址号,两位总用电量
        MOV A,R4
        MOV ADDRL,A     ;计算本户在24C64中的首地址
        MOV R0,#DAT+3     ;写入数据缓冲区
        MOV R3,#04H
STOR1:  MOV COUNT,#4
        LCALL WRDAT     ;此子程序内R0自动调整 ,将表号和用户电量共四字节数据写入AT24C64中

CONT3:  SETB SUCCESS
        MOV O_YL,#00H
        MOV O_XL,#00H
        MOV CODE,#06H
        LCALL CCW_PR      ;"抄"
        MOV O_YL,#00H
        MOV O_XL,#10H
        MOV CODE,#07H
        LCALL CCW_PR      ;"表"
        MOV O_YL,#00H
        MOV O_XL,#20H
        MOV CODE,#0FH
        LCALL CCW_PR      ;"成"
        MOV O_YL,#00H
        MOV O_XL,#30H
        MOV CODE,#10H
        LCALL CCW_PR      ;"功"
        LJMP SCAN

FAIL1:  MOV O_YL,#00H
        MOV O_XL,#00H
        MOV CODE,#06H
        LCALL CCW_PR      ;"抄"
        MOV O_YL,#00H
        MOV O_XL,#10H
        MOV CODE,#07H
        LCALL CCW_PR      ;"表"
        MOV O_YL,#00H
        MOV O_XL,#20H
        MOV CODE,#11H
        LCALL CCW_PR      ;"失"
        MOV O_YL,#00H
        MOV O_XL,#30H
        MOV CODE,#12H
        LCALL CCW_PR      ;"败"
        LJMP SCAN



;###########液晶初始化子程序 INT ##########
; 入口参数:无
; 出口参数:无
; 需调用子程序:写指令子程序(E1)-PR1,写指令子程序(E2)-PR4
;#########################################

      INT:      MOV     COM,#0E2H	;复位 COM  EQU 29H           ;指令码寄存器
                LCALL   PR1          ;写指令子程序(E1)
                LCALL   PR4          ;写指令子程序(E2)
                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
; 入口参数:无
; 出口参数:无
; 内部调用子程序:
;     1. 写指令代码子程序(左屏E1)PR1
;     2. 写显示数据子程序(左屏E1)PR2
;     3. 写指令代码子程序(右屏E2)PR4
;     4. 写显示数据子程序(右屏E2)PR5
;########################################################

        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


;###########所有参数写入AT24C64,共4字节#################
;说明:将表号和用户电量共四字节数据写入AT24C64中
;入口参数:
;    1.数据间接寻址地址-R0
;    2.写入到AT24C64的地址字-ADDRH,ADDRL
;    3.写入字节数-COUNT
;出口参数:无
;需调用子程序:at24c64驱动程序
;#######################################################

WRDAT:  LCALL AT1         ;START
	MOV A,#0A0H
	LCALL ATW2        ;写器件寻址00H(第一片AT24C64)  将A中的字符发送
	JB PSW.5,WRDAT
	MOV A,ADDRH
        LCALL ATW2
	JB PSW.5,WRDAT
	MOV A,ADDRL
	LCALL ATW2        ;存储单元地址
	JB PSW.5,WRDAT
        MOV R7,COUNT
WRDAT0: MOV A,@R0
	LCALL ATW2        ;写入数据
	JB PSW.5,WRDAT
        INC R0
        DJNZ R7,WRDAT0
        LCALL ATW3
        LCALL DL20MS
        RET



;############红外发射子程序-IRT ##############
;入口参数:命令字-R3,数据长度R4
;出口参数:无
;说明:R3为30H时表示抄表,为32H时表示设置表号
;需调用子程序:无
;############################################

IRT:   CLR RI
        MOV A,SBUF        ;清空缓冲区
        MOV A,R3       ;命令字
        SETB TB8          ;发命令时TB8=1
        MOV SBUF,A
        JNB TI,$          ;等待发送完
        CLR TI
        LCALL DLY10MS
        MOV A,R4
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI            ;
        LCALL DLY10MS
        MOV A,R3
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI
        LCALL DLY10MS
        MOV A,JIHAOH
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI
        LCALL DLY10MS
        MOV A,JIHAOL
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI
        LCALL DLY10MS
		RET




;##########液晶驱动子程序-PR1,PR2,PR3,PR4,PR5,PR6################
; 直接驱动子程序由6个子程序组成:
;     1. 写指令代码子程序(左屏E1)PR1
;     2. 写显示数据子程序(左屏E1)PR2
;     3. 读显示数据子程序(左屏E1)PR3
;     4. 写指令代码子程序(右屏E2)PR4
;     5. 写显示数据子程序(右屏E2)PR5
;     6. 读显示数据子程序(右屏E2)PR6
; 占用内部寄存器: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


;###############显示标题程序段-DISTITL ####################
;入口参数:无
;出口参数:无
;需调用函子程序:16*16点阵中文写入程序-CCW_PR
;################################################
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -