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

📄 1.19无联机有错误码版本.asm

📁 红外抄表器.rar
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#0
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN       ;抄表失败
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
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码001:等待接收红外超时
        MOV O_XL,#30H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#1
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN
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
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码010:接收命令字不正确
        MOV O_XL,#30H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#1
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#0
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN
CONT0:  INC R0
        INC R0            ;命令字
        MOV A,@R0
        XRL A,#62H         ;判断命令字是否正确
        JZ CONT1
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码010:接收命令字不正确
        MOV O_XL,#30H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#1
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#0
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN
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
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码001:等待红外接收超时
        MOV O_XL,#30H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#1
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN
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
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码100:接收到的机号高位不符
        MOV O_XL,#30H
        MOV CODE,#1
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#0
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN
CB_COM01:INC R0
        MOV A,@R0
        XRL A,JIHAOL
        JZ CB_COM02
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码101:接收到的机号低位不符
        MOV O_XL,#30H
        MOV CODE,#1
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#0
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#1
        LCALL CNW_PR      ;
		 CLR DISMOD
		 LJMP SCAN
CB_COM02:MOV A,DATNUM        ;第3个字节为数据长度
        XRL A,#04H
        JZ SUC1
        LCALL FAIL1
		 SETB DISMOD
		 MOV O_YL,#02H		;错误码110:接收到的数据长度不符
        MOV O_XL,#30H
        MOV CODE,#1
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#38H
        MOV CODE,#1
        LCALL CNW_PR
        MOV O_YL,#02H
        MOV O_XL,#40H
        MOV CODE,#0
        LCALL CNW_PR
        CLR DISMOD		;
		 LJMP SCAN


		;抄表成功
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      ;"败"
        MOV O_YL,#02H
        MOV O_XL,#00H
        MOV CODE,#1EH
        LCALL CCW_PR      ;"错"
        MOV O_YL,#02H
        MOV O_XL,#10H
        MOV CODE,#1FH
        LCALL CCW_PR      ;"误"
        MOV O_YL,#02H
        MOV O_XL,#20H
        MOV CODE,#20H
        LCALL CCW_PR      ;"码"
		RET




;###########液晶初始化子程序 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
        CLR TI
        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          ;

⌨️ 快捷键说明

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