📄 显示.asm
字号:
;正式版,采用简化的抄表联络,解决显示及存取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)
DOG BIT P2.7 ;喂狗线
CTRL232 BIT P2.2 ;MAX232控制线
SCTRL BIT P3.2 ;串口控制(0-封锁红外发射接收;1-开启红外发射接收)
BUSY BIT P3.3 ;微打忙输出标志(1-忙)
SCL BIT P3.5 ;24C64的时钟端
SDA BIT P3.4 ;24C64的数据端
DISMOD BIT 00H ;显示模式(0-正常显示;1-反白显示)
FINISH BIT 02H ;当前操作完成标志(不管成功,失败)
SUCCESS BIT 03H ;当前操作成功标志
RECSUC BIT 05H ;串行接收成功
STATE EQU 10H ;系统状态标志(0-待机状态;1-抄表状态;2-查询状态;3-设置状态;4-联机状态)
KEYNUM EQU 11H ;键号
DAT16H EQU 12H
DAT16L EQU 22H
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用于位定义
JIHAOH EQU 23H ;机号高位(两位BCD码)
JIHAOL 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 ;正常显示 0:正常,1反白
MOV STATE,#00H ;待机状态 STATE EQU 10H 系统状态标志(0-待机状态;1-抄表状态;2-查询状态;3-设置状态;4-联机状态)
MOV JIHAOH,#00H
MOV JIHAOL,#01H
CLR SUCCESS ;SUCCESS BIT 03H ;当前操作成功标志
CLR FINISH ;FINISH BIT 02H ;当前操作完成标志(不管成功,失败)
CLR RECSUC ;RECSUC BIT 05H ;串行接收成功
SCAN: MOV A,STATE
CJNE A,#00H,TSTAT00;非待机状态则转
;==================================================================================待机状态=====================-
LJMP DSTATE0 ;待机状态
TSTAT00:LJMP SCAN;TSTATE1
DSTATE0:LCALL SCANKEY ; 调键盘扫描程序,键值存KEYNUM中,无键值则KEYNUM中存'0FFH'
MOV A,KEYNUM
CJNE A,#0FFH,DKEY0 ;有键值则转
LCALL DLY10MS
LJMP SCAN ;无键按下
DKEY0: CJNE A,#00H,DKEY01;抄表键
;---------------------------------------------------------------待机状态-抄表键(00H)------------------------------
LJMP DKEY00
DKEY01: LJMP DKEY1
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;查询键
;-------------------------------------------------------------待机状态-查询键(01H)------------------------------------
LJMP DKEY03
DKEY02: LJMP DKEY2
DKEY03: MOV STATE,#02H ;设置为查询状态
MOV JIHAOH,#00H
MOV JIHAOL,#01H
CLR FINISH
CLR SUCCESS
LCALL CLEAR
CLR DISMOD
LCALL DISJH ;显示"机号"
SETB DISMOD
LCALL DISJIHAO ;反白显示机号
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;设置表号键
;-----------------------------------------------------------待机状态-设置键(02H)-----------------------------
LJMP DKEY05
DKEY04: LJMP DKEY3
DKEY05: MOV STATE,#03H ;设置为设置状态
MOV JIHAOH,#00H
MOV JIHAOL,#01H
CLR FINISH
CLR SUCCESS
LCALL CLEAR
CLR DISMOD
LCALL DISJH ;显示"机号"
SETB DISMOD
LCALL DISJIHAO ;反白显示机号
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;联机键
;-----------------------------------------------------------待机状态-联机键(09H)-----------------------
LJMP DKEY07
DKEY06: LJMP DKEY4
DKEY07: LCALL DLY10MS
LCALL KEXAM
JNZ DKEY07 ;等键放开
MOV STATE,#04H ;联机状态
LJMP SCAN;BGLIANJ
DKEY4: CJNE A,#07H,DKEY6
;-----------------------------------------------------待机状态-返回键(07H)----------------------------
DKEY09: ;返回键
CLR ES
CLR EA
LCALL CLEAR
LCALL DISTITL ;标题显示程序段
DKEY6: LJMP SCAN
TSTATE1:CJNE A,#01H,TSTAT10 ;非抄表状态则转
;=============================================================================抄表状态======================
LJMP DSTATE1 ;抄表状态
TSTAT10:LJMP SCAN;TSTATE2
DSTATE1:LCALL SCANKEY
MOV A,KEYNUM
CJNE A,#0FFH,DKEY10
LCALL DLY10MS
LJMP SCAN ;无键按下
DKEY10: CJNE A,#00H,DKEY11;有键按下
;----------------------------------------------------抄表状态-抄表键(00H)----------------------------
CKEY10:
JNB FINISH,DOCHAOB
LJMP SCAN ;
DOCHAOB:LJMP BGNCB ;跳转到开始抄表
DKEY11: CJNE A,#01H,DKEY12
;---------------------------------------------------抄表状态-查询键(01H)----------------------------
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
;--------------------------------------------------抄表状态-设置键(02H)
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
;-----------------------------------------------抄表状态-百位键(03H)---------------------
JNB FINISH,KEY131
LJMP EDSCAN
KEY131: LCALL KEYBW ;调百位键处理函数
LJMP EDSCAN
DKEY14: CJNE A,#04H,DKEY15
;----------------------------------------------抄表状态-十位键(04H)-----------------------
JNB FINISH,KEY141
LJMP EDSCAN
KEY141: LCALL KEYSW ;调十位键处理函数
LJMP EDSCAN
DKEY15: CJNE A,#05H,DKEY16
;---------------------------------------------抄表状态-个位键(05H)-------------------------
JNB FINISH,KEY151
LJMP EDSCAN
KEY151: LCALL KEYGW ;调个位键处理函数
LJMP EDSCAN
DKEY16: CJNE A,#06H,DKEY17
;--------------------------------------------抄表状态-消除键(06H)-------------------------
CKEY16:
JNB FINISH,KEY161
LJMP SCAN
KEY161: MOV JIHAOH,#00H
MOV JIHAOL,#01H
SETB DISMOD
LCALL DISJIHAO
LJMP SCAN
DKEY17: CJNE A,#07H,DKEY18
;--------------------------------------------抄表状态-返回键(07H)---------------------------
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
;--------------------------------------------抄表状态-确定键(08H)----------------------------
LJMP CKEY18
DKEY190:LJMP SCAN
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 ;
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 ;判断命令字是否正确
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -