?? kychbiao_36.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)
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 + -