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

📄 kychbiao_36.asm

📁 红外抄表器.rar
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;正式版,采用简化的抄表联络,解决显示及存取E2PROM的BUG,提高键盘响应速度.
;非联机状态P2.2为高电平
;将联机改为中断方式,可连续读取抄表器数据
;为与网抄兼容,不采用校验,发送命令时TB8=1,SM2=0
;加大存储容量,最多可存36户
;每户分配128字节存储空间
;兼容485网抄,发送机号时主机波特率为4800
;;;;2009-10-11改红外抄表器程序,接收单相射频卡电表数据;;;;;;;
CWADD1  EQU 2C00H         ;写指令代码地址(E1)
CRADD1  EQU 2D00H         ;读状态字地址(E1)
DWADD1  EQU 2E00H         ;写显示数据地址(E1)
DRADD1  EQU 2F00H         ;读显示数据地址(E1)
CWADD2  EQU 4C00H         ;写指令代码地址(E2)
CRADD2  EQU 4D00H         ;读状态字地址(E2)
DWADD2  EQU 4E00H         ;写显示数据地址(E2)
DRADD2  EQU 4F00H         ;读显示数据地址(E2)
PRNADDR EQU 1C00H         ;打印机端口地址

DOG     BIT P2.7          ;喂狗线
CTRL232 BIT P2.2          ;MAX232控制线
SCTRL   BIT P3.2          ;串口控制(0-封锁红外发射接收;1-开启红外发射接收)
PRNERR  BIT P1.7          ;微打出错标志
BUSY    BIT P3.3          ;微打忙输出标志(1-忙)
SCL     BIT P3.5          ;24C64的时钟端
SDA     BIT P3.4          ;24C64的数据端
DISMOD  BIT 00H           ;显示模式(0-正常显示;1-反白显示)
FLAG    BIT 01H           ;用于区分当前输入(0-机号;1-户号)
FINISH  BIT 02H           ;当前操作完成标志(不管成功,失败)
SUCCESS BIT 03H           ;当前操作成功标志
PERR    BIT 04H           ;打印机故障标志
RECSUC  BIT 05H           ;串行接收成功
STATE   EQU 10H           ;系统状态标志(0-待机状态;1-抄表状态;2-查询状态;3-设置状态;4-联机状态)
KEYNUM  EQU 11H           ;键号
DAT16H  EQU 12H
DAT16L  EQU 22H
;SPNUM   EQU 12H           ;打印空格(行)数
;LSPAC   EQU 13H           ;打印行间距
;WSPAC   EQU 14H           ;打印字间距
ADDRH   EQU 13H
ADDRL   EQU 14H           ;读写AT24C64的首地址
DINT    EQU 15H           ;15-16H(BCD码)
DSMALL  EQU 17H           ;BCD码
KINBUF  EQU 18H           ;键盘输入缓冲区,4字节
DISBUF  EQU 1CH           ;4字节
; 20H,21H用于位定义
;JIHAO   EQU 22H           ;机号
JIHAOH  EQU 23H            ;机号高位(两位BCD码)
JIHAOL  EQU 24H            ;机号低位
;HUHAO   EQU 23H           ;户号
;HUSHU   EQU 24H           ;户数
DLCNT   EQU 25H           ;延时计数值
COUNT   EQU 26H           ;读写24C02数据个数
COUNT2  EQU 27H
TMP     EQU 28H
; 程序变量定义,根据用户平台提供的内部资源修改
COM     EQU 29H           ;指令码寄存器
DAT1    EQU 2AH           ;数据寄存器
O_XL    EQU 2BH           ;列地址(0~77H)
O_YL    EQU 2CH		  ;在显示字符时定义为页地址 D1,D0: 页地址
			  ;并且    D7: 字符体 D7=0为6x8点阵
			  ;	              D7=1为8x8点阵
			  ;在绘点显示时定义为行地址(0-31)
                          ;其中    D7:为点标志 "1"为置点
			  ;                     "0"为清点
CODE    EQU 2DH		  ;字符代码
COUNT1  EQU 2EH		  ;计数器1
PARA1   EQU 3DH           ;液晶模块参数 MGLS12232
SCNT    EQU 2FH           ;串行接收计数
DATNUM  EQU 30H           ;数据个数
DAT     EQU 40H           ;数据存储区

        ORG 0000H
        LJMP START
        ORG 0023H
        LJMP SFW
        ORG 0030H
START:  MOV SP,#0E0H
        MOV TMOD,#20H     ;设置定时器1为模式2(自动再装入)
        MOV TH1,#0E8H
        MOV TL1,#0E8H
        SETB TR1;         ;启动定时器1工作
        MOV SCON,#050H    ;设置串行口为模式1, 1起; 8数; 1结束
        MOV PCON,#00H     ;波特率在11.0592M时为1200波特

        LCALL INT	  ;液晶初始化子程序
        LCALL CLEAR	  ;清显示RAM子程序
	LCALL DISTITL  	  ;标题显示程序段
        LCALL CLEAR
        LCALL DISTITL
        CLR DISMOD        ;正常显示
        MOV STATE,#00H    ;待机状态
        MOV JIHAOH,#00H
        MOV JIHAOL,#01H
        ;MOV HUHAO,#01H
        CLR PERR
        CLR FLAG
        CLR SUCCESS
        CLR FINISH
        CLR RECSUC
SCAN:   MOV A,STATE
        CJNE A,#00H,TSTAT00
        LJMP DSTATE0
TSTAT00:LJMP TSTATE1
DSTATE0:LCALL SCANKEY
        MOV A,KEYNUM
        CJNE A,#0FFH,DKEY0
        LCALL DLY10MS
        LJMP SCAN         ;无键按下
DKEY0:  CJNE A,#00H,DKEY01;抄表键
        LJMP DKEY00
DKEY01: LJMP DKEY1
DKEY00: LCALL DLY10MS
        LCALL KEXAM
        JNZ DKEY00        ;等键放开
        MOV STATE,#01H
        MOV JIHAOH,#00H
        MOV JIHAOL,#01H
        MOV HUHAO,#01H
        CLR FLAG
        CLR FINISH
        CLR SUCCESS
        LCALL CLEAR
        CLR DISMOD
        LCALL DISJH       ;显示"机号"
        SETB DISMOD
        LCALL DISJIHAO    ;反白显示机号
        CLR DISMOD
        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      ;"表"
        LJMP SCAN

DKEY1:  CJNE A,#01H,DKEY02;查询键
        LJMP DKEY03
DKEY02: LJMP DKEY2
DKEY03: LCALL DLY10MS
        LCALL KEXAM
        JNZ DKEY03        ;等键放开
        MOV STATE,#02H
        MOV JIHAOH,#00H
        MOV JIHAOL,#01H
        ;MOV HUHAO,#01H
        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

DKEY2:  CJNE A,#02H,DKEY04;设置表号键
        LJMP DKEY05
DKEY04: LJMP DKEY3
DKEY05: LCALL DLY10MS
        LCALL KEXAM
        JNZ DKEY05        ;等键放开
        MOV STATE,#03H
        MOV JIHAOH,#00H
        MOV JIHAOL,#01H
        ;MOV HUHAO,#00H    ;默认打印该机所有用户数据
        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

DKEY3:  CJNE A,#09H,DKEY06;联机键
        LJMP DKEY07
DKEY06: LJMP DKEY4
DKEY07: LCALL DLY10MS
        LCALL KEXAM
        JNZ DKEY07        ;等键放开
        MOV STATE,#04H    ;联机状态
        LJMP BGSHEZHI

DKEY4:  CJNE A,#07H,DKEY6
DKEY09: LCALL DLY10MS
        LCALL KEXAM       ;按下返回键
        JNZ DKEY09        ;等键放开
        CLR ES
        CLR EA
        LCALL CLEAR
	LCALL DISTITL  	  ;标题显示程序段
DKEY6:  LJMP SCAN

TSTATE1:CJNE A,#01H,TSTAT10
        LJMP DSTATE1      ;抄表状态
TSTAT10:LJMP TSTATE2
DSTATE1:LCALL SCANKEY
        MOV A,KEYNUM
        CJNE A,#0FFH,DKEY10
        LCALL DLY10MS
        LJMP SCAN         ;无键按下

DKEY10: CJNE A,#00H,DKEY11
CKEY10: LCALL DLY10MS
        LCALL KEXAM       ;按下抄表键
        JNZ CKEY10        ;等键放开
        JNB FINISH,DOCHAOB
        LJMP SCAN         ;
DOCHAOB:LJMP BGNCB        ;跳转到开始抄表

DKEY11: CJNE A,#01H,DKEY12
CKEY11: LCALL DLY10MS
        LCALL KEXAM       ;按下查询键
        JNZ CKEY11        ;等键放开
        MOV STATE,#02H
        ;MOV HUHAO,#01H    ;当前机号不变,户号01
        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

DKEY12: CJNE A,#02H,DKEY13
CKEY12: LCALL DLY10MS
        LCALL KEXAM       ;按下设置键
        JNZ CKEY12        ;等键放开
        MOV STATE,#03H
        ;MOV HUHAO,#00H    ;当前机号不变,默认打印所有户
        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

DKEY13: CJNE A,#03H,DKEY14
        JNB FINISH,KEY131
        LJMP EDSCAN
KEY131: INC JIHAOH
        MOV A,JIHAOH       ;千百位键
        CJNE A,#0AH,KEY133
KEY133: JC KEY134           ;判断千、百位是否大于09,不大于则转
        MOV A,#00H
        MOV JIHAOH,A;;;;;;;;超过9的数设定为0
KEY134: MOV A,JIHAOL
        SWAP A
        ANL A,#0FH
        CJNE A,#0AH,KEY13_3
KEY13_3:JC KEY13_4
        MOV A,#01H
        MOV JIHAOL,A
KEY13_4:MOV A,JIHAOL
        ANL A,#0FH
        CJNE A,#0AH,KEY_5
KEY13_5:JC KEY135
        MOV A,#01H
        MOV JIHAOL,A
KEY135: SETB DISMOD
        LCALL DISJIHAO
        LCALL DLY10MS
        LJMP EDSCAN

DKEY14: CJNE A,#04H,DKEY15
        JNB FINISH,KEY141
        LJMP EDSCAN
KEY141: MOV A,JIHAOH        ;千、百位键
        CJNE A,#0AH,KEY141_1
KEY141_1: JC KEY144
        MOV A,#00H
        MOV JIHAOH,A
KEY144: MOV A,JIAHOL
        ADD A,#10H
        MOV JIHAOL,A
        SWAP A
        ANL A,#0FH
        CJNE A,#0AH,KEY145
KEY145: JC KEY146
        MOV A,#01H
        MOV JIHAOL,A
KEY146: MOV A,JIHAOL        ;十位小于等于9
        ANL A,#0FH
        CJNE A,#0AH,KEY14_1
KEY14_1:JC KEY148
        MOV A,#01H
        MOV JIHAOL,A
KEY148: SETB DISMOD
        LCALL DISJIHAO
        LCALL DLY10MS
        LJMP EDSCAN

DKEY15: CJNE A,#05H,DKEY16
        JNB FINISH,KEY151
        LJMP EDSCAN
KEY151: MOV A,JIHAOH        ;千、百位键
        CJNE A,#0AH,KEY15_3
KEY15_3:JC KEY15_4
        MOV A,#00H
        MOV JIHAOH,A
KEY15_4:INC JIHAOL
        MOV A,JIHAOL
        SWAP A
        ANL A,#0FH
        CJNE A,#0AH,KEY15_5
KEY15_5:JC KEY15_6
        MOV A,#01H
        MOV JIHAOL,A
KEY15_6:MOV A,JIHAOL
        ANL A,#0FH
        CJNE A,#0AH,KEY15_7
KEY15_7:JC KEY156
        MOV A,#01H
        MOV JIHAOL,A
KEY156: SETB DISMOD
        LCALL DISJIHAO
        LJMP EDSCAN

DKEY16: CJNE A,#06H,DKEY17
CKEY16: LCALL DLY10MS
        LCALL KEXAM       ;清除键
        JNZ CKEY16        ;等键放开
        JNB FINISH,KEY161
        LJMP SCAN
KEY161: MOV JIHAOH,#00H
        MOV JIHAOL,#01H
        SETB DISMOD
        LCALL DISJIHAO
        LJMP SCAN

DKEY17: CJNE A,#07H,DKEY18
CKEY17: LCALL DLY10MS
        LCALL KEXAM       ;返回键
        JNZ CKEY17        ;等键放开
        MOV STATE,#00H
        MOV JIHAOH,#00H
        MOV JIHAOL,#01H
        ;MOV HUHAO,#01H
        CLR ES
        CLR EA
        LCALL CLEAR
        LCALL DISTITL
        LJMP SCAN

DKEY18: CJNE A,#08H,DKEY190
        LJMP CKEY18
DKEY190:LJMP SCAN
CKEY18: LCALL DLY10MS     ;确定键
        LCALL KEXAM
        JNZ CKEY18        ;等键放开
        JNB FINISH,BGNCB
        JNB SUCCESS,RECB
RECB:   CLR FINISH
        CLR SUCCESS
        LCALL CLEAR
        CLR DISMOD
        LCALL DISJH
        SETB DISMOD
        LCALL DISJIHAO
        CLR DISMOD
        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      ;"表"
        LJMP SCAN

;;;;;;;;;;;抄表;;;;;;;;;;;;;;;;;;;;;;;;
BGNCB:  CLR FLAG
        SETB FINISH
        CLR SUCCESS
        clr dismod
        LCALL DISJIHAO    ;刷新机号显示(非反白)
        MOV A,JIHAOH
        JNZ BGNCB1
        MOV A,JIHAOL
        JNZ BGNCB1
        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     ;

ASK:    CLR RI
        MOV A,SBUF        ;清空缓冲区
        MOV A,#030H
        SETB TB8          ;发命令时TB8=1
        MOV SBUF,A
        JNB TI,$
        CLR TI
        LCALL DLY10MS
        MOV A,#004H
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI            ;
        LCALL DLY10MS
        MOV A,#030H
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$
        CLR TI
        LCALL DLY10MS
        MOV A,JIHAOH
        SETB TB8          ;
        MOV SBUF,A
        JNB TI,$

⌨️ 快捷键说明

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