📄 p31n-v1.1.2.asm
字号:
;**************************** 终端机修改条例 ************************************
;1:添加了YIDA标志,在收到正确应答后置1,消费数据发送后置0,靠卡前判断该标志如为0,则靠卡无效
;2:添加消费流水号
;3:添加靠卡后等待一分钟10秒后无按键自动取消
;4:增加靠卡自动关闭帐户
;***********************************************************************************
;====================================
;= ID卡售饭系统V8.0 FLASH版本 =
;= 上次更新时间 2004.08.21 =
;====================================
org 0000h
;----------------------------------
; 常量定义
;----------------------------------
null equ 35 ;全暗显示的码
sleep equ 2 ;
bpnum equ 10 ;
delay equ 15 ;
dslep equ 7 ;
dfcom equ 18 ;显示'-'
nfcom equ 0a3h ;显示'.'
;----------------------------------
kb_0 equ 0 ;以下是键值
kb_1 equ 1
kb_2 equ 2
kb_3 equ 3
kb_4 equ 4
kb_5 equ 5
kb_6 equ 6
kb_7 equ 7
kb_8 equ 8
kb_9 equ 9
kb_a equ 10
kb_b equ 11
kb_dot equ 12
kb_p equ 13
kb_m equ 14
kb_equ equ 15
kb_cl equ 16
kb_en equ 17
kb_f1 equ 18
kb_f2 equ 19
k_f10 equ 20 ;F1+A+0
k_f11 equ 21 ;F1+A+1
k_f12 equ 22 ;F1+A+2
k_f13 equ 23 ;F1+A+3
k_f14 equ 24 ;F1+A+4
k_f15 equ 25 ;F1+A+5
k_f16 equ 26 ;F1+A+6
k_f1d equ 27 ;F1+A+.
k_f1equ equ 28 ;F1+A+=
k_f1p equ 29 ;F1+Plus
k_f1m equ 30 ;F1+Minus
k_f2p equ 31 ;F2+Plus
k_f2m equ 32h ;F2+Minus
k_f1a equ 33 ;F1+A
;----------------
c_rmm equ 30h ;Read Main Memory Command
c_wmm equ 38h ;Write Main Memory Command
c_rpm equ 34h ;Read Protect Memory Command
c_wpm equ 3ch ;Write Protect Memory Command
c_rsm equ 31h ;Read Sc Memory Command
c_wsm equ 39h ;Write Sc Memory Command
c_cvd equ 33h ;Comp Verify Data Command
;----------------
normal equ 0
idle equ 1 ;0-idle 1-all
keyset equ 0 ;0-keyset0&&key_a 1-keyset1&&key_a 2-keyset2&&key a
;4-keyset0&&key_b 1-keyset1&&key_b 2-keyset2&&key b
secnr equ 0 ;Sector Number
rf_sor equ 80h
rf_rfs equ 40h
rf_nrf equ 02h
rf_ac equ 01h
rf_br equ 01h
rf_pre equ 40h
rf_cen equ 20h
rf_cre equ 10h
rf_ppp equ 06h
rf_al equ 80h
rf_rc equ 02h
c_ant equ 93h ;command of antioll
c_sel equ 93h ;command of select
c_hlt equ 50h ;command of halt
;----------------
f_dt0 equ 0a2h
f_dt1 equ 13h
f_dt2 equ 10h
f_dt3 equ 91h
;----------------
c_beg equ 0e0h ;Reading Card Main Memory Adress
c_r_n equ 32 ;Reading Card Main Memory Numbers
;----------------
err_0 equ 00h ;非法靠卡,该卡在管理器的帐号没关闭
err_1 equ 01h ;键盘坏
err_2 equ 02h ;
err_3 equ 03h ;
err_4 equ 04h ;
err_5 equ 05h ;
err_6 equ 06h ;
err_7 equ 07h ;Read Error
err_8 equ 08h ;
err_9 equ 09h ;溢出
err_10 equ 0ah ;未注册
err_11 equ 0bh ;坏卡
err_12 equ 0ch ;未插出纳员卡
err_13 equ 0dh ;通讯错误
err_14 equ 0eh ;卡号和帐号不同
err_15 equ 0fh ;None Normal Card
err_16 equ 10h
menufunc equ 31h ;食谱消费
ratfunc equ 11h ;定额消费
countfunc equ 21h ;计次消费
norsale equ 01h ;现金消费
norsave equ 02h ;存款
;-----------------------
; Bit Define
;-----------------------
m393 bit p1.0 ;393电源检测输入脚
sda bit p1.1 ;ds1307时钟线
scl bit p1.2 ;ds1307数据线
re184 bit p1.3 ;485通讯使能
;-----------------------
clock bit p1.4 ;Display Clock
store bit p1.5 ;Display Store
enabl bit p1.6 ;Display Enabl
ddata bit p1.7 ;Display Data
;-----------------------
f_rsc bit 00h ;请求系统信息标志
f_ini bit 01h ;初始化完毕标志
f_rde bit 02h ;请求定额标志
f_pow bit 03h ;软关标志
f_ri bit 04h ;接收中断标志
f_com bit 05h ;通讯标志
f_cny bit 06h ;管理卡标志
f_rzh bit 07h ;更新终端机中的个信息
f_rsl bit 08h ;发送脱机消费信息
f_sal bit 09h ;要求发送消费信息
f_zh bit 0ah ;要求得到帐号
f_beg bit 0bh ;开始发送脱机消费信息
f_mnu bit 0ch ;食谱消费标志
f_udt bit 0dh ;更新日期和时间
f_err0 bit 0eh
f_a_s bit 0fh ;1:Sale,0:Deposit
f_n bit 10h ;Entered Key Flag
f_dot bit 11h ;Enter . Key Flag
f_add bit 12h ;Enter + Key Flag
f_sub bit 13h ;Enter - Key Flag
f_equ bit 14h ;Enter = Key Flag
f_m_p bit 15h ;1:miune 0:plus
f_p_m bit 16h ;Copy as f_m_p
f_tj bit 17h ;OffLine
f_rat bit 18h ;定额标志
bit_c bit 19h ;Bit Flag
f_off bit 1ah ;Is Offline Flag
f_sta bit 1bh ;Test Comm Flag
f_cfk bit 1ch ;
f_typ bit 1eh ;Card Type: 1=IC; 0=RF
f_id bit 1fh
;
f_f bit 50h ;这是新添加的标志位
f_0 bit 51h ;此标志位是用来判断按下的是clear 还是enable.
f_sign bit 52h ;信用额度符号
r_en bit 53h
rf_chk bit 54h
b_chk bit 55h
lastread bit 56h ;if the last read,yes,setb lastread
err bit 57h
;========================
; 寄存器定义
;========================
; th2 equ 0cdh
; tl2 equ 0cch
; rcap2h equ 0cbh
; rcap2l equ 0cah
; t2con equ 0c8h
shn equ 08h ;Row Regeist
v_key equ 09h ;Key Vaule
v0_key equ 0ah ;Copy of v_key
kdt0 equ 0bh ;Keyboard Scan Code 0
kdt1 equ 0ch ;Keyboard Scan Code 1
kdt2 equ 0dh ;Keyboard Scan Code 2
;
bitcount equ 09h
;
r_mod equ 0eh ;RI Inputerrupt Step
ricon equ 0fh ;RI Receive Data Counter
rir0 equ 10h ;RI Receive Data Address
chksum equ 11h ;RI CheckSum
;
r_nme equ 12h ;Terminal Name Regist
state equ 13h ;Terminal Work State
max_h equ 14h ;
max_l equ 15h
beg_h equ 16h
beg_l equ 17h
end_h equ 18h
end_l equ 19h
rat_0 equ 1ah ;Ration
rat_1 equ 1bh
rat_2 equ 1ch
adr_h equ 1dh ;Address
adr_l equ 1eh
count equ 1fh
;
r1_374 equ 24h ;r_en rf_chk b_chk re184 bp pow a16 a15
CE BIT 26H
a17 BIT 25h
bp bit 23h
pow bit 22h ;AC Power On
;
func equ 25h ;0=Fc.17,1=Fc.18,2=Fc.19,3=Fc.20,4=Fc.43
scancount equ 25h ;=func
regt equ 26h ;Temp Regeist
reg1 equ 27h ;Temp Regeist
reg0 equ 28h ;Temp Regeist
rcr0 equ 28h ;=reg0:Copy of R0
rftyp equ 29h
;
s_succ equ 2bh ;0-None Sale;1-Sale Sending;2-Sale Send Complete
;
repeat equ 2ch ;Re-Send Sale/Save Count
lim_cnt equ 2dh ;Limit Count
reclen equ 2dh ;=lim_cnt: Record Length
;
sata equ 2eh
r_err equ 2fh
;
r_sp equ 30h
;------------------------
reg2 equ 58h ;Temp Regist
reg3 equ 59h ;Temp Regist
;reg4 equ 5ah ;Temp Regist
stwt equ 5bh
yida equ 5ch
rf0ram equ 50h
rf1ram equ 60h
rf2ram equ 70h
d_addramh equ 60h
d_addraml equ 61h
xorram equ 56h
divh equ 5eh
divl equ 5fh
divram equ 65h
rf3ram equ 68h ;=rf1ram+8
;----------------------
icard_sc0 equ 51h ;Comp Sc_0
icard_sc1 equ 52h ;Comp Sc_1
icard_sc2 equ 0f6h ;Comp Sc_2
icard_sce equ 0f7h ;ScCompErrCounter
icard_com equ 0f8h ;IC Read/Write Command
icard_adr equ 0f9h ;IC Read/Write Address
icard_dta equ 57h ;
bytecount equ 58h ;从ds1307读写的字节数
sw0 equ 0fah
;----------------------
;----------------------
exp_rm0 equ 78h ;Expense
exp_rm1 equ 79h
exp_rm2 equ 7ah
exp_rm3 equ 7bh
exp_rm4 equ 7ch
exp_rm5 equ 7dh
sur_rm0 equ 7eh ;Surplus
sur_rm1 equ 7fh
sur_rm2 equ 80h
sur_rm3 equ 81h
sur_rm4 equ 82h
sur_rm5 equ 83h
augend0 equ 84h ;Augend
augend1 equ 85h
augend2 equ 86h
augend3 equ 87h
augend4 equ 88h
augend5 equ 89h
lim_rm0 equ 8ah ;Limit Expense
lim_rm1 equ 8bh
lim_rm2 equ 8ch
lim_rm3 equ 8dh
lim_rm4 equ 8eh
lim_rm5 equ 8fh
;
ddsp0 equ 90h ;Display
ddsp01 equ 91h
ddsp02 equ 92h
ddsp03 equ 93h
ddsp04 equ 94h
ddsp05 equ 95h
ddsp06 equ 96h
ddsp07 equ 97h
ddsp1 equ 98h
ddsp11 equ 99h
ddsp12 equ 9ah
ddsp13 equ 9bh
ddsp14 equ 9ch
ddsp15 equ 9dh
ddsp16 equ 9eh
ddsp17 equ 9fh
;消费数据流的格式
dflag equ 0b0h ;标志
d_nme equ 0b1h ;机号
;yida equ 0b2h ;消费年
;d_dat equ 0b3h ;消费月
;d_hor equ 0b4h ;消费时
;d_min equ 0b5h ;消费分
dadr_h equ 0b2h ;卡地址高位
dadr_l equ 0b3h ;卡地址低位
idcode2 equ 0b4h ;
idcode3 equ 0b5h
idcode4 equ 0b6h
d_exp0 equ 0b7h ;消费整数高位
d_exp1 equ 0b8h ;消费整数低位
d_exp2 equ 0b9h ;消费小数部分
d_sur0 equ 0bah ;卡中余额整数高位
d_sur1 equ 0bbh ;卡中余额整数低位
d_sur2 equ 0bch ;卡中余额小数部分
s_code3 equ 0bdh
s_code4 equ 0beh
xflsh equ 0bfh
;madr_h equ 0bdh ;管理卡地址高位
;madr_l equ 0beh ;管理卡地址低位
;-----------------------
r_buf equ 0a0h ;0a0h-0bfh:32 Temp Buffer
;
ribuf equ 0c0h ;0c0h-0ffh:64 Receive && Send Buffer
;*********************************
; 地址定义
;*********************************
d1_374 equ 0a000h ;
d_245 equ 0e000h ;
d_sal equ 0000h ;存放脱机消费数据的首地址
ds_name equ 08h
ds_state equ 09h
ds_maxh equ 0ah
ds_maxl equ 0bh
ds_begh equ 0ch
ds_begl equ 0dh
ds_endh equ 0eh
ds_endl equ 0fh
ds_rat0 equ 10h
ds_rat1 equ 11h
ds_rat2 equ 12h
d_l_e equ 13h
sum51 equ 14h
sum61 equ 15h
;sum71 equ 16h
d_stwt equ 15h
sum0 equ 17h
sum1 equ 18h
sum2 equ 19h
sum3 equ 1ah
sum4 equ 1bh
sum5 equ 1ch
sum6 equ 1dh
sum7 equ 1eh
d_menu1 equ 1fh ;1fh~36h totle 24byte
command1 equ 37h ;命令字存储单元
command2 equ 38h
commnad3 equ 39h
ds_beghc equ 3ah ;首位指针COPY地址
ds_beglc equ 3bh
ds_endhc equ 3ch
ds_endlc equ 3dh
bz1 equ 3eh
d_xflsh equ 3fh ;消费流水号
;******************************
; Const Define
;******************************
dti_h data 0f8h ;2.15ms
dti_l data 0
dt1_h data 10h ;66.66ms
dt1_l data 0
s_recl data 16 ;Sale Record Length
mx_sh data 10 ;1000h*16=128k 4096条信息
mx_sl data 00 ;Maxium Number Of Offline Sale Record
ds1307w data 0d0h
ds1307r data 0d1h
cmd1 data 55h
cmd2 data 0aah
cmd3 data 55h ;3个命令字
;****************************
ljmp main
;----------------
org 0003h ;int0
ljmp main
;----------------
org 000bh ;T0
clr tr0
setb sm2
clr f_ri
sjmp m_t0
;----------------
org 0013h ;INT 1
ljmp main
m_t0: mov r_mod,#0
reti
;-----------------
org 001bh ;T1
ljmp m_t1
;
;----------------------
; 串口中断处理子程序
;---------------------
org 0023h
push acc
push b
push 00h
push 01h
push 02h
push psw
push 03h
push 04h
push 05h
push 06h
push 07h
push dpl
push dph
setb enabl
jbc ri,r_rece
jbc ti,r_send
ajmp d_reti
r_send:
mov a,ricon
jnz r_sen1
push dph
push dpl
mov r0,#70
djnz r0,$
clr re184
clr f_ri
pop dpl
pop dph
ljmp d_reti
r_sen1:
mov r0,rir0
mov a,@r0
mov sbuf,a
inc rir0
dec ricon
ljmp d_reti
r_rece:
mov r0,sbuf
clr tr0
mov a,r_mod
cjne a,#0,r_md10
jbc rb8,nex332
ljmp d_reti
nex332:
mov a,r0
cjne a,r_nme,r_md01
r_md00:
clr sm2
setb f_ri
mov a,r0
mov r0,#ribuf ;收/发缓冲器
mov @r0,a ;place the receive date
inc r0 ;
mov rir0,r0
inc r_mod
sjmp r_md21
r_md01:
cjne a,#0ffh,r_md02
sjmp r_md00
r_md02:
ajmp d_reti
r_md10:
cjne a,#1,r_md20
mov a,r0
mov r0,rir0
mov @r0,a
cjne a,#17,r_md11 ;Write New Card
mov a,#54
sjmp r_md19
r_md11:
cjne a,#18,r_md12 ;ReWrite Card
mov a,#54
sjmp r_md19
r_md12:
cjne a,#70,r_md13 ;Get ZH
mov a,#52 ;old is 38
sjmp r_md19
r_md13:
cjne a,#74,r_md16 ;Update Time
mov a,#38
sjmp r_md19
r_md16:
cjne a,#66,r_md17 ;Get Security
mov a,#54
sjmp r_md19
r_md17:
cjne a,#76,r_md18
mov a,#54
sjmp r_md19
r_md18:
mov a,#14
r_md19:
mov ricon,a
rr a
mov chksum,a
dec ricon
dec ricon
inc rir0
inc r_mod
sjmp r_md21
;
r_md20:
mov a,r0
mov r0,rir0
mov @r0,a
inc rir0
djnz ricon,r_md21
mov r_mod,#0
setb sm2
ljmp rideal
r_md21:
mov th0,#dti_h
mov tl0,#dti_l
setb tr0
;
d_reti:
mov c,r_en
mov enabl,c
;
pop dph
pop dpl
pop 07h
pop 06h
pop 05h
pop 04h
pop 03h
pop psw
pop 02h
pop 01h
pop 00h
pop b
pop acc
reti
;*********************************************
;*********************************************
main:
clr re184
mov r2,#30
djnz r2,$ ;将485通讯芯片设置成接收数据状态
mov sp,#r_sp ;重新设定堆栈的深度
mov dptr,#d1_374 ;374的地址
mov a,#01001000b ;-- CE A17 -- bp pow a16 a15
mov r1_374,a ;
movx @dptr,a ;
lcall check_battery
;-----------------------
; Set Sreial Paramete
;-----------------------
mov th2,#0ffh ;115200 57600 38400 28800 19200 9600
mov tl2,#0fah ;ff:fd ff:fa ff:f7 ff:f4 ff:ee ff:dc
mov rcap2h,#0ffh
mov rcap2l,#0fah
mov t2con,#00110100b ;tf2 exf2 rclk tclk exen2 tr2 c/t2 cp/rl2
;------
mov r_mod,#0
mov state,#0
;--------------------
; Initilize Flag
;--------------------
clr f_ri
clr f_zh
clr f_id
clr f_sal
clr f_rsl
clr f_cny
clr f_a_s
clr f_beg
clr f_com
setb f_pow
mov yida,#01h ;g应答标致
clr f_mnu
clr f_rat
setb f_rde
setb f_rsc
clr f_rzh
clr f_off
clr f_cfk
clr f_udt
clr f_sta
mov count,#0
setb rf_chk
setb f_f
clr f_0
mov func,#0ffh
mov s_succ,#0
setb r_en
setb rf_chk
;--------------------------
; 测试DS1307用户RAM好坏
;--------------------------
lcall v0_ram ;检查写1307 RAM是否正常
jb f0,ram_s ;f0=1,RAM检测成功
lcall get_code ;调用查找错误码对应的字型
ram_e:
lcall clrbp
;
mov r4,#30
lcall d0lay
lcall setbp
lcall d0lay
lcall check_battery
sjmp ram_e ;1307 写RAM出错,循环报警
ram_s:
lcall inial ;初始化时钟芯片,检验RAM区数据的正确性
;
lcall get_pos_name
;********************************
;功能: 测试键盘
; 键盘损坏,循环报警ERR 001
;*******************************
mov regt,#60
test_k:
lcall key_in
mov a,v_key
cjne a,#0ffh,kb_err ;Keyboard Err
lcall check_battery
djnz regt,test_k
;********************************************
;功能:检测3V电池,电量不足,3次报警ERR 004
;********************************************
jb m393,ceok
mov r_err,#04 ;ERR 004
mov r7,#3 ;times
lcall error_code
err_loop:
lcall clrbp
mov r4,#30
lcall d0lay
lcall setbp
mov r4,#60
lcall d0lay
djnz r7,err_loop
;***********
ceok:
lcall clrbp ;自检通过,长叫一声
mov r4,#30h
lcall d0lay
lcall setbp
;----------------------
;****************************************
;判断RAM中有无数据,没有数据就格式化FLASH
;****************************************
mov a,beg_h
mov b,end_h
cjne a,b,edit
mov a,beg_l
mov b,end_l
cjne a,b,edit
clr a
mov beg_h,a
mov beg_l,a
mov end_h,a
mov end_l,a ;首尾指针清零
lcall w_end
lcall chip_erase
edit:
sjmp edit_pos_name
;-------------------
; 键盘坏
;--------------------
kb_err:
mov r_err,#err_1
err_dp:
lcall error_code
lcall clrbp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -