|
|
24c64程序该程序已使用过,免调试。
;宏定义区;
N_NOPMACRO
nop
nop
nop
ENDM
TRAPMACRO
nop
nop
nop
sjmp$
ENDM
TRAP_RETMACRO
nop
nop
nop
ret
nop
nop
nop
sjmp$
ENDM
;===============================================
;function:start_24c;启动I2C总线
;input:---------
;output:---------
;usage:---------
;=============================================
start_24c:;启动I2C总线
setbCSDA;数据线下降沿产生
N_NOP
setbCSCL;时钟线下降沿
N_NOP
clrCSDA
N_NOP
clrCSCL
N_NOP
ret
;================================================
;function:stop_24c;停止I2C总线
;input:
;output:---------
;usage:
;================================================
stop_24c:;停止I2C总线
clrCSDA;数据线上升沿有效?
N_NOP
setbCSCL
N_NOP
setbCSDA;数据线上升沿有效?
N_NOP
clrCSDA;且时钟线须为高电平
N_NOP
clrCSCL;且时钟线须为高电平
N_NOP
ret
;===============================================
;function:ch_ack(应答位检查);应答位检查
;input:
;output:---------
;usage:
;==============================================
ch_ack:;应答位检查
setbCSDA
N_NOP
setbCSCL
N_NOP
out_chkack:movc,SDA
jcout_chkack
clrSCL
N_NOP
ret
;=================================================
;function:send_ack(发送应答);;发送应答位
;input:
;output:---------
;usage:
;================================================
send_ack:;发送应答位
clrCSDA
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
setbCSDA
N_NOP
ret
;===================================================
;function:send_ack(发送非应答);发送非应答位
;input:
;output:---------
;usage:
;=============================================
sendn_ack:;发送非应答位
setbCSDA
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
clrCSDA
N_NOP
ret
;=================================================
;function:read_24c_N;从I2C总线接收N个数据字节
;input:r1---------欲接收数据存放缓冲区首址
;b----------从器件地址/读写控制字
;dptr-------欲从eprom读数据的首地址
;r2---------欲接收数据的字节数
;output:---------
;usage:a,c,r1,r2,dptr
;================================================
read_24c_N:;从I2C总线接收N个数据字节
lcallstart_24c;start
mova,b;ic_addr
clracc.0
lcallout_24c
;mova,dph;addr_low
;lcallout_24c
mova,dpl;addr_hi
lcallout_24c
lcallstart_24c;start
mova,b;ic_addr
lcallout_24c
decr2
cjner2,#00h,read_loop
sjmpread_once
read_loop:lcallin_24c;read
lcallsend_ack;send nack
mov@r1,a
incr1
djnzr2,read_loop
read_once:lcallin_24c;read
lcallsendn_ack;send nack
lcallstop_24c;stop
mov@r1,a
TRAP_RET
;=================================================
;function:write_24c_N;向I2C总线发送N个数据字节
;input:r0---------欲发送数据缓冲区首址
;b----------从器件地址/写控制字
;dptr-------欲写入eprom数据的首地址
;r2---------欲发送数据的字节数
;output:---------
;usage:a,c,r0,r2,dptr
;========================================================
write_24c_N:;向I2C总线发送N个数据字节
lcallstart_24c;start
mova,b;从地址
lcallout_24c
;mova,dph;高位地址
;lcallout_24c
mova,dpl;低位地址
lcallout_24c
write_loop:mova,@r0
lcallout_24c
incr0
djnzr2,write_loop
lcallstop_24c;stop
N_NOP
N_NOP
TRAP_RET
;=========================================================
;function:write_24c_1;向I2C总线发送1个数据字节
;input:b----------要写的数据
;dpl-------欲写入eprom数据的地址
;output:---------
;usage:a,b,dptr
;=========================================================
write_24c_1:;向I2C总线发送1个数据字节
lcallstart_24c;start
mova,#0a0h;从地址
lcallout_24c
mova,dpl;低位地址
lcallout_24c
mova,b
lcallout_24c
lcallstop_24c;stop
N_NOP
N_NOP
TRAP_RET
;===============================================
;function:read_24c_1;从I2C总线接收1个数据字节
;input:dpl-------欲从eprom读数据的地址
;output:a
;usage:a,dptr
;===================================================
read_24c_1:;从I2C总线接收1个数据字节
lcallstart_24c;start
mova,#0a0h;ic_addr
lcallout_24c
mova,dpl;addr_hi
lcallout_24c
lcallstart_24c;start
mova,#0a1h;ic_addr
lcallout_24c
lcallin_24c;read
lcallsendn_ack;send nack
lcallstop_24c;stop
TRAP_RET
;=================================================
;function ut_24c;向I2C发送一个字节
;input:a
;output:--------
;usage:a,c
;========================================================
out_24c:;向I2C发送一个字节
;lcalldog_int_feed
movc,acc.7
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.6
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.5
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.4
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.3
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.2
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.1
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
movc,acc.0
movCSDA,c
N_NOP
setbCSCL
N_NOP
clrCSCL
N_NOP
setbCSDA
N_NOP
setbCSCL
N_NOP
out_wait:movc,CSDA
jcout_wait
clrCSCL
TRAP_RET
;=========================================================
;function:in_24c;从I2C总线接收一个数据字节
;input:---------
;output:a
;usage:a,c
;=================================================
in_24c:;从I2C总线接收一个数据字节
;lcalldog_int_feed
setbCSDA
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.7,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.6,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.5,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.4,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.3,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.2,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.1,c
clrCSCL
N_NOP
setbCSCL
N_NOP
movc,CSDA
movacc.0,c
clrCSCL
N_NOP
TRAP_RET |
|