📄 iic.c
字号:
#include <REG932.h>
#include <Define.h>
#include <Stdio.h>
#include <Intrins.h>
//-----***-IIC延时-***-----//
void wait(void)
{
_nop_();//01
_nop_();//02
_nop_();//03
_nop_();//04
_nop_();//05
_nop_();//06
_nop_();//07
_nop_();//08
_nop_();//09
_nop_();//10
}
void iicstart(void)//总线开始
{
iicsda=1;
wait();
iicscl=1;
wait();
iicsda=0;
wait();
iicscl=0;
wait();
}
void iicstop(void)//总线结束
{
iicsda=0;
wait();
iicscl=1;
wait();
iicsda=1;
wait();
}
bit ack(void)//检测
{
bit t;
iicsda=1;
wait();
iicscl=1;
wait();
t=iicsda;
iicscl=0;
wait();
return t;
}
void noack(bit ack)//非检测
{
iicsda=ack;
wait();
iicscl=1;
wait();
iicscl=0;
wait();
}
bit w8bitiic(unsigned char templ)
{
unsigned char i;
bit t;
for(i=0;i<8;i++)
{
if(templ&0x80)
iicsda=1;
else
iicsda=0;
wait();
iicscl=1;
wait();
iicscl=0;
templ<<=1;
}
t=ack();
return t;
}
unsigned char r8bitiic(void)
{
unsigned char i;
unsigned char byte=0;
iicsda=1;
for(i=0;i<8;i++)
{iicscl=1;
byte<<=1;
if(iicsda)byte|=0x01;
else byte|=0x00;
iicscl=0;
}
return byte;
}
void wbyteiic(unsigned char deviceaddress,unsigned char dateaddress,unsigned char byte)
{
iicwp=0;
Delay(500);
EA=0;
iicstart();
w8bitiic(deviceaddress);
w8bitiic(dateaddress);
w8bitiic(byte);
iicstop();
EA=1;
iicwp=1;
Delay(500);
}
unsigned char rbyteiic(unsigned char deviceaddress,unsigned char dateaddress)
{
unsigned char c;
EA=0;
iicstart();
w8bitiic(deviceaddress);
w8bitiic(dateaddress);
iicstart();
w8bitiic(deviceaddress|0x01);
c=r8bitiic();
noack(1);
iicstop();
EA=1;
return(c);
}
//-----***-无扇区读---多字节-***-----//
//读取指定器件无扇区指定地址多字节数据到指定地址
//Device=器件地址---单字节
//DataAdd=字节地址---单字节
void IicMByteRead(unsigned char deviceaddress,unsigned char dateaddress,unsigned char *DataDptr,unsigned char DataLend)
{
unsigned char i;
EA=0;
iicstart();
w8bitiic(deviceaddress);
w8bitiic(dateaddress);
iicstart();
w8bitiic(deviceaddress|0x01);
for(i=0;i<DataLend-1;i++)
{
*DataDptr=r8bitiic();
DataDptr++;
noack(0);
}
*DataDptr=r8bitiic();
noack(1);
iicstop();
EA=1;
}
//-----***-无扇区写---多字节-***-----//
//写入指定器件无扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
/*void IicMByteWrite(unsigned char deviceaddress,unsigned char dateaddress,unsigned char *DataDptr,unsigned char DataLend)
{
unsigned char i,j;
ET0=0;
iicwp=0;
for(i=0;i<3;i++)
{
iicstart();
w8bitiic(deviceaddress);
w8bitiic(dateaddress);
for(j=0;j<DataLend;j++)
{
w8bitiic(*DataDptr);
DataDptr++;
}
iicstop();
}
iicwp=1;
ET0=1;
Delay(500);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -