📄 p31b_d.asm
字号:
; 终端机修改条例:
;1.定额消费自动扣除功能实现的方法:在2503行 影去sjmp keyok1,
; 用djnz r7,keyok1,sjmp keyok7取代,闪动3次后自动消去
;2.增加了一张卡不能同时在两台终端机上消费功能,由管理器协助完成
; 若同时靠卡的时候将会出现 ERR 000 报警错误
;3.修改了在显示"-|"时候不能消费,只有在流"."时候才能消费
;4.否则将显示 Err 008错误
;5.去处了自动影去的功能
; (该功能以前并不存在,是后来加上出的,效果不好,故删除)
;6.增加了在同一台终端机上不能连续靠卡的的功能,方法是在第一次读到
; 卡以后不在调用读卡子程序
;7.在upzdj5.asm的基础上修正了管理卡的BUG,save_swit:
;8.在upzdj6.asm的基础上修正了第二条引起的BUG,就是在靠卡以后突然
; 掉电时候会引起该卡不能用。
;9.改正了在联机消费的时候老是出现SEND的问题。
;10:屏蔽了F2功能键 d_f_0
;11 修改了掉机号问题, 实际使用情况不好,删除
;12.在注册的时候,靠卡后响一下 has_id_card:
;13。在现金消费的时候,是正反面显示消费金额
;14.此版本是最终的通用版本
;15.添加了容错处理,避免在注册的时候出现SEND的情况。
;16.在打包数据的时候,增添了比较机号,不等就报警err 007 KEY_O3
;17.消费金额的最高位 和7f相与 , 避免消费出现负数 w_sl2:
;18.修改了非消费数据流的格式,标志送3
;
;19.在判断到脱机的时候,将184设置成接收数据状态。
;20.在切换184状态时候,给出一段时间延时
;21.修改了脱机消费地址重复的问题
;
;22.在利港电厂使用版本的基础上进行IDPOS的FLASH芯片及ds1307时钟改造。
; 要求:
; 可以根据信用额度消费,每人都有。有正负
;
;23.开机时显示ERR 004且联系报警,表示3V电池快没了,更换电池。
;24:在判断到终端机软关且没有 脱机消费数据的时候,格式化FLASH
;25;若在靠卡消费的过程中,出现连续的ERR 005报警,请将终端机复位。
;26:主程序每次循环都将BP关闭
;27:开机显示ERR 007且连续报警,表示IIC总线没有应答,复位终端机,
; 问题不能解决,更换DS1307。
;28:修改了在软关状态下还能定额消费的问题
;数据格式:
; 机号+功能号+地址(2)+标志+身份+卡码(5)+剩余额(3)
; +限额值(3)+剩余计次数+消费累计(3)+信用额度(2)+尾指针(2)+ CHKSUM
; 数据体:23个字节 单包字节数:26 双包字节数:52
; a:在flashpos2.asm的基础上修改了在 发送时间的时候精确到秒
; b:在flashpos2.asm的基础上,改正了0号机器不能取款的问题
; c:在非存款的状态下,出纳员地址单元送时分
; d:在flashpos2-1.asm的基础上修改,在开机的时候判断命令字
; e:2002.6.16号更新了0号机器不能取钱的问题
;
; 在flashpos31.asm的基础上增加了开机请求时间的功能
;2003.08.21 使用大容量管理器 池洲师专
;====================================
;= 售饭系统V6.0 FLASH版本 =
;= 上次更新时间 2003.08.21 =
;= ID卡 =
;= 只能一次一次读卡 =
;====================================
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 ;IC卡坐坏
err_3 equ 03h ;IC卡坏
err_4 equ 04h ;flash编程失败
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_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_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 2fh
;------------------------
reg2 equ 58h ;Temp Regist
reg3 equ 59h ;Temp Regist
reg4 equ 5ah ;Temp Regist
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
ka0ram equ 60h ;=rf1ram
ka1ram equ 64h ;=rf1ram+4
kb0ram equ 68h ;=rf1ram+8
kb1ram equ 6ch ;=rf1ram+12
;----------------------
icard_sc0 equ 51h ;Comp Sc_0
icard_sc1 equ 52h ;Comp Sc_1
icard_sc2 equ 53h ;Comp Sc_2
icard_sce equ 54h ;ScCompErrCounter
icard_com equ 55h ;IC Read/Write Command
icard_adr equ 56h ;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 ;机号
d_ym equ 0b2h ;消费年
d_dat equ 0b3h ;消费月
d_hor equ 0b4h ;消费时
d_min equ 0b5h ;消费分
dadr_h equ 0b6h ;卡地址高位
dadr_l equ 0b7h ;卡地址低位
d_exp0 equ 0b8h ;消费整数高位
d_exp1 equ 0b9h ;消费整数低位
d_exp2 equ 0bah ;消费小数部分
d_sur0 equ 0bbh ;卡中余额整数高位
d_sur1 equ 0bch ;卡中余额整数低位
d_sur2 equ 0bdh ;卡中余额小数部分
madr_h equ 0beh ;管理卡地址高位
madr_l equ 0bfh ;管理卡地址低位
;-----------------------
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
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
;******************************
; 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 20 ;2000h*16=128k 8192条信息
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 00h
push psw
push 03h
push 04h
push 05h
push 06h
;
setb enabl ;
;
jbc ri,r_rece ;receive or send
jbc ti,r_send
ajmp d_reti
;
r_send: mov a,ricon ; send
jnz r_sen1
push dph
push dpl
;
mov r0,#70
djnz r0,$
clr re184 ;
;
clr f_ri ; clear the receive flag
;
pop dpl
pop dph
ljmp d_reti
r_sen1:
mov r0,rir0 ; address of the receive
mov a,@r0
gogogo:
mov sbuf,a
inc rir0
dec ricon ; the counter of receive
ljmp d_reti
r_rece:
mov r0,sbuf
clr tr0
;
mov a,r_mod ; the mode of the receive
cjne a,#0,r_md10
mov a,r0 ; receive the name
cjne a,r_nme,r_md01;
r_md00:
clr sm2 ;
setb f_ri ;将中断标志位写1
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 ; receive fuction
mov r0,rir0
mov @r0,a ; save the fuction
;compair the fuction
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 06h
pop 05h
pop 04h
pop 03h
pop psw
pop 00h
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
clr f_mnu
clr f_rat
setb f_rde
setb f_rsc
clr f_rzh
clr f_off
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -