📄 iic.c
字号:
/*
-----------------------------------------------------------------
I2C总线器件24C16驱动程序
本程序是我开始这个编程训练计划开始后编程风格最好的
一个程序.他的许多编程规范我会做为以后编程的习惯.
同时,本程序中没有带器件名的函数是I2C总线的通用函数
在其它同总线器件程序中可以随便调用.另外,本程序是建
立在运用I/O口对I2C总线进行模拟前提下,如果是有I2C控
制器的单片机,就没有必要采用本程序了.
文件名:
iic.c
2006.4.3
张培华
-----------------------------------------------------------------
*/
#include <IIC.H>
/*
------------------------------------------------------------------
函数名:IIC_SomeNop(void)
功能: 简单小延时程序
输入:
调用:
库函数:
_nop_();
返回:
说明;
------------------------------------------------------------------
*/
void IIC_SomeNop(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*
------------------------------------------------------------------
函数名:IIC_Start(void)
功能: 开始总线,准备数据或命令传送
输入:
调用:
IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/
void IIC_Start(void)
{
SDA=1;
SCL=1;
IIC_SomeNop();
SDA=0;
IIC_SomeNop();
SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_Stop(void)
功能: 停止总线
输入:
调用:
IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/
void IIC_Stop(void)
{
SCL=0;
IIC_SomeNop();
SDA=0;
IIC_SomeNop();
SCL=1;
IIC_SomeNop();
SDA=1;
}
/*
------------------------------------------------------------------
函数名:IIC_WaitACK(void)
功能: 等待器件的应答信号
输入:
调用:
IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/
void IIC_WaitACK(void)
{
uint8 i=10;
SDA=1;
IIC_SomeNop();
SCL=1;
IIC_SomeNop();
do{
IIC_SomeNop();
if(!i--)break; //这儿是为了防止进入死循环设置的
}
while(SDA);
IIC_SomeNop();
SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_ACK(void)
功能: 应答
输入:
调用:
返回:
说明;
------------------------------------------------------------------
*/
void IIC_ACK(void)
{
SDA=0;
IIC_SomeNop();
SCL=1;
IIC_SomeNop();
SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_NO_ACK(void)
功能: 没有应答信号
输入:
调用:
返回:
说明;
------------------------------------------------------------------
*/
void IIC_NO_ACK(void)
{
SDA=1;
IIC_SomeNop();
SCL=1;
IIC_SomeNop();
SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_Sendbyte(uint8 wdata)
功能: 发送一个字节的数据
输入:
wdata:
要发送的数据;
调用:
IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/
void IIC_Sendbyte(uint8 wdata)
{
uint8 i;
for(i=0;i<8;i++){
SCL=0;
IIC_SomeNop();
if(wdata&0x80)SDA=1; //检查wdata的第7位是否为1
else SDA=0;
SCL=1;
IIC_SomeNop();
wdata<<=1; //总共移位7次,这和IIC_RcvByte(void)中不同,可以好好想想.
}
SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_RcvByte(void)
功能: 接收一个字节数据
输入:
调用:
IIC_SomeNop();
返回:
rdata:
接受到的数据;
说明;
------------------------------------------------------------------
*/
uint8 IIC_RcvByte(void)
{
uint8 i;
uint8 rdata=0;
SDA=1;
for(i=0;i<8;i++){
rdata<<=1; //移位8次,与IIC_Sendbyte(uint8 wdata)不同,可以好好想想.
SCL=0;
IIC_SomeNop();
SCL=1;
IIC_SomeNop();
if(SDA)rdata++; //检查SDA是否为1
SDA=1;
}
SCL=0;
return(rdata);
}
/*
------------------------------------------------------------------
函数名: IIC_24c16_ReadOneChar(uint8 Addr)
功能: 从24C16中读出一个字符
输入:
Addr:
要读出字符的地址;
调用:
IIC_Start();
IIC_SendByte();
IIC_WaitACK();
IIC_Stop();
IIC_SomeNop();
IIC_NO_ACK();
返回:
rdata:
从指定地址读出来的数据;
说明;
------------------------------------------------------------------
*/
uint8 IIC_24c16_ReadOneChar(uint8 Addr)
{
uint8 rdata;
IIC_Start();
IIC_SendByte(0x0a0);
IIC_WaitACK();
IIC_SendByte(Addr);
IIC_WaitACK();
IIC_Start();
IIC_SendByte(0x0a1);
IIC_WaitACK();
rdata=IIC_RcvByte();
IIC_NO_ACK();
IIC_Stop();
IIC_SomeNop();
IIC_SomeNop();
IIC_SomeNop();
IIC_SomeNop();
IIC_SomeNop();
IIC_SomeNop();
return (rdata);
}
/*
------------------------------------------------------------------
函数名:IIC_24c16_WriteOneChar(uint8 Addr,uint8 wdata)
功能: 向24C16中写一个字符
输入:
Addr:
要写字符的地址;
wdata:
要写入的字符数据;
调用:
IIC_Start();
IIC_SendByte();
IIC_WaitACK();
IIC_Stop();
IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/
uint8 IIC_24c16_WriteOneChar(uint8 Addr,uint8 wdata)
{
IIC_Start();
IIC_SendByte(0x0a0);
IIC_WaitACK();
IIC_SendByte(Addr);
IIC_WaitACK();
IIC_SendByte(wdata);
IIC_WaitACK();
IIC_Stop();
IIC_SomeNop();
IIC_SomeNop();
IIC_SomeNop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -