24c64程序
該程序已使用過,免調(diào)試。;宏定義區(qū);
?N_NOP??MACRO
???nop
???nop
???nop
???ENDM
?TRAP??MACRO
???nop
???nop
???nop
???sjmp??$
???ENDM?
?
?TRAP_RET?MACRO
???nop
???nop
???nop
???ret
???nop
???nop
???nop
???sjmp??$
???ENDM
;===============================================
;??function:?start_24c?;啟動I2C總線?
;??input:??---------
;??output:??---------
;??usage:??---------??
;=============================================
start_24c:?;啟動I2C總線
??setb??CSDA??;數(shù)據(jù)線下降沿產(chǎn)生
??N_NOP
??setb??CSCL??;時鐘線下降沿
??N_NOP
??clr??CSDA
??N_NOP
??clr??CSCL
??N_NOP
??ret
;================================================
;??function:?stop_24c?;停止I2C總線?
;??input:??
;??output:??---------
;??usage:????
;================================================
stop_24c:?;停止I2C總線
??clr??CSDA??;數(shù)據(jù)線上升沿有效?
??N_NOP
??setb??CSCL
??N_NOP
??setb??CSDA??;數(shù)據(jù)線上升沿有效?
??N_NOP
??clr??CSDA??;且時鐘線須為高電平
??N_NOP
??clr??CSCL??;且時鐘線須為高電平
??N_NOP
??ret
;===============================================
;??function:?ch_ack(應(yīng)答位檢查);應(yīng)答位檢查?
;??input:??
;??output:??---------
;??usage:????
;==============================================
ch_ack:??;應(yīng)答位檢查
??setb??CSDA
??N_NOP
??setb??CSCL
??N_NOP
out_chkack:?mov??c,??SDA?
??jc??out_chkack
??clr??SCL
??N_NOP
??ret
;=================================================
;??function:?send_ack(發(fā)送應(yīng)答);;發(fā)送應(yīng)答位?
;??input:??
;??output:??---------
;??usage:????
;================================================
send_ack:?;發(fā)送應(yīng)答位
??clr??CSDA
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??setb??CSDA
??N_NOP
??ret
;===================================================
;??function:?send_ack(發(fā)送非應(yīng)答);發(fā)送非應(yīng)答位?
;??input:??
;??output:??---------
;??usage:????
;=============================================
sendn_ack:?;發(fā)送非應(yīng)答位
??setb??CSDA
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??clr??CSDA
??N_NOP
??ret
;=================================================
;??function:?read_24c_N?;從I2C總線接收N個數(shù)據(jù)字節(jié)?
;??input:??r1---------欲接收數(shù)據(jù)存放緩沖區(qū)首址
;????b----------從器件地址/讀寫控制字
;????dptr-------欲從eprom讀數(shù)據(jù)的首地址
;????r2---------欲接收數(shù)據(jù)的字節(jié)數(shù)
;??output:??---------
;??usage:??a,c,r1,r2,dptr
;================================================
read_24c_N:;從I2C總線接收N個數(shù)據(jù)字節(jié)
??lcall??start_24c??;start
??mov??a,??b?;ic_addr
??clr??acc.0
??lcall??out_24c
??;mov??a,??dph?;addr_low
??;lcall??out_24c
??mov??a,??dpl?;addr_hi
??lcall??out_24c
??lcall??start_24c??;start
??mov??a,??b?;ic_addr
??lcall??out_24c
??dec??r2
??cjne??r2,?#00h,?read_loop
??sjmp??read_once
read_loop:?lcall??in_24c???;read
??lcall??send_ack??;send nack
??mov??@r1,??a
??inc??r1
??djnz??r2,??read_loop
read_once:?lcall??in_24c???;read
??lcall??sendn_ack??;send nack
??lcall??stop_24c??;stop
??mov??@r1,??a
??TRAP_RET
;=================================================
;??function:?write_24c_N?;向I2C總線發(fā)送N個數(shù)據(jù)字節(jié)?
;??input:??r0---------欲發(fā)送數(shù)據(jù)緩沖區(qū)首址
;????b----------從器件地址/寫控制字
;????dptr-------欲寫入eprom數(shù)據(jù)的首地址
;????r2---------欲發(fā)送數(shù)據(jù)的字節(jié)數(shù)
;??output:??---------
;??usage:??a,c,r0,r2,dptr
;========================================================
write_24c_N:;向I2C總線發(fā)送N個數(shù)據(jù)字節(jié)
??lcall??start_24c??;start
??mov??a,??b?;從地址
??lcall??out_24c
??;mov??a,??dph?;高位地址
??;lcall??out_24c
??mov??a,??dpl?;低位地址
??lcall??out_24c
write_loop:?mov??a,??@r0
??lcall??out_24c
??inc??r0
??djnz??r2,??write_loop
??lcall??stop_24c??;stop
??N_NOP
??N_NOP
??TRAP_RET
;=========================================================
;??function:?write_24c_1?;向I2C總線發(fā)送1個數(shù)據(jù)字節(jié)?
;??input:??b----------要寫的數(shù)據(jù)
;????dpl-------欲寫入eprom數(shù)據(jù)的地址
;??output:??---------
;??usage:??a,b,dptr
;=========================================================
write_24c_1:;向I2C總線發(fā)送1個數(shù)據(jù)字節(jié)
??lcall??start_24c??;start
??mov??a,??#0a0h?;從地址
??lcall??out_24c
??mov??a,??dpl?;低位地址
??lcall??out_24c
??mov??a,??b
??lcall??out_24c
??lcall??stop_24c??;stop
??N_NOP
??N_NOP
??TRAP_RET
;===============================================
;??function:?read_24c_1?;從I2C總線接收1個數(shù)據(jù)字節(jié)?
;??input:??dpl-------欲從eprom讀數(shù)據(jù)的地址
;??output:??a
;??usage:??a,dptr
;===================================================
read_24c_1:;從I2C總線接收1個數(shù)據(jù)字節(jié)
??lcall??start_24c??;start
??mov??a,??#0a0h?;ic_addr
??lcall??out_24c
??mov??a,??dpl?;addr_hi
??lcall??out_24c
??lcall??start_24c??;start
??mov??a,??#0a1h?;ic_addr
??lcall??out_24c
??lcall??in_24c???;read
??lcall??sendn_ack??;send nack
??lcall??stop_24c??;stop
??TRAP_RET
;=================================================
;??function:?out_24c??;向I2C發(fā)送一個字節(jié)?
;??input:??a
;??output:??--------
;??usage:??a,c
;========================================================
out_24c:;向I2C發(fā)送一個字節(jié)
??;lcall??dog_int_feed
??mov??c,??acc.7
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.6
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.5
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.4
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.3
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.2
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.1
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??mov??c,??acc.0
??mov??CSDA,??c
??N_NOP
??setb??CSCL
??N_NOP
??clr??CSCL
??N_NOP
??setb??CSDA
??N_NOP
??setb??CSCL
??N_NOP
out_wait:?mov??c,??CSDA
??jc??out_wait
??clr??CSCL
??TRAP_RET
;=========================================================
;??function:?in_24c??;從I2C總線接收一個數(shù)據(jù)字節(jié)?
;??input:??---------
;??output:??a
;??usage:??a,c
;=================================================
in_24c:?;從I2C總線接收一個數(shù)據(jù)字節(jié)
??;lcall??dog_int_feed
??setb??CSDA
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.7,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.6,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.5,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.4,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.3,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.2,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.1,??c
??clr??CSCL
??N_NOP
??setb??CSCL
??N_NOP
??mov??c,??CSDA
??mov??acc.0,??c
??clr??CSCL
??N_NOP
??TRAP_RET
評論
查看更多