📄 ktest.asm
字号:
;*********************************************************************
;* 收费机主程序 *
;*********************************************************************
;使用W78E54单片机,晶振22.1184MHZ
;使用用片机看门狗,喂狗时间约2.5S,应在2S内喂狗一次
;串行通信波特率采用标准的9600bps
;单次消费数据4个,循环保存在500当中
;单次充值数据保存在500中,4个循环保存
;累计消费金额1个保存在500当中,累计金额超过999999重新开始计数
;累计充值金额1个保存在500当中,累计金额超过999999重新开始计数
;错误类型定义:
; 01:无连接
; 02:超时
; 03:不允许消费
INCLUDE "EQU.ASM"
;--------------------------------------------------------------------
ORG 00H
LJMP MAIN ;主程序
ORG 0BH
LJMP PTI ;定时中断0
ORG 23H
LJMP PSI ;串行中断
ORG 30H
MAIN:
LCALL D100MS
;----------------初始化RAM
MOV R0,A
MAIN_01:
MOV @R0,#0
DJNZ R0,MAIN_01
MOV AUXR,#02H ;定时器工作在普通51单片机模式,扩展RAM无效
MOV SP,#0D0H ;初始化堆栈
;----------------系统初始化
LCALL INITSYS ;系统初始化
;----------------清显示缓冲区
LCALL CDISBUF
;----------------充值按钮检测
LCALL READMAC
LCALL CHECKMAC
MAIN_04:
MOV WDT,#3FH
LCALL DISNUM
LCALL NET
LCALL KEYCL
JB FKEYA,MAIN_05
SJMP MAIN_04
MAIN_05: ;有卡时就不再响应按键,至到把上一个按键值取走
MOV WDT,#3FH
JNB FKEY,MAIN_04
LCALL NET
SJMP MAIN_05
;--------------------------------------------------------------------
;键处理
;按键具有充值与发卡两个功能
;此部分为判断是发卡还是充值
;充值为输入"*" 后输入金额,按"#"确认
;发卡为输入"**"后输入金额,按"#"确认
KEYCL:
JBC FKEY,KEYCL_01
RET
KEYCL_01:
MOV A,KEY_BAK
CJNE A,KEYAL,KEYCL_001
SJMP KEYCL_002
KEYCL_001:
MOV NUMDIS,#0
KEYCL_002:
MOV KEYAL,KEY_BAK
CJNE A,#KEY_ESC,KEYCL_02 ;第一个键非ESC键即退出
MOV KEYSEND,#0EH ;
SJMP KEYCL_RET
KEYCL_02:
CJNE A,#KEY_0,KEYCL_03
MOV KEYSEND,#30H
SJMP KEYCL_RET
KEYCL_03:
CJNE A,#KEY_1,KEYCL_04
MOV KEYSEND,#31H
SJMP KEYCL_RET
KEYCL_04:
CJNE A,#KEY_2,KEYCL_05
MOV KEYSEND,#32H
SJMP KEYCL_RET
KEYCL_05:
CJNE A,#KEY_3,KEYCL_06
MOV KEYSEND,#33H
SJMP KEYCL_RET
KEYCL_06:
CJNE A,#KEY_4,KEYCL_07
MOV KEYSEND,#34H
SJMP KEYCL_RET
KEYCL_07:
CJNE A,#KEY_5,KEYCL_08
MOV KEYSEND,#35H
SJMP KEYCL_RET
KEYCL_08:
CJNE A,#KEY_6,KEYCL_09
MOV KEYSEND,#36H
SJMP KEYCL_RET
KEYCL_09:
CJNE A,#KEY_7,KEYCL_10
MOV KEYSEND,#37H
SJMP KEYCL_RET
KEYCL_10:
CJNE A,#KEY_8,KEYCL_11
MOV KEYSEND,#38H
SJMP KEYCL_RET
KEYCL_11:
CJNE A,#KEY_9,KEYCL_12
MOV KEYSEND,#39H
SJMP KEYCL_RET
KEYCL_12:
CJNE A,#KEY_EN,KEYCL_13
MOV KEYSEND,#0FH
SJMP KEYCL_RET
KEYCL_13:
CJNE A,#0BH,KEYCL_14
MOV KEYSEND,#0AH
SJMP KEYCL_RET
KEYCL_14:
CJNE A,#0AH,KEYCL_15
MOV KEYSEND,#0BH
SJMP KEYCL_RET
KEYCL_15:
CJNE A,#09H,KEYCL_16
MOV KEYSEND,#0CH
SJMP KEYCL_RET
KEYCL_16:
CJNE A,#08H,KEYCL_RET
MOV KEYSEND,#0DH
KEYCL_RET:
SETB FKEYA
RET
;------------------------------------------
;显示输入数字
DISNUM:
MOV R0,#DIS_BUF
MOV @R0,#0AH
INC R0
MOV @R0,#0AH
INC R0
MOV @R0,#0AH
INC R0
MOV @R0,#0AH
INC R0
MOV A,NUMDIS
MOV B,#64H
DIV AB
MOV A,B
MOV NUMDIS,A
MOV B,#0AH
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
RET
;------------------------------------------
;系统初始化
INITSYS:
CLR W_ALE ;首先初始化IO端口与标志
CLR D_ALE
CLR U4_ALE
SETB WORKLED ;刷卡指示灯
MOV KEY_JSQ,#FD_JSZ ;键盘防抖
MOV DIS_P,#7FH ;动态扫描位指针
MOV JSQ_X,#4 ;分频计数器
MOV WDT,#3FH ;看门狗初始化与喂狗指令
MOV JSQ_SPEAK,#40
CLR SPEAK
MOV R7,#8
MOV R0,#DIS_BUF
INITSYS_01:
MOV @R0,#0FH ;初始化显示缓冲区
INC R0
DJNZ R7,INITSYS_01
SETB WORKLED
SETB SYSLED
MOV TMOD,#21H ;T0 工作方式1,16位定时器
;T1 工作方式2,重装初值的8位定时器
MOV TL0,#00H
MOV TH0,#0EEH ;T0 2.5ms 中断一次 65536-0.0025*22118400/12=0EE00H
SETB ET0
MOV TH1,#250 ;串行中断设置
MOV TL1,#250 ;9600
MOV SCON,#50H ;工作方式1,异步通讯8个数据位1个停止位,允许接受.
ANL PCON,#7FH ;SMOD=0
SETB TR1
SETB TR0
SETB ES
SETB PS
SETB EA
RET
;======================================
; 数据传递
;入口:R0=被传送数据地址
; R1=传送数据地址
; R2=传送字节数
;======================================
MEM_COPYA:
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,MEM_COPYA
RET
MEM_COPYB:
MOV A,@R0
MOV @R1,A
DEC R0
DEC R1
DJNZ R2,MEM_COPYB
RET
;======================================
; 将ROM数据装入RAM区
;入口:R0=RAM地址
; DPTR=ROM地址
; R2=传送字节数
;======================================
TO_MEM: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R2,TO_MEM
RET
;=======================================
; 延时子程序
;按22.1184MHz晶体计算
;占用资源:R6,R7
;=======================================
D100US: MOV R6,#93
DJNZ R6,$
RET
D100MS: MOV R7,#180
DELAY: MOV R6,#0
del1: NOP
NOP
DJNZ R6,del1
DJNZ R7,DELAY
RET
;-----------------------------------
;对物理编号校验并显示
CHECKMAC:
MOV R7,#4 ;读入物理编号
MOV DPTR,#MAC
MOV R0,#MACBUF
CHECKMAC_01:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,CHECKMAC_01
MOV R7,#4 ;检验有没有进行自动增量操作
MOV R0,#MACBUF
CHECKMAC_02:
MOV A,@R0
SUBB A,#30H
JNZ CHECKMAC_DIS
INC R0
DJNZ R7,CHECKMAC_02
SJMP CHECKMAC_ERR
CHECKMAC_DIS:
MOV R7,#5
CHECKMAC_DIS_01:
MOV DIS_BUF+0,#0AH
MOV DIS_BUF+1,#0AH
MOV R0,#MACBUF
MOV A,@R0
ANL A,#0FH
MOV DIS_BUF+2,A
INC R0
MOV A,@R0
ANL A,#0FH
MOV DIS_BUF+3,A
INC R0
MOV A,@R0
ANL A,#0FH
MOV DIS_BUF+4,A
INC R0
MOV A,@R0
ANL A,#0FH
MOV DIS_BUF+5,A
MOV WDT,#3FH
MOV JSQ_LOCAL_LOOP,#50
CLR FLAG2
JNB FLAG2,$
MOV DIS_BUF+0,#0AH
MOV DIS_BUF+1,#0AH
MOV DIS_BUF+2,#0AH
MOV A,MACNO
MOV B,#100
DIV AB
MOV DIS_BUF+3,A
MOV A,B
MOV B,#10
DIV AB
MOV DIS_BUF+4,A
MOV DIS_BUF+5,B
MOV JSQ_LOCAL_LOOP,#50
CLR FLAG2
JNB FLAG2,$
DJNZ R7,CHECKMAC_DIS_01
RET
CHECKMAC_ERR:
MOV DIS_BUF+0,#0DH ;显示错误
MOV DIS_BUF+1,#0EH
MOV DIS_BUF+2,#0EH
MOV DIS_BUF+3,#0CH
MOV DIS_BUF+5,#00H
CHECKMAC_ERR_01:
MOV WDT,#3FH
LCALL D100US
SJMP CHECKMAC_ERR_01
;---------------------------------------------------
;内外部数据校验程序
READMAC:
CLR EA
MOV ISP_ADDRH,#FLASH_ADDH
MOV ISP_ADDRL,#FLASH_ADDL
MOV ISP_CONTR,#WAIT_TIME
MOV ISP_CMD,#ISP_READBYTE
MOV ISP_TRIG,#46H
MOV ISP_TRIG,#0B9H
MOV MACNO,ISP_DATA
SETB EA
RET
WRITEMAC:
MOV ISP_ADDRH,#FLASH_ADDH
MOV ISP_ADDRL,#FLASH_ADDL
CLR EA
MOV ISP_CONTR,#WAIT_TIME
MOV ISP_CMD,#ISP_SECTOR
MOV ISP_TRIG,#46H
MOV ISP_TRIG,#0B9H
MOV ISP_ADDRH,#FLASH_ADDH
MOV ISP_ADDRL,#FLASH_ADDL
MOV ISP_DATA,MACNO
MOV ISP_CONTR,#WAIT_TIME
MOV ISP_CMD,#ISP_PROBYTE
MOV ISP_TRIG,#46H
MOV ISP_TRIG,#0B9H
SETB EA
RET
;----------------------------------
;共四个字节
MAC:
DB "0000"
INCLUDE "DP.ASM"
INCLUDE "FINT.ASM"
INCLUDE "NET.ASM"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -