⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iccard.dt

📁 使用EM78P468单片机做的IC卡煤气表程序。
💻 DT
📖 第 1 页 / 共 5 页
字号:
	
	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 + -