📄 iccard.dt
字号:
bc port6,icclk
call delay
bank 0
mov len,@0 ;0x10为私有要保护
mov rmm_temp,@255
mov a,rmm_address
sub rmm_temp,a
inc rmm_temp ;rmm_temp=256-address
goto_readdata:
CJL len,rmm_temp,readdata
;COMPARE AND JUMP IF REG1<REG2
jmp exit_readdata
readdata:
CJL len,rmm_len,save_data
call ic_receive_data
jmp drop_data
save_data:
call ic_receive_data
bank 0
mov a,dbuf_24
mov ic_buffer1,a
drop_data:
bank 0
inc len
jmp goto_readdata
exit_readdata:
bs port6,icclk
call delay
bc port6,icclk
call delay
ret
/*================写主存储器==================
入口:wmm_address 写主存的地址
wmm_value 写主存的数据
出口:
;============================================*/
ic_writemainmemory:
set_io_out
set_clk_out
bank 0
mov ic_command1,@0x38
mov ic_command2,wmm_address
mov ic_command3,wmm_data
call ic_sendcommand
bc port6,icclk
call delay
bc port6,icio
call delay
bank 0
mov len,@0 ;0x10为私有要保护
goto_writedata:
CJL len,@254,writedata
jmp exit_writedata
writedata:
bs port6,icclk
call delay
bc port6,icclk
call delay
bank 0
inc len
jmp goto_writedata
exit_writedata:
bs port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
ret
/*================读安全储区=================
入口:
出口:rsm_data1、rsm_data2、rsm_data3、rsm_data4读取的数据
;============================================*/
ic_readsecmemory:
set_io_out
set_clk_out
bank 0
mov ic_command1,@0x31
;mov a,@0xff
mov ic_command2,@0xff
mov ic_command3,@0xff
call ic_sendcommand
bc port6,icclk
call delay
call ic_receive_data
bank 0
mov rsm_data1,dbuf_24
call ic_receive_data
bank 0
mov rsm_data2,dbuf_24
call ic_receive_data
bank 0
mov rsm_data3,dbuf_24
call ic_receive_data
bank 0
mov rsm_data4,dbuf_24
set_io_out
set_clk_out
bs port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
ret
/*================比较密码 =================
入口:
出口:
;============================================*/
ic_compareverifdata:
set_io_out
set_clk_out
call ic_readsecmemory
nop
nop
;mov a,rsm_data1
;and a,@0x07
;mov rsm_data1,a
bank 0
mov rsm_data1,rsm_data1
jbc 0x03,2
jmp fail_exit
nop
CJE rsm_data1,@0x07,setbit1
CJE rsm_data1,@0x06,setbit2
CJE rsm_data1,@0x04,setbit3
jmp fail_exit
setbit1:
bank 0
mov wsm_data,@0x06
nop
jmp endcomp
setbit2:
bank 0
mov wsm_data,@0x04
nop
jmp endcomp
setbit3:
bank 0
mov wsm_data,@0x00
nop
endcomp:
bank 0
mov wsm_address,@0
call ic_writesecmemory
;mov len,@0
;CJL len,@3,writedata
;mov password_data,@0xff
bank 0
mov ic_command1,@0x33
mov ic_command2,@1
mov ic_command3,@0xa9
call ic_sendcommand
set_io_out
set_clk_out
bc port6,icclk
call delay
bc port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bs port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bank 0
mov ic_command1,@0x33
mov ic_command2,@2
mov ic_command3,@0x13
call ic_sendcommand
bc port6,icclk
call delay
bc port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bs port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bank 0
mov ic_command1,@0x33
mov ic_command2,@3
mov ic_command3,@0xed
call ic_sendcommand
bc port6,icclk
call delay
bc port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
bs port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
nop
fail_exit:
bank 0
mov wsm_address,@0
mov wsm_data,@0xff
call ic_writesecmemory
call delay
call ic_readsecmemory
CJE rsm_data1,@0x07,success
mov ic_compare_password_flag,@0
jmp failed
success:
mov ic_compare_password_flag,@1
failed:
nop
nop
ret
/*================读保护储器=================
出口:rpm_data 读取的数据
;============================================*/
ic_readprotectmemory:
set_io_out
set_clk_out
bank 0
mov ic_command1,@0x34
mov a,@0
mov ic_command2,a
mov ic_command3,a
call ic_sendcommand
bc p6cr,icclk
call delay
call ic_receive_data
bank 0
mov rpm_data1,dbuf_24
call ic_receive_data
bank 0
mov rpm_data2,dbuf_24
call ic_receive_data
bank 0
mov rpm_data3,dbuf_24
call ic_receive_data
bank 0
mov rpm_data4,dbuf_24
set_io_out
set_clk_out
bs p6cr,icclk ;stop condition
call delay
bc p6cr,icclk
call delay
ret
/*================写保护储器=================
入口:wpm_address 写的地址
出口:wpm_data 写的数据
;============================================*/
ic_writeprotectmemory:
set_io_out
set_clk_out
bank 0
mov ic_command1,@0x3c
mov ic_command2,wpm_address
mov ic_command3,wpm_data
call ic_sendcommand
bc p6cr,icclk
call delay
bc p6cr,icio
call delay
bank 0
mov len,@0
goto_writeprotectdata:
CJL len,@254,writeprotectdata
jmp exit_writeprotectdata
writeprotectdata:
bs p6cr,icclk
call delay
bc p6cr,icclk
call delay
bank 0
inc len
jmp goto_writeprotectdata
exit_writeprotectdata:
bs p6cr,icio
call delay
bs p6cr,icclk ;stop condition
call delay
bc p6cr,icclk
call delay
ret
/*================写安全储区=================
入口:wsm_address 写的地址
出口:wsm_data 写的数据
;============================================*/
ic_writesecmemory:
set_io_out
set_clk_out
bank 0
mov ic_command1,@0x39
mov ic_command2,wsm_address
mov ic_command3,wsm_data
call ic_sendcommand
bc port6,icclk
call delay
bc port6,icio
call delay
bank 0
mov len,@0
goto_writesecdata:
CJL len,@254,writesecdata
jmp exit_writesecdata
writesecdata:
bs port6,icclk
call delay
bc port6,icclk
call delay
bank 0
inc len
jmp goto_writesecdata
exit_writesecdata:
bs port6,icio
call delay
bs port6,icclk ;stop condition
call delay
bc port6,icclk
call delay
ret
;****************************
;I2C操作子程序(时序)集合
;****************************
;=================
;发送起始位程序
;说明: 当SCL=1时,向SDA发一个下降沿
;=================
iic_BSTART:
iic_SDA_OUT ;设置SDA为输出口
BS port6,0 ;SDA=1
NOP ;延时0.6US
BS port6,1 ;SCL=1
NOP ;延时0.6US
BC port6,0 ;SDA=0
NOP ;延时0.6US
BC port6,1 ;SCL=0
NOP ;延时0.6US
RET
;=================
;发送结束位程序
;说明: 当SCL=1时,向SDA发一个上升沿
;=================
iic_BSTOP:
iic_SDA_OUT ;设置SDA为输出口
BC port6,0 ;SDA=0
NOP ;延时0.6US
BS port6,1 ;SCL=1
NOP ;延时0.6US
BS port6,0 ;SDA=1
NOP ;延时0.6US
RET
;=================
;位输入子程序
;说明: 当SCL=1时,从SDA上读电平
;出口: C=从SDA上读入的位值
;=================
iic_BITIN:
BS port6,0 ;SDA=1
NOP ;延时0.6US
BS port6,1 ;SCL=1
NOP ;延时0.6US
iic_SDA_IN ;设置SDA为输入口
BC R3,C
JBC port6,0
BS R3,C ;C=SDA
NOP ;延时0.6US
BC port6,1 ;SCL=0
NOP ;延时0.6US
RET
;=================
;位输出子程序
;说明: 每当SCL=0时,改写SDA上的电平
;入口: C=要写到SDA上的位值
;=================
iic_BITOUT:
iic_SDA_OUT ;设置SDA为输出口
JBS R3,C
JMP iic_BIT0
BS port6,0 ;SDA=C=1
JMP CLK_1
iic_BIT0:
BC port6,0 ;SDA=C=0
CLK_1:
NOP ;延时0.6US
BS port6,1 ;SCL=1
iic_BIT2:
NOP
NOP
BC port6,1 ;SCL=0
RET
;============================
;接收数据子程序
;入口: TT_24.REND_24 =读完毕标志
;出口: DBUF_24 =接受到的数据(8_BIT)
;============================
iic_RX:
bank 0
MOV A,@8 ;循环次数=8
MOV COUNT_24,A
CLR IIC_DBUF_24
iic_RXLP:
CALL iic_BITIN ;输入1_BIT
bank 0
RLC IIC_DBUF_24 ;左移(带C)
DJZ COUNT_24 ;循环结束?
JMP iic_RXLP
;设置应答信号位,如果读完毕则送1(NO_ACK)停止接受,否则送0(ACK)继续接受
BS R3,C
JBS TT_24,REND_24 ;读完毕信号->C
BC R3,C
CALL iic_BITOUT ;应答
RET
;============================
;发送数据子程序
;入口: DBUF_24 =要发送的数据(8_BIT)
;============================
iic_TX:
bank 0
MOV A,@8 ;循环次数=8
MOV COUNT_24,A
iic_TXLP:
RLC IIC_DBUF_24 ;左移(带C)
CALL iic_BITOUT ;输出1_BIT
bank 0
DJZ COUNT_24 ;循环结束?
JMP iic_TXLP
CALL iic_BITIN ;读应答信号
RET
;****************************
;字节写程序
;功能: 写一个字节到EEPROM器件
;入口: DATA_24 =要写的数据
; ADDR_24 =数据地址
; SLAVE_24=从器件地址1010XXX0)
;****************************
iic_WRBYTE:
bank 0
MOV A,@0xa0 ;写地址
MOV IIC_DBUF_24,A
CALL iic_BSTART ;送起始位
CALL iic_TX ;送从器件地址并检测应答信号
bank 0
MOV A,@0
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据高地址并检测应答信号
bank 0
MOV A,ADDR_24
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据低地址并检测应答信号
bank 0
MOV A,DATA_24
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据并检测应答信号
CALL iic_BSTOP ;送停止位
RET
;****************************
;字节读程序
;功能: 从EEPROM器件读一个字节
;入口: ADDR_24 =数据地址
; SLAVE_24=从器件地址(1010XXX0)
;出口: DATA_24 =读到的数据
;****************************
iic_RDBYTE:
bank 0
MOV A,@0xa0 ;写地址
MOV IIC_DBUF_24,A
CALL iic_BSTART ;送起始位
CALL iic_TX ;送从器件地址并检测应答信号
bank 0
MOV A,@0
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据高地址并检测应答信号
bank 0
MOV A,ADDR_24
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据低地址并检测应答信号
;转入读状态
CALL iic_BSTART ;送起始位
bank 0
MOV A,@0xa1 ;读数据
MOV IIC_DBUF_24,A
BS IIC_DBUF_24,0
CALL iic_TX ;送从器件地址并检测应答信号
bank 0
BS TT_24,REND_24
CALL iic_RX ;读数据并发送应答信号
CALL iic_BSTOP ;送停止位
bank 0
MOV A,IIC_DBUF_24
MOV DATA_24,A ;保存数据到DATA_24
RET
;****************************
;页写程序
;功能: 写一个字节到EEPROM器件
;入口: R4 =要写的数据在RAM中存放首地址
; NUM_24 =字节数
; ADDR_24 =数据地址
; SLAVE_24=从器件地址1010XXX0)
;****************************
iic_WRPAGE:
bank 0
MOV A,SLAVE_24
MOV IIC_DBUF_24,A
CALL iic_BSTART ;送起始位
CALL iic_TX ;送从器件地址并检测应答信号
bank 0
MOV A,@0
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据高地址并检测应答信号
bank 0
MOV A,ADDR_24
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据低地址并检测应答信号
WRPAGE1:
bank 3
mov r4,iic_ram_address
MOV A,R0
bank 0
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据并检测应答信号
bank 3
INC iic_ram_address
bank 0
DJZ NUM_24
JMP WRPAGE1 ;未写完继续
CALL iic_BSTOP ;送停止位
RET
;****************************
;页读程序
;功能: 从EEPROM器件读一个字节
;入口: ADDR_24 =数据地址
; SLAVE_24=从器件地址(1010XXX0)
; NUM_24 =字节数
;出口:iic_ram_address =读到的数据在RAM中存放首地址
;****************************
iic_RDPAGE:
bank 0
MOV A,SLAVE_24
MOV IIC_DBUF_24,A
CALL iic_BSTART ;送起始位
CALL iic_TX ;送从器件地址并检测应答信号
bank 0
MOV A,@0
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据地址并检测应答信号
bank 0
MOV A,ADDR_24
MOV IIC_DBUF_24,A
CALL iic_TX ;送数据地址并检测应答信号
;转入读状态
CALL iic_BSTART ;送起始位
bank 0
MOV A,SLAVE_24
MOV IIC_DBUF_24,A
BS IIC_DBUF_24,0
CALL iic_TX ;送从器件地址并检测应答信号
RDPAGE1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -