SLE4428卡讀寫程序。這個(gè)EMC指令版本是根據(jù)C51程序改寫的。已經(jīng)通過(guò)了調(diào)試。 ;============================ ;發(fā)送數(shù)據(jù)子程序 ;入口: DBUF_24 =要發(fā)送的數(shù)據(jù)(8_BIT) ;============================ ic_send_data: MOV A,@8 ;循環(huán)次數(shù)=8 MOV COUNT_24,A TXLP: RRC DBUF_24 ;左移(帶C) CALL ic_BITOUT ;輸出1_BIT DJZ COUNT_24 ;循環(huán)結(jié)束? JMP TXLP RET ;================= ;位輸入子程序 ;說(shuō)明: 當(dāng)SCL=1時(shí),從SDA上讀電平 ;出口: C=從SDA上讀入的位值 ;================= ic_BITIN: set_io_in ;設(shè)置i/o為輸入口 set_clk_out bc 0x05,0 bs port6,icclk ;clk=1 call delay ;延時(shí) BC R3,0 JBC port6,icio BS R3,0 ;C=io call delay ;延時(shí)0.6US BC port6,icclk ;clk=0 call delay ;延時(shí)0.6US RET ;================= ;位輸出子程序 ;說(shuō)明: 每當(dāng)SCL=0時(shí),改寫SDA上的電平 ;入口: C=要寫到SDA上的位值 ;================= ic_BITOUT: ;SDA_OUT ;設(shè)置SDA為輸出口 set_io_out set_clk_out
JBS R3,0 JMP BIT0 BS port6,icio ;io=C=1 JMP io1 BIT0: BC port6,icio ;io=C=0 io1: call delay ;延時(shí)0.6US bs port6,icclk ;clk=1 BIT2: call delay call delay bc port6,icclk ;clk=0 RET ;============================ ;接收數(shù)據(jù)子程序 ;入口: TT_24.REND_24 =讀完畢標(biāo)志 ;出口: DBUF_24 =接受到的數(shù)據(jù)(8_BIT) ;============================ ic_receive_data: MOV A,@8 ;循環(huán)次數(shù)=8 MOV COUNT_24,A CLR DBUF_24 RXLP: CALL ic_BITIN ;輸入1_BIT RRC DBUF_24 ;左移(帶C) DJZ COUNT_24 ;循環(huán)結(jié)束? JMP RXLP RET
;=========================== ;復(fù)位操作 ;============================ ic_reset: set_clk_out set_io_out set_rst_out
bc port6,icclk ;clk=0 call delay10 bc port6,icrst ;rst=0 call delay10 bs port6,icio ;i/o=1 call delay10 bs port6,icrst ;rst=1 call delay10 bs port6,icclk ;clk=1 call delay10 bc port6,icclk ;clk=0 call delay10 bc port6,icrst ;rst=0 call delay10
call ic_receive_data MOV ic_buffer1,dbuf_24 call ic_receive_data ;MOV ic_buffer2,dbuf_24 call ic_receive_data ;MOV ic_buffer3,dbuf_24 call ic_receive_data ;MOV ic_buffer4,dbuf_24 ret
;============================延時(shí)子程序==================================== ;功能:短延時(shí) 入口:NONE 出口:NONE ;影響資源:A,TEMP ,STATUS ;========================================================================== DELAY: MOV A,@0X05 MOV TEMP,A DJZ TEMP JMP $-1 RET ;============================延時(shí)子程序10MS================================ ;功能:延時(shí) 入口:NONE 出口:NONE ;影響資源:A,TEMP ,STATUS ;========================================================================== DELAY10: MOV A,@0x10 MOV TEMP,A MOV A,@0xff MOV TEMP1,A DJZ TEMP1 JMP $-1 DJZ TEMP JMP $-5 RET
DELAY100: MOV a, @0x36 MOV delay_time1, a delay51: MOV a, @0x25 MOV delay_time2,a delay52: MOV a, @0x42 MOV flag, a delay53: djz flag jmp delay53 djz delay_time2 jmp delay52 djz delay_time1 jmp delay51 RET
;=========發(fā)送命令========= ;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
MOV dbuf_24,ic_command1 call ic_send_data MOV dbuf_24,ic_command2 call ic_send_data 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
/*================讀主存儲(chǔ)器================== 入口:rmm_address 讀取的地址 rmm_len 讀取的長(zhǎng)度 出口:ic_buffer1 ;============================================*/ ic_readmainmemory: bank 0 MOV ic_command1,@0x30 MOV ic_command2,rmm_address MOV ic_command3,@0 call ic_sendcommand
bc port6,icclk call delay MOV len,@0 ;0x10為私有要保護(hù) 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 jmp exit_readdata readdata: CJL len,rmm_len,save_data call ic_receive_data jmp drop_data save_data: call ic_receive_data MOV a,dbuf_24 MOV ic_buffer1,a drop_data: inc len jmp goto_readdata exit_readdata: bs port6,icclk call delay bc port6,icclk call delay ret
/*================寫主存儲(chǔ)器================== 入口:wmm_address 寫主存的地址 wmm_value 寫主存的數(shù)據(jù) 出口: ;============================================*/ ic_writemainmemory: set_io_out set_clk_out 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 MOV len,@0 ;0x10為私有要保護(hù) goto_writedata: CJL len,@254,writedata jmp exit_writedata writedata: bs port6,icclk call delay bc port6,icclk call delay 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 /*================讀安全儲(chǔ)區(qū)================= 入口: 出口:rsm_data1、rsm_data2、rsm_data3、rsm_data4讀取的數(shù)據(jù) ;============================================*/ ic_readsecmemory: set_io_out set_clk_out 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 MOV rsm_data1,dbuf_24 call ic_receive_data MOV rsm_data2,dbuf_24 call ic_receive_data MOV rsm_data3,dbuf_24 call ic_receive_data 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 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: MOV wsm_data,@0x06 nop jmp endcomp setbit2: MOV wsm_data,@0x04 nop jmp endcomp setbit3: MOV wsm_data,@0x00 nop endcomp: MOV wsm_address,@0 call ic_writesecmemory
;MOV len,@0 ;CJL len,@3,writedata ;MOV password_data,@0xff MOV ic_command1,@0x33 MOV ic_command2,@1 MOV ic_command3,@0xff 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
MOV ic_command1,@0x33 MOV ic_command2,@2 MOV ic_command3,@0xff 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
MOV ic_command1,@0x33 MOV ic_command2,@3 MOV ic_command3,@0xff 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: 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 /*================讀保護(hù)儲(chǔ)器================= 出口:rpm_data 讀取的數(shù)據(jù) ;============================================*/ ic_readprotectmemory: set_io_out set_clk_out 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 MOV rpm_data1,dbuf_24 call ic_receive_data MOV rpm_data2,dbuf_24 call ic_receive_data MOV rpm_data3,dbuf_24 call ic_receive_data MOV rpm_data4,dbuf_24 set_io_out set_clk_out bs p6cr,icclk ;stop condition call delay bc p6cr,icclk call delay ret
/*================寫保護(hù)儲(chǔ)器================= 入口:wpm_address 寫的地址 出口:wpm_data 寫的數(shù)據(jù) ;============================================*/ ic_writeprotectmemory: set_io_out set_clk_out 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
MOV len,@0 goto_writeprotectdata: CJL len,@254,writeprotectdata jmp exit_writeprotectdata writeprotectdata: bs p6cr,icclk call delay bc p6cr,icclk call delay 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
/*================寫安全儲(chǔ)區(qū)================= 入口:wsm_address 寫的地址 出口:wsm_data 寫的數(shù)據(jù) ;============================================*/ ic_writesecmemory: set_io_out set_clk_out 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
MOV len,@0 goto_writesecdata: CJL len,@254,writesecdata jmp exit_writesecdata writesecdata: bs port6,icclk call delay bc port6,icclk call delay 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 |
|