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

📄 kychbiao_36.asm

📁 红外抄表器.rar
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        CLR TI
        LCALL DLY10MS
        MOV A,JIHAOL
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI
        LCALL DLY10MS
        ;MOV A,#00H        ;校验和高字节
        ;SETB TB8          ;
        ;MOV SBUF,A
        ;JNB TI,$
        ;CLR TI
        ;LCALL DLY10MS
        ;MOV A,#63H        ;校验和低字节
        ;SETB TB8          ;发命令时TB8=1
        ;MOV SBUF,A
        ;JNB TI,$
        ;CLR TI
;        LCALL DLY10MS

;////////////////////////////////;
       ; LCALL DLY1MS
       ; MOV A,SBUF
       ; CLR RI
       ; LCALL DLY1MS
       ; MOV A,SBUF
        CLR RI

;////////////////////////////////;
;        MOV COUNT2,#128
;        MOV R0,#DAT
;LOOPREC:JNB RI,$
;        MOV A,SBUF
;        MOV @R0,A
;        INC R0
;        CLR RI
;        DJNZ COUNT2,LOOPREC
;////////////////////////////////;

        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
        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自动调整
        
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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TSTATE2:CJNE A,#02H,TSTAT20
        LJMP DSTATE2
TSTAT20:LJMP TSTATE3
DSTATE2:LCALL SCANKEY     ;查询状态
        MOV A,KEYNUM
        CJNE A,#0FFH,DKEY20
        LCALL DLY10MS
        LJMP SCAN         ;无键按下
DKEY20: CJNE A,#01H,DKEY21
CKEY20: LCALL DLY10MS
        LCALL KEXAM
        JNZ CKEY20        ;等键放开
        JB FINISH,KEY201
        LJMP BGINQ
KEY201: LJMP SCAN

DKEY21: CJNE A,#02H,DKEY22
CKEY21: LCALL KEXAM
        JNZ CKEY21        ;等键放开
        MOV STATE,#03H    ;当前机号,户号均不变
        CLR FLAG
        CLR FINISH
        CLR SUCCESS
        LCALL CLEAR
        CLR DISMOD
        LCALL DISJH       ;"显示机号"
        LCALL DISHH       ;"显示户号"
        SETB DISMOD
        LCALL DISJIHAO    ;反白显示机号
        CLR DISMOD
        LCALL DISHUHAO    ;显示户号
        MOV O_YL,#00H
        MOV O_XL,#00H
        MOV CODE,#13H
        LCALL CCW_PR      ;"打"
        MOV O_YL,#00H
        MOV O_XL,#10H
        MOV CODE,#14H
        LCALL CCW_PR      ;"印"
        LJMP SCAN

DKEY22: CJNE A,#03H,DKEY23
        JNB FINISH,KEY221
        LJMP EDSCAN
KEY221: JNB FLAG,KEY222   ;百位键
        LJMP EDSCAN       ;户号百位无效
KEY222: MOV A,JIHAO
        CJNE A,#101,KEY223
KEY223: JC KEY224
        MOV A,JIHAO
        MOV B,#100
        DIV AB
        MOV JIHAO,B       ;机号超过200,百位回0
        LJMP KEY225
KEY224: MOV A,JIHAO
        ADD A,#100
        MOV JIHAO,A
KEY225: SETB DISMOD
        LCALL DISJIHAO
        LJMP EDSCAN

DKEY23: CJNE A,#04H,DKEY24
        JNB FINISH,KEY231
        LJMP EDSCAN
KEY231: JNB FLAG,KEY232   ;十位键
        MOV A,HUHAO       ;调整户号
        ADD A,#10
        CJNE A,#43,K231
K231:   JC K232
        MOV A,HUHAO
        MOV B,#10
        DIV AB
        MOV HUHAO,B
        LJMP K233
K232:   MOV HUHAO,A
K233:   SETB DISMOD
        LCALL DISHUHAO
        LJMP EDSCAN
KEY232: MOV A,JIHAO
        MOV B,#100
        DIV AB
        MOV TMP,A          ;百位送存
        CJNE A,#02H,KEY233
KEY233: JC KEY234
        LJMP EDSCAN        ;机号百位为2,十位不能调整
KEY234: MOV A,B
        MOV B,#10
        DIV AB
        CJNE A,#09H,KEY235
KEY235: JC KEY236
        MOV A,TMP
        MOV TMP,B          ;个位数
        MOV B,#100
        MUL AB
        ADD A,TMP
        MOV JIHAO,A
        LJMP KEY238
KEY236: MOV A,JIHAO        ;十位小于9
        ADD A,#10
        MOV JIHAO,A
KEY238: SETB DISMOD
        LCALL DISJIHAO
        LJMP EDSCAN

DKEY24: CJNE A,#05H,DKEY240
        LJMP KEY240
DKEY240:LJMP DKEY25        ;个位键
KEY240: JNB FINISH,KEY241
        LJMP EDSCAN
KEY241: JNB FLAG,KEY242
        MOV A,HUHAO
        MOV B,#10
        DIV AB
        MOV TMP,A
        MOV A,B
        INC A
        CJNE A,#10,K241
K241:   JC K242
        MOV A,TMP
        MOV B,#10
        MUL AB
        MOV HUHAO,A
        LJMP K243
K242:   MOV B,A
        MOV A,TMP
        MOV TMP,B
        MOV B,#10
        MUL AB
        ADD A,TMP
        MOV HUHAO,A
        CJNE A,#43,CKK243
CKK243: JC K243
        MOV B,#10
        DIV AB
        MOV B,#10
        MUL AB
        MOV HUHAO,A
K243:   SETB DISMOD
        LCALL DISHUHAO
        LJMP EDSCAN
KEY242: MOV A,JIHAO
        MOV B,#10
        DIV AB
        MOV TMP,A
        CJNE A,#20,KEY243
KEY243: JC KEY244          ;机号小于200
        LJMP EDSCAN
KEY244: MOV A,B
        INC A
        CJNE A,#10,KEY245
KEY245: JC KEY246
        MOV A,TMP
        MOV B,#10
        MUL AB
        MOV JIHAO,A
        LJMP KEY247
KEY246: MOV B,A            ;个位
        MOV A,TMP          ;10的倍数
        MOV TMP,B          ;个位送TMP
        MOV B,#10
        MUL AB
        ADD A,TMP
        MOV JIHAO,A
KEY247: SETB DISMOD
        LCALL DISJIHAO
        LJMP EDSCAN

DKEY25: CJNE A,#06H,DKEY26
CKEY25: LCALL DLY10MS
        LCALL KEXAM       ;清除键
        JNZ CKEY25        ;等键放开
        JNB FINISH,KEY251
        LJMP SCAN
KEY251: JB FLAG,KEY253
        MOV JIHAO,#00H
        SETB DISMOD
        LCALL DISJIHAO
        LJMP SCAN
KEY253: MOV HUHAO,#00H
        SETB DISMOD
        LCALL DISHUHAO
        LJMP SCAN

DKEY26: CJNE A,#07H,DKEY27
CKEY26: LCALL DLY10MS
        LCALL KEXAM       ;返回键
        JNZ CKEY26        ;等键放开
        MOV STATE,#00H
        MOV JIHAO,#01H
        MOV HUHAO,#01H
        CLR ES
        CLR EA
        LCALL CLEAR
        LCALL DISTITL
        LJMP SCAN

DKEY27: CJNE A,#08H,KEY270
        LJMP CKEY27
KEY270: LJMP SCAN
CKEY27: LCALL DLY10MS     ;确定键
        LCALL KEXAM
        JNZ CKEY27        ;等键放开
        JNB FINISH,KEY272
        JNB SUCCESS,REINQ
        INC HUHAO         ;查询成功,机号不变,户号加1
        MOV A,HUHAO
        CJNE A,HUSHU,KEY271
        LJMP REINQ
KEY271: JC REINQ
        MOV HUHAO,#01H
REINQ:  CLR FLAG
        CLR FINISH
        CLR SUCCESS
        LCALL CLEAR
        CLR DISMOD
        LCALL DISJH
        LCALL DISHH
        SETB DISMOD
        LCALL DISJIHAO
        CLR DISMOD
        LCALL DISHUHAO
        MOV O_YL,#00H
        MOV O_XL,#00H
        MOV CODE,#1BH
        LCALL CCW_PR      ;"查"
        MOV O_YL,#00H
        MOV O_XL,#10H
        MOV CODE,#1CH
        LCALL CCW_PR      ;"询"
        LJMP SCAN

KEY272: JNB FLAG,K27BB
        LJMP BGINQ
K27BB:  MOV A,JIHAO
        JNZ K270
        SETB FINISH
        CLR DISMOD
        LCALL DISJIHAO
        LJMP FAIL2
K270:   DEC A
        MOV B,#128        ;每户分配128字节存储空间
        MUL AB
        MOV ADDRH,B
        MOV ADDRL,A
        MOV COUNT,#1
        MOV R0,#DAT
        LCALL LDDAT
        MOV A,DAT
        JNZ CMP01
        SETB FINISH
        CLR DISMOD
        LCALL DISJIHAO
        LJMP FAIL2
CMP01:  SWAP A
        ANL A,#0FH
        CJNE A,#0AH,CMPA1
CMPA1:  JC CMPA2
        SETB FINISH
        CLR DISMOD
        LCALL DISJIHAO
        LJMP FAIL2
CMPA2:  MOV B,#10
        MUL AB
        MOV TMP,A
        MOV A,DAT
        ANL A,#0FH
        CJNE A,#0AH,CMPA3
CMPA3:  JC CMPA4
        SETB FINISH
        CLR DISMOD
        LCALL DISJIHAO
        LJMP FAIL2
CMPA4:  ADD A,TMP
        MOV HUSHU,A
        CJNE A,#43,K273
K273:   JC K274           ;户数大于42,用户数据出错
        MOV HUSHU,#42
        SETB FINISH
        CLR DISMOD
        LCALL DISJIHAO
        LJMP FAIL2
K274:   MOV A,HUHAO
        JNZ K275
        LJMP K279
K275:   CJNE A,HUSHU,K276
        LJMP K27A
K276:   JC K27A
K279:   MOV HUHAO,#01H
K27A:   SETB FLAG
        CLR DISMOD
        LCALL DISJIHAO
        SETB DISMOD
        LCALL DISHUHAO
        LJMP SCAN
;;;;;;;;;;;查询;;;;;;;;;;;;;;;;;;;;;;;;
BGINQ:  CLR FLAG
        SETB FINISH
        CLR SUCCESS
        clr dismod
        lcall disjihao
        lcall dishuhao    ;刷新机号、户号显示(非反白)
        MOV A,JIHAO
        JNZ BGINQ1
        LJMP FAIL2
BGINQ1: MOV A,HUHAO
        JNZ BGINQ2
        LJMP FAIL2
BGINQ2: MOV O_YL,#00H
        MOV O_XL,#00H
        MOV CODE,#0AH
        LCALL CCW_PR      ;"正"
        MOV O_YL,#00H

⌨️ 快捷键说明

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