📄 iccard.dt
字号:
or a,@0x10 ;p5.4 internal pullhigh
iow p5cr ;将P5.4设置为输入
;mov a,@0x01 ;p5.4 is int0
;iow re ;将P5.4口设置为外部中断
bs re,0
;eni ;eable grobal interrupt
;mov a,@0b00000010 ;enable int0 开INT0中断
ior imr
or a,@0b00000010
iow imr
bc rf,1 ;清INT0寄存器
bs 0x05,0
mov a,@0x80
iow tcccr ;P5.4-INT0下降沿触发
ret
;================================================
;=========== count1 init sub ========================
count1_init:
bs port5 ,0 ;Reg page 1
ior ioc91
and a ,@0xf0
or a ,@0x06
iow ioc91 ;scale 1:64--0.5s中断 1:128 1s--断
bc port5 ,0 ;Reg page 0
mov a ,@255 ;count1_data
iow iocb0 ;count1 preset
bs rc ,0 ;count1 enable
bc rf ,3 ;clr count1 int flag
ior iocf0
or a ,@0x08
iow iocf0 ;count1 int enable
ret
;=========== count1 int server =================
count1_int:
mov stack1,a ;保护A
swap stack1
swapa r3 ;保护R3
mov stack2,a
swapa 0x04 ;保护R4
mov stack3,a
bc rf,3 ;clr count1 flag
;.
;.
;djz time
;bc port6,0
;mov time,a
;.
disi
;bank 1
;page 0
;jbc status_flag,ic_card_in
;jbs port5,4;如果PORT5.4为0则卡在里面
;jmp exit_card_sensor
;bank 1
;bc status_flag,ic_card_op_end
;bc status_flag,ic_card_in;IC卡退出为0
;page 0
;call Ic_Card_Exit
exit_card_sensor:
/* jbs flag,0
jmp setport1
jmp setport0
setport1 bs port6, 0 ;P6.0输出为1
bs flag, 0
inc lcd_data_num
jmp process
setport0 bc port6, 0
bc flag, 0*/
;==================================================
;计量
;==================================================
;call test_int_0_2
bank 1
page 0
sensort:
jbs sen,5
jmp sensortend
mov a,@0x0f
and a,sen
sub a,@0x01
page 0
jbc 0x03,0
jmp sensort1
bs sen,4
page 0
jmp sensortend
sensort1:
inc sen
sensortend:
;==================================================
;计量完
;==================================================
process:
swapa stack3
mov r4,a
swapa stack2
mov r3,a
swapa stack1
reti
;================================================
;=========== int1 sub ========================
int1:
mov stack1,a ;保护A
swap stack1
swapa r3 ;保护R3
mov stack2,a
swapa 0x04 ;保护R4
mov stack3,a
;bc rf,1 ;清中断标志
clr isr ;clr icif bit
disi
mov a, @0x16
mov delay_time1, a
delay21:
mov a, @0x53
mov delay_time2,a
delay22:
mov a, @0x62
mov flag, a
delay23:
page 0
djz flag
jmp delay23
djz delay_time2
jmp delay22
djz delay_time1
jmp delay21
;or a,0b00100000
;mov a,@0x
;jbs port5,4;如果PORT5.4为1则卡不在里面
;jmp int1_youka
bc port6,5 ;IC卡读写上电
;bank 0
;mov ic_read_flag,@0
page 0
jbc port5,4;如果PORT5.4为1则卡不在里面
jmp int1_youka
bank 1
bs status_flag,ic_card_in ;有卡时候为1
;call test_int_0_1
int1_youka:
/*
nop
mov a,port5
and a,@0x10
;mov flag,a
;CJE flag,@0,next1
jmp exit_int1
next1:
inc lcd_data_num_sec
CJG lcd_data_num_sec,@59,next
jmp exit_int1
next:
clr lcd_data_num_sec
exit_int1:*/
swapa stack3
mov r4,a
swapa stack2
mov r3,a
swapa stack1
reti
org 0x400
;eop
/**********************page 1***************************/
/**********************page 1***************************/
/**********************page 1***************************/
/**********************page 1***************************/
;============================================
;IC卡读数据块程序
;============================================
ic_read_data_block:
;读取卡代码A2,13,10,91
/* nop
nop
bank 0
mov rmm_address,@0 ;读取的地址
bank 2
mov card_temp,@0
mov ram_address,@0xa0 ;card_code address
begin_read_card_code:
bank 2
page 1
CJL card_temp,@4,read_card_code
jmp exit_read_card_code
read_card_code:
page 1
jbc port5,4;如果PORT5.4为0则卡在里面
jmp ic_read_data_block_end
bank 0
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov data_buffer,a
mov a,ram_address ;地址给A
mov r4,a ;间接寻址
mov a,r0 ;附值给A
mov r0,data_buffer
;bank 2
;mov card_code1,a
bank 0
inc rmm_address
bank 2
inc card_temp
inc ram_address
page 1
jbc port5,4;如果PORT5.4为0则卡在里面
jmp ic_read_data_block_end
jmp begin_read_card_code
exit_read_card_code:
bank 0
mov rmm_address,@1 ;读取的地址243
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory
bank 0
mov a,ic_buffer1
bank 2
mov card_code2,a*/
;读取系统代码gas_0001(67、61、73、75、30、30、30、31)
bank 0
mov rmm_address,@240 ;读取的地址
bank 2
mov card_temp,@0
mov ram_address,@0xa4 ;system_code address
begin_read_system_code:
bank 2
page 1
CJL card_temp,@8,read_system_code
jmp exit_read_system_code
read_system_code:
bank 0
page 1
jbc port5,4;如果PORT5.4为0则卡在里面
jmp ic_read_data_block_end
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov data_buffer,a
mov a,ram_address ;地址给A
mov r4,a ;间接寻址
mov a,r0 ;附值给A
mov r0,data_buffer
;bank 2
;mov card_code1,a
bank 0
inc rmm_address
bank 2
inc card_temp
inc ram_address
page 1
jbc port5,4;如果PORT5.4为0则卡在里面
jmp ic_read_data_block_end
jmp begin_read_system_code
exit_read_system_code:
nop
nop
;读取card_tpye,address=48
bank 0
mov rmm_address,@48 ;读取卡类型
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov card_type,a
bank 0
;读取user_id,address=49~52
mov rmm_address,@49 ;读取user_id1
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov user_id1,a
bank 0
mov rmm_address,@50 ;读取user_id2
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov user_id2,a
bank 0
mov rmm_address,@51 ;读取user_id3
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov user_id3,a
bank 0
mov rmm_address,@52 ;读取user_id4
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov user_id4,a
bank 0
bank 0
mov rmm_address,@0xf0
;读取charge_money,address=0x30,0x31
page 1
jbc port5,4;如果PORT5.4为0则卡在里面
jmp ic_read_data_block_end
mov rmm_address,@74 ;读取charge_money低位
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov charge_moneyl,a
bank 0
page 1
jbc port5,4;如果PORT5.4为0则卡在里面
jmp ic_read_data_block_end
mov rmm_address,@75 ;读取charge_money高位
mov rmm_len,@1 ;读取长度1
page 1
call ic_readmainmemory ;读地址的内容
bank 0
mov a,ic_buffer1
bank 2
mov charge_moneyh,a
ic_read_data_block_end:
ret
;============================
;发送数据子程序
;入口: DBUF_24 =要发送的数据(8_BIT)
;============================
ic_send_data:
bank 0
MOV A,@8 ;循环次数=8
MOV COUNT_24,A
TXLP:
RRC DBUF_24 ;左移(带C)
CALL ic_BITOUT ;输出1_BIT
page 1
DJZ COUNT_24 ;循环结束?
JMP TXLP
RET
;=================
;位输出子程序
;说明: 每当SCL=0时,改写SDA上的电平
;入口: C=要写到SDA上的位值
;=================
ic_BITOUT:
;SDA_OUT ;设置SDA为输出口
set_io_out
set_clk_out
page 1
JBS R3,0
JMP BITOUT_BIT0
BS port6,icio ;io=C=1
page 1
JMP BITOUT_io1
BITOUT_BIT0:
BC port6,icio ;io=C=0
BITOUT_io1:
nop
nop ;延时0.6US
bs port6,icclk ;clk=1
BITOUT_BIT2:
nop ;延时0.6US
nop
nop
nop
bc port6,icclk ;clk=0
RET
;=================
;位输入子程序
;说明: 当SCL=1时,从SDA上读电平
;出口: C=从SDA上读入的位值
;=================
ic_BITIN:
set_io_in ;设置i/o为输入口
set_clk_out
bc 0x05,0
bs port6,icclk ;clk=1
nop
nop ;延时0.6US
BC R3,0
JBC port6,icio
BS R3,0 ;C=io
nop
nop
BC port6,icclk ;clk=0
page 1
nop
nop ;延时0.6US
RET
;============================
;接收数据子程序
;入口: TT_24.REND_24 =读完毕标志
;出口: DBUF_24 =接受到的数据(8_BIT)
;============================
ic_receive_data:
bank 0
MOV A,@8 ;循环次数=8
MOV COUNT_24,A
CLR DBUF_24
RXLP:
page 1
CALL ic_BITIN ;输入1_BIT
bank 0
RRC DBUF_24 ;左移(带C)
page 1
DJZ COUNT_24 ;循环结束?
JMP RXLP
RET
;===========================
;复位操作
;============================
ic_reset:
set_clk_out
set_io_out
set_rst_out
bc port6,icclk ;clk=0
page 1
call delay10
bc port6,icrst ;rst=0
page 1
call delay10
bs port6,icio ;i/o=1
page 1
call delay10
bs port6,icrst ;rst=1
page 1
call delay10
bs port6,icclk ;clk=1
page 1
call delay10
bc port6,icclk ;clk=0
page 1
call delay10
bc port6,icrst ;rst=0
page 1
call delay10
page 1
call ic_receive_data
bank 0
mov a,dbuf_24
bank 2
mov card_code1,a
page 1
call ic_receive_data
bank 0
mov a,dbuf_24
bank 2
mov card_code2,a
page 1
call ic_receive_data
bank 0
mov a,dbuf_24
bank 2
mov card_code3,a
page 1
call ic_receive_data
bank 0
mov a,dbuf_24
bank 2
mov card_code4,a
ret
;============================延时子程序====================================
;功能:短延时 入口:NONE 出口:NONE
;影响资源:A,TEMP ,STATUS
;==========================================================================
DELAY:
bank 0
MOV A,@0X02
MOV TEMP,A
DJZ TEMP
JMP $-1
RET
;============================延时子程序10MS================================
;功能:延时 入口:NONE 出口:NONE
;影响资源:A,TEMP ,STATUS
;==========================================================================
DELAY10:
bank 0
MOV A,@0x10
MOV TEMP,A
MOV A,@0xff
MOV TEMP1,A
DJZ TEMP1
JMP $-1
DJZ TEMP
JMP $-5
RET
;=========发送命令=========
;send command
;==========================
ic_sendcommand:
;start condition
set_clk_out
set_io_out
bc port6,icclk
bs port6,icio
call delay
bs port6,icclk
call delay
bc port6,icio
call delay
bc port6,icclk
call delay
bank 0
mov dbuf_24,ic_command1
call ic_send_data
bank 0
mov dbuf_24,ic_command2
call ic_send_data
bank 0
mov dbuf_24,ic_command3
call ic_send_data
;stop condition
bc port6,icio
call delay
bs port6,icclk
call delay
bs port6,icio
call delay
ret
;process
/*ic_process:
bc port6,icclk
call delay
bc port6,icio
mov process_temp,@254
puls:
bs port6,icclk
call delay
bc port6,icclk
djz process_temp
jmp puls
ret*/
/*================读主存储器==================
入口:rmm_address 读取的地址
rmm_len 读取的长度
出口:ic_buffer1
;============================================*/
ic_readmainmemory:
bank 0
mov ic_command1,@0x30
mov ic_command2,rmm_address
mov ic_command3,@0
call ic_sendcommand
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -