📄 实验1-缺联机.asm
字号:
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 + -