📄 i2c总线c语言源程序.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>
<body>
<table cellspacing="0" cellpadding="0">
<tr>
<td><p align="center"><strong>I2C</strong><strong>总线</strong><strong>C</strong><strong>语言源程序</strong></p></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td valign="top"><table cellspacing="0" cellpadding="0">
<tr>
<td width="22"></td>
<td></td>
<td width="10" rowspan="3"></td>
</tr>
<tr>
<td width="22"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><table cellpadding="0">
<tr>
<td width="100%"><p>/*VIICC.H*/<br>
#pragma db cd small<br>
#include <intrins.h><br>
#include <reg52.h><br>
#define NOP nop ( ); nop ( ); nop ( ); nop ( )<br>
#define SDA P1^7<br>
#define SCL P1^6<br>
<br>
void sta( );<br>
void cack( );<br>
void stop( );<br>
void mnack( );<br>
void mack( );<br>
void wrbyt(uchar shu);<br>
void wrnbyta(uchar slaw,uchar gg[],uchar n);<br>
void wrnbyt(uchar slaw,uchar ff[],uchar number);<br>
uchar rdbyt( );<br>
void rdnbyt(uchar slar,uchar qq[],uchar number);<br>
源程序由9个函数组成,程序清单如下:<br>
voidsta( )/*启动I2C总线*/<br>
{<br>
SDA=1;<br>
SCL=1;<br>
NOP;<br>
SDA=0;<br>
NOP;<br>
SCL=0;<br>
}<br>
<br>
void stop( )/*停止I2C总线<br>
*/<br>
{<br>
SDA=0;<br>
SCL=1;<br>
NOP;<br>
SDA=1;<br>
NOP;<br>
SCL=0;<br>
}<br>
<br>
void mack( )/*发送应答位*/<br>
{<br>
SDA=0;<br>
SCL=1;<br>
NOP;<br>
SCL=0;<br>
SDA=1;<br>
}<br>
<br>
void mnack( )/*发送非应答位*/<br>
{<br>
SDA=1;<br>
SCL=1;<br>
NOP;<br>
SCL=0;<br>
SDA=0;<br>
}<br>
<br>
void cack( )/*应答位检查*/<br>
{<br>
SDA=1;<br>
SCL=1;<br>
F0=0;<br>
if(SDA==1)<br>
F0=1;<br>
SCL=0;<br>
nop( );<br>
}<br>
/*向虚拟I2C总线上发送1个数据字节*/<br>
void wrbyt(uchar shu)<br>
{<br>
uchar i;<br>
for(i=0;i<8;i++){<br>
if((shu&0x80)>0){<br>
SDA=1;<br>
SCL=1;<br>
NOP;<br>
SCL=0;<br>
SDA=0;<br>
}<br>
else{<br>
SDA=0;<br>
SCL=1;<br>
NOP;<br>
SCL=0;<br>
}<br>
shu=shu<<1;<br>
}<br>
}<br>
/*从I2C总线上读取1个数据字节*/<br>
uchar rdbyt( )<br>
{<br>
uchar nn=0xff,mm=0x80,uu=0x7f;<br>
uchar j;<br>
for(j=0;j<8;j++){<br>
SDA=1;<br>
SCL=1;<br>
if(SDA==0)<br>
nn=(nn&uu);<br>
else<br>
nn=(nn|mm);。<br>
nn=crol(nn,1);<br>
SCL=0;<br>
}<br>
return(nn);<br>
}<br>
<br>
void wrnbyta(uchar slaw,uchar gg[],uchar n)<br>
{<br>
do{<br>
sta( );<br>
wrbyt(slaw);<br>
cack( );<br>
}while(F0==1);<br>
wrbyt(gg[n]);<br>
cack( );<br>
<br>
<br>
<br>
<br>
<br>
}<br>
/*向虚拟I2C总线上发送n个字节的数据*/<br>
void wrnbyt(uchar slaw,uchar ff[],uchar number)<br>
{<br>
uchar idata k;<br>
do{<br>
sta( );<br>
wrbyt(slaw);<br>
?cack( );<br>
}while(F0==1);<br>
for(k=0;k<number;k++){。<br>
wrbyt(ff[k]);<br>
cack( );<br>
while(F0==1)<br>
wrnbyta(slaw,ff,k);<br>
}<br>
stop( );<br>
}<br>
/*从虚拟I2C总线上读取n个字节的数据*/<br>
void rdnbyt(uchar slar,uchar qq[],uchar number)<br>
{<br>
uchar idata data0,l;<br>
do{<br>
sta( );<br>
wrbyt(slar);<br>
cack( );<br>
}while(F0==1);?<br>
for(l=0;l<number-1;l++){<br>
data0=rdbyt( );<br>
qq[l]=data0;<br>
mack( );<br>
}<br>
data0=rdbyt( );<br>
qq[l]=data0;<br>
mnack( );<br>
stop( );<br>
}</p></td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -