📄 iccard.dt
字号:
bank 0
MOV A,@1
XOR A,NUM_24
BS TT_24,REND_24
JBS R3,Z ;NUM_24=1跳;判断是否最后一个字节,决定应答信号
BC TT_24,REND_24
CALL iic_RX ;读数据并发送应答信号
bank 0
MOV 0x18,IIC_DBUF_24
bank 3
mov R4,iic_ram_address
MOV R0,0x18 ;保存数据到R0
bank 3
INC iic_ram_address
bank 0
DJZ NUM_24
JMP RDPAGE1 ;未读完继续
CALL iic_BSTOP ;送停止位
RET
;****************************
;I2C总线读/写的程序全部结束 !
;****************************
org 0x800
;eop
;==========================================
;IC卡识别,比较卡代码和系统代码
;==========================================
/*ic_identify:
bank 2
page 2
CJNE card_code1,@0xa2,err_00
CJNE card_code2,@0x13,err_00
CJNE card_code3,@0x10,err_00
CJNE card_code4,@0x91,err_00
jmp compare_system_code
;比较卡代码,错误则输出ERR-00
err_00:
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0xfa
page 2
call display_error
page 2
jmp ic_identify_exit
compare_system_code:
bank 2
page 2
CJNE system_code1,@0x67,err_01
CJNE system_code2,@0x61,err_01
CJNE system_code3,@0x73,err_01
CJNE system_code4,@0x5f,err_01
CJNE system_code5,@0x30,err_01
CJNE system_code6,@0x30,err_01
CJNE system_code7,@0x30,err_01
CJNE system_code8,@0x31,err_01
jmp ic_identify_exit
err_01:
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0xc0
page 2
call display_error
page 2
jmp ic_identify_exit
;return_card_type:
ic_identify_exit:
ret*/
;============================================
;****************************
;计量模块
;****************************
measure:
bank 1
jbs status_flag,magnetic_attack;强磁标志
jmp measure10
page 0
call bytesub
page 2
bs status_flag,close;关阀标志
lcd_flag_read 0,lcd_data_head,@20
mov a,@0x08
or lcd_data_head,a
lcd_flag_display 0,lcd_data_head,@20
bank 2
mov a,@0x5a ;写强磁记录
mov sensor_status,a
bank 0
mov data_24,a
mov addr_24,@0x1d
mov slave_24,@0xa0
page 1
call iic_WRBYTE
page 2
bank 1
bc status_flag,magnetic_attack;强磁标志
jmp measur20
measure10:
bank 1
jbs sen,6
jmp measureend
page 0
call bytesub
page 2
bank 1
bc sen,6
bank 2
CJG gas_moneyh,@0,measur20
cjg gas_moneyl,@100,measur20
cjl gas_moneyl,@100,measur11
bank 1
bs status_flag,close;关阀标志
measur11:
lcd_flag_read 0,lcd_data_head,@19
mov a,@0x08
or lcd_data_head,a
lcd_flag_display 0,lcd_data_head,@19
bank 2
cjnz gas_moneyl,measur20
bank 1
bs status_flag,close;关阀标志
measur20:
bank 1
mov a,@0x00
mov hex1,a
mov hex2,a
bank 2
mov a,gas_moneyh
bank 1
mov hex3,a
bank 2
mov a,gas_moneyl
bank 1
mov hex4,a
page 0
call HEXTOBCD
page 0
call display_data;显示数据
measureend:
ret
;****************************
;计量模块完
;****************************
;==========================================
;显示错误代码
;==========================================
display_error:
bank 0
mov lcd_data_head,@0x00
lcd_display 0,lcd_data_head,@15
lcd_display 0,lcd_data_head,@17
lcd_flag_read 0,lcd_data_head,@20
mov a,@0x08
and lcd_data_head,a
lcd_flag_display 0,lcd_data_head,@20 ;显示 "M3"
mov lcd_data_head,@0x3e
lcd_display 0,lcd_data_head,@0
mov lcd_data_head,@0x0e
lcd_display 0,lcd_data_head,@2
mov lcd_data_head,@0x0e
lcd_display 0,lcd_data_head,@5
mov lcd_data_head,@0x04
lcd_display 0,lcd_data_head,@7
bank 0
mov lcd_data_head,err_temp1
lcd_display 0,lcd_data_head,@11
mov lcd_data_head,err_temp2
lcd_display 0,lcd_data_head,@13
bank 1
mov display_err_flag,@0
ret
;=========================================
;============================================
;从EEPROM中读取user_id
;============================================
eprom_read_id:
bank 0
mov SLAVE_24,@0xa0
mov NUM_24,@0x04
mov ADDR_24,@0x10
bank 3
mov iic_ram_address,@0xe0
page 1
bank 0
call iic_RDPAGE
call delay
/* mov a,@2
bank 3
mov eprom_buffer1,a
mov eprom_buffer2,a
mov eprom_buffer3,a
mov eprom_buffer4,a
page 1
call DELAY10
bank 0
mov addr_24,@0x10 ;数据地址
mov slave_24,@0xa0 ;从器件地址(1010XXX0)
page 1
call iic_RDBYTE
bank 0
mov a,data_24
bank 3
mov eprom_buffer1,a
page 1
call DELAY10
bank 0
mov addr_24,@0x11 ;数据地址
mov slave_24,@0xa0 ;从器件地址(1010XXX0)
page 1
call iic_RDBYTE
bank 0
mov a,data_24
bank 3
mov eprom_buffer2,a
page 1
call DELAY10
bank 0
mov addr_24,@0x12 ;数据地址
mov slave_24,@0xa0 ;从器件地址(1010XXX0)
page 1
call iic_RDBYTE
bank 0
mov a,data_24
bank 3
mov eprom_buffer3,a
page 1
call DELAY10
bank 0
mov addr_24,@0x13 ;数据地址
mov slave_24,@0xa0 ;从器件地址(1010XXX0)
page 1
call iic_RDBYTE
bank 0
mov a,data_24
bank 3
mov eprom_buffer4,a
nop
bank 0
mov addr_24,@0x10 ;数据地址
mov slave_24,@0xa0 ;从器件地址(1010XXX0)
page 1
call iic_RDBYTE
bank 0
mov a,data_24
bank 3
mov eprom_buffer1,a*/
nop
ret
;==========================================
;IC卡操作模块
;==========================================
ic_work:
;bank 0
;MOV ic_read_flag,ic_read_flag
;JBC 0X03,2
bank 1
page 2
jbs status_flag,ic_card_in ;有卡时候为1
jmp exit_ic_end
page 2
jbc status_flag,ic_card_op_end;操作完成为1
jmp exit_ic_card_op
page 2
jbc port5,4;如果PORT5.4为0则卡在里面
jmp exit_ic_card_op
page 2
jmp ic_read
;jmp no_write
nop
;bc port6,5
;call delay10
;call delay10
;mov a,@0x04
;mov sbpcr,a
;slep ;in sleep mode
;inc lcd_data_num_sec
;jmp loop
/**********************************************/
;===============================================
/**********************************************/
ic_read:
;call test_int_0_2
mov a,@0
bank 2
mov card_code1,a
mov card_code2,a
mov card_code3,a
mov card_code4,a
mov system_code1,a
mov system_code2,a
mov system_code3,a
mov system_code4,a
mov system_code5,a
mov system_code6,a
mov system_code7,a
mov system_code8,a
bc port6,5 ;IC卡读写上电
page 2
jbc port5,4;如果PORT5.4为0则卡在里面
jmp no_write
page 1
call ic_reset
page 2
jbc port5,4;如果PORT5.4为0则卡在里面
jmp no_write
page 1
call delay
page 2
jbc port5,4;如果PORT5.4为0则卡在里面
jmp no_write
page 1
call ic_read_data_block
page 2
jbc port5,4;如果PORT5.4为0则卡在里面
jmp no_write
page 2
;jmp compare_password;进入充值
;call ic_identify
;===============ic_identify====================================
bank 2
page 2
CJNE card_code1,@0xa2,err_00
CJNE card_code2,@0x13,err_00
CJNE card_code3,@0x10,err_00
CJNE card_code4,@0x91,err_00
jmp compare_system_code
;比较卡代码,错误则输出ERR-00
err_00:
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0xfa
page 2
call display_error
bank 1
bs status_flag,ic_card_op_end
jmp exit_ic_card_op
page 2
jmp ic_identify_exit
compare_system_code:
bank 2
page 2
CJNE system_code1,@0x67,err_01
CJNE system_code2,@0x61,err_01
CJNE system_code3,@0x73,err_01
CJNE system_code4,@0x5f,err_01
CJNE system_code5,@0x30,err_01
CJNE system_code6,@0x30,err_01
CJNE system_code7,@0x30,err_01
CJNE system_code8,@0x31,err_01
jmp ic_identify_exit
err_01:
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0xc0
page 2
call display_error
bank 1
bs status_flag,ic_card_op_end
jmp exit_ic_card_op
page 2
jmp ic_identify_exit
ic_identify_exit:
;=============================================================
page 2
;IC卡识别,比较卡代码和系统代码 返回卡类型
bank 2
CJE card_type,@0xa1,user_ic_init
jmp user_ic_mot
user_ic_init:
page 2
call init_card
bank 1
bs status_flag,ic_card_op_end
page 2
jmp exit_ic_card_op
user_ic_mot:
bank 2
CJE card_type,@0xa0,user_ic_mot1
jmp user_ic_identify
user_ic_mot1:
page 3
call gas_mot_card
bank 1
bs status_flag,ic_card_op_end
page 2
jmp exit_ic_card_op
user_ic_identify:
bank 2
CJE card_type,@0x59,user_new
bank 2
CJE card_type,@0x58,user_old_operator
;CJE card_type,@0xa1,init
;jmp ic_card_exit
/* bank 0
mov rmm_address,@75 ;读取的地址243
mov rmm_len,@1 ;读取长度1
call ic_readmainmemory
mov a,ic_buffer1
bank 1
mov HEX3,a
bank 0*/
;============用户卡操作========================
user_new:
page 2
mov a,@0
bank 3
mov eprom_buffer1,a
mov eprom_buffer2,a
mov eprom_buffer3,a
mov eprom_buffer4,a
call eprom_read_id
page 2
bank 3
CJNZ eprom_buffer1,err_04;eprom_buffer1 =读到的数据
CJNZ eprom_buffer3,err_04;eprom_buffer3 =读到的数据
jmp user_new_operator
err_04:
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0xc6
page 2
call display_error
bank 1
bs status_flag,ic_card_op_end
jmp exit_ic_card_op
user_new_operator: ;新用户卡的操作
;将卡上面的ID赋给EEPROM中
page 2
call eprom_write_id
user_old_operator: ;老用户卡的操作
;否则为老用户,进行老用户处理
;比较用户ID是否一致
page 2
call eprom_read_id
bank 3
MOV A,eprom_buffer1
bank 2
page 2
SUB A,user_id1 ;比较用户ID的第一位
JBS 0X03,2
JMP err_02
bank 3
MOV A,eprom_buffer2
bank 2
page 2
SUB A,user_id2 ;比较用户ID的第二位
JBS 0X03,2
JMP err_02
bank 3
MOV A,eprom_buffer3
bank 2
page 2
SUB A,user_id3 ;比较用户ID的第三位
JBS 0X03,2
JMP err_02
bank 3
MOV A,eprom_buffer4
bank 2
page 2
SUB A,user_id4 ;比较用户ID的第四位
JBS 0X03,2
JMP err_02
jmp compare_password ;USER_ID相等,比较密码
err_02:
;jmp case_end;显示错误,退出
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0x7c
page 2
call display_error
bank 1
bs status_flag,ic_card_op_end
jmp exit_ic_card_op
compare_password:
nop
nop
page 1
;call ic_compareverifdata
page 2
bank 0
CJE ic_compare_password_flag,@1,password_success
;jmp password_fail
/*err_03: ;密码不正确
bank 0
mov err_temp1,@0xfa
mov err_temp2,@0xf4
page 2
call display_error
bank 1
bs status_flag,ic_card_op_end
jmp exit_ic_card_op
nop*/
nop
password_success:
;密码比较成功后就要返写IC卡数据、充值
;=============================================
;加法子程序
;入口: (加数)JS1,JS2,JS3,JS4,(被加数)BJ1,BJ2,BJ3,BJ4
;出口:(结果)JS1,JS2,JS3,JS4
;============================================
case_end:
nop
nop
page 2
call ic_charge
call save_gas_money
/*data_efficacy_err:
;bc 0x03,5 ;select page 0
bank 0
CJE ic_compare_password_flag,@1,ic_write
jmp no_write
ic_write:
;call ic_writemainmemory ;写243地址的内容 0X56
nop*/
no_write:
;call ic_readmainmemory
;bank 0
;mov ic_read_flag,@0xff
bs port6,5 ;IC卡读写掉电
nop
nop
bank 1
bs status_flag,ic_card_op_end
;IC卡读写操作完毕
;CASE结束、检测IC卡是否在里面
exit_ic_card_op:
page 2
jbs port5,4;如果PORT5.4为0则卡在里面
jmp exit_ic_end
bank 1
bc status_flag,ic_card_op_end
bc status_flag,ic_card_in;IC卡退出为0
page 0
call Ic_Card_Exit
;page 2
exit_ic_end:
nop
nop
nop
ret
;==================================================
;ic卡充值
;==================================================
ic_charge:
bank 2
page 2
CJE charge_moneyl,@0xff,data_efficacy
jmp data_efficacy_end
data_efficacy:
bank 2
CJE charge_moneyh,@0xff,no_write
data_efficacy_end:
bank 1
mov js1,@0
mov js2,@0
bank 2
mov a,gas_moneyh
bank 1
mov js3,a
bank 2
mov a,gas_moneyl
bank 1
mov js4,a ;加数
bank 1
mov bj1,@0
mov bj2,@0
bank 2
mov a,charge_moneyh
bank 1
mo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -