发 帖  
原厂入驻New

I2C汇编源程序代码

2009-3-2 23:39:47  2777
分享
<font face="Verdana">I2C汇编源程序代码</font><br/>
x0XbB9zS.rar (6.12 KB, 下载次数: 7 )
<br/>
<p><font face="Verdana">/*****<br/>;FileName: IicSMasU.a51<br/>;Describe: 51 系列模拟I2C 总线主控器驱动程序<br/>;Date: 2003/11/12<br/>;*****/<br/>$include (IicSMasU.inc)<br/>public _IicTxdRxd<br/>public SlvAddr<br/>public SubAddr<br/>/*******************************************************************************<br/>*<br/>;Name: bit _IicTxdRxd(TxdByte,RxdByte,&amp;IicDataBuf)<br/>;Describe: 发送数据给被控器/接收来自被控器的数据<br/>;Input: TxdByte=要发送数据的字节数<br/>; RxdByte=要接收数据的字节数<br/>; IicDataBuf=发送/接收缓冲区的首字节<br/>; (SlvAddr(被控器地址),SubAddr(单元地址))<br/>;Output: C(Retry=1):操作失败标志<br/>; IicDataBuf=接收到的数据的首字节(主接收时有效)<br/>;调用说明:<br/>; A.现行地址写: SlvAddr(写) !!!(带SubAddr 的器件不能使用该子程序)<br/>; TxdByte=(发送数据字节数(SubAddr 为第一个要发送的数据))<br/>; RxdByte=0<br/>; B.指定地址写: SlvAddr(写),SubAddr<br/>; TxdByte=(1+发送数据字节数)<br/>; RxdByte=0<br/>; C.现行地址读: SlvAddr(读)</font></p>
<p><font face="Verdana">; TxdByte=0<br/>; RxdByte=要接收数据的字节数<br/>; D.指定地址读: SlvAddr(读),SubAddr<br/>; TxdByte=1<br/>; RxdByte=要接收数据的字节数<br/>;Nesting level: 1<br/>;Change: A,C,R1, R4~R7<br/>;*******************************************************************************<br/>****/<br/>BitSegIicSM SEGMENT BIT overlayable<br/>RSEG BitSegIicSM<br/>Retry: dbit 1 指明I2C 最后的数据传送失败应该重复操作<br/>BITEA: DBIT 1 存中断状态<br/>DataSegIicSM SEGMENT DATA overlayable<br/>RSEG DataSegIicSM<br/>SlvAddr: ds 1 被控器地址<br/>SubAddr: ds 1 单元地址<br/>TxdByte equ r7 要发送数据的字节数(第一传递参数)<br/>RxdByte equ r5 要接收数据的字节数(第二传递参数)<br/>WaitXTm macro X 延时X 个机器周期<br/>IF X=0<br/>exitm<br/>endif<br/>if X=1<br/>nop<br/>endif<br/>if X=2<br/>nop<br/>nop<br/>endif<br/>if X=3<br/>nop<br/>nop<br/>nop<br/>endif<br/>if X&gt;255<br/>error "the number of X is too much"<br/>else<br/>mov r6,#X/2<br/>DJNZ r6,$<br/>endif</font></p>
<p><font face="Verdana">endm<br/>CodeSegIicSM SEGMENT CODE<br/>RSEG CodeSegIicSM<br/>_IicTxdRxd:<br/>SETB Retry 设置错误标志位<br/>/*****<br/>;发送起动条件<br/>;*****/<br/>SendStart:<br/>SETB SDA<br/>SETB SCL<br/>WaitXTm IicDelay<br/>CLR SDA 产生起始信号<br/>WaitXTm IicDelay<br/>CLR SCL 结束起动条件<br/>/*****<br/>;送被控器地址地址,数据<br/>;*****/<br/>SendSlaAdr:<br/>MOV A,SlvAddr<br/>CJNE TxdByte,#0,SendSlaAdr1<br/>SETB ACC.0 TxdByte=0 时进行读操作<br/>SendSlaAdr1:<br/>SETB C 检测应答位时释放SDA 线<br/>CALL XmByte<br/>JC IicErr 无应答出错<br/>JB ACC.0,ReceiveData SlaAdr.0=1 时进行读操作<br/>;写操作<br/>MOV A,SubAddr<br/>SendData:<br/>SETB C 检测应答位时释放SDA 线<br/>CALL XmByte<br/>JC IicErr 无应答出错<br/>MOV A,@R1<br/>INC R1<br/>DJNZ TxdByte,SendData<br/>DEC R1<br/>MOV A,RxdByte<br/>JNZ SendStart RxdByte&gt;0 时进行读操作<br/>JMP SendStop</font></p>
<p><font face="Verdana">/*****<br/>;Name: RcvByte<br/>;Describe: 接收1 字节数据(接收8 位,发送+1 位(非)应答位)<br/>;Input: C=1:发送非应答位(通知slave 停止通信)<br/>; C=0:发送应答位(通知slave 继续发送后续字节)<br/>;Output: A=接收到的数据, C=(非)应答位<br/>;Use: A,R4,C,R6(WaitXTm)<br/>;*****/<br/>RcvByte:<br/>MOV A,#0FFH 释放SDA 线允许输入<br/>/*****<br/>;Name: XmByte<br/>;Describe: 发送1 字节数据(发送8 位,接收1 位(非)应答位)<br/>;Input: A=待发送的数据, C=1(检测应答位时释放SDA 线)<br/>;Output: C=1:slave 非应答(slave 不响应)<br/>; C=0:slave 应答(slave 接收成功)<br/>;Use: A,R4,C,R6(WaitXTm)<br/></font></p>
1
2009-3-2 23:39:47   评论 分享淘帖
1 个讨论
有用!收了!谢谢楼主!!
2017-5-5 09:50:00 评论

举报

只有小组成员才能发言,加入小组>>

141个成员聚集在这个小组

加入小组

创建小组步骤

快速回复 返回顶部 返回列表