📄 1.19无联机有错误码版本.asm
字号:
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 + -