📄 bcda.bak
字号:
mend_data_bytes data 40h ; 要修改的字节数
ten_yuan_led data 41h
yuan_led data 42h
jiao_led data 43h
money_high data 44h
money_low data 45h
crc_data1 data 46h
crc_data2 data 47h
dec_unit1 data 48h
dec_unit2 data 49h
warning1 data 4ah
warning2 data 4bh
money_high_bak data 50h
money_data_bak data 51h
;---------------
sign data 20h
lack_of_money bit 00h
no_money bit 01h
org 0100h
start: mov 30h,#01h
mov 31h,#02h
mov 32h,#03h
mov 33h,#04h
mov 34h,#05h
mov 35h,#06h
mov 36h,#07h
mov 37h,#08h
mov 38h,#09h
mov 39h,#01h
mov 3ah,#01h
mov 3bh,#01h
mov 3ch,#01h
mov 3dh,#0ah
mov r0,#30h
mov r1,#32h
mov r7,#2
mov r6,#6
add_lop: acall bcda
inc r1
inc r1
djnz r6,add_lop
sjmp $
;-------------------------------------------------
; name: mend_data
; func: 进行扣费及LED码变换
; calls: bcdb(多字节BCD码减法)
; InPara: money_high, money_high_bak, mend_data_bytes
; OutPara: ten_yuan_led, yuan_led , jiao_led
; usage register: A, r0, r1, r2, r3, r7,psw
;-------------------------------------------------
mend_data: mov r0,#money_high
mov r1,#money_high_bak
mov r2,#2
mend_data_bak1: mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r2,mend_data_bak1
mov r0,#money_high_bak ;被减数的地址,
mov r1,#warning1 ;减数的地址
mov r7,mend_data_bytes
lcall bcdb ;判断金额是否小于报警金额
jnc mend_data_dec ;
setb lack_of_money ;小于则置缺钱标志位
mend_data_dec: mov r0,#money_high
mov r1,#money_high_bak
mov r2,#2
mend_data_bak2: mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r2,mend_data_bak2
mov r0,#money_high_bak ;被减数的地址,
mov r1,#dec_unit1 ;减数的地址
mov r7,mend_data_bytes
lcall bcdb ;开始扣费
jnc mend_data_save ;判断金额是否小于扣费单位
setb no_money ;小于则置无钱标志位
sjmp mend_data_div
mend_data_save: mov r0,#money_high ;把修改后的金额保存在待写进IC卡的单元
mov r1,#money_high_bak
mov r2,#2
mend_data_save1:mov a,@r1
mov @r0,a
inc r0
inc r1
djnz r2,mend_data_save1
; 把金额分离成三字节BCD 码,
mend_data_div: mov ten_yuan_led,money_high
mov a,money_low
anl a,#0f0h
swap a
mov yuan_led,a
mov a,money_low
anl a,#0fh
mov jiao_led,a
;再转换成LED码
mov r2,#3
mov dptr,#led_tab
mov r0,#ten_yuan_led
mend_data_led: mov a,@r0
movc a,@a+dptr
mov @r0,a
inc r0
djnz r2,mend_data_led
ret
mend_data_ret:
;--------------------------------------
; name: bcda
; func: 多字节bcd 码加法
; usage register: r0, r1, r2, r7 ,C
; r7: 相加的字节数, r0:被加数的地址, r1:加数的地址
; C: 进位
;-------------------------------------
bcda: mov a,r7
mov r2,a
add a,r0
mov r0,a
mov a,r2
add a,r1
mov r1,a
clr c
bcd1: dec r0
dec r1
mov a,@r0
addc a,@r1
da a
mov @r0,a
djnz r2,bcd1
ret
;--------------------------------------
; name: bcdb
; func: 多字节bcd 码减法
; usage register: A, r0, r1, r2, r3, r7,psw
; r7: 相减的字节数, r0:被减数的地址, r1:减数的地址
; c:借位
;-------------------------------------
bcdb: lcall neg1
lcall bcda
cpl c
mov f0,c
lcall neg1
mov c,f0
ret
neg1: mov a,r0
xch a,r1
xch a,r0
lcall neg
mov a,r0
xch a,r1
xch a,r0
ret
;--------------------------------------
; name: neg
; func: 多字节bcd 码取补
; usage register: r0, r2, r3, psw
; r7: 字节数, r0:操作数的地址,
;-------------------------------------
neg: mov a,r7
dec a
mov r2,a
mov a,r0
mov r3,a
neg0: clr c
mov a,#99h
subb a,@r0
mov @r0,a
inc r0
djnz r2,neg0
mov a,#9ah
subb a,@r0
mov @r0,a
mov a,r3
mov r0,a
ret
;---------------------------------------------------
led_TAB: DB 03H,0DBH,45H,51H,99H
DB 31H,21H,5BH,01H,11H
;---------------------------------------------------
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -