📄 iic.c
字号:
#include <reg52.H>
#include <intrins.h>
sbit SCL = P1^6; /*IIC时钟线*/
sbit SDA = P1^7; /*IIC数据线*/
static unsigned char Mode;
/*----------------------------全局符号定义----------------------------*/
#define SomeNop(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
/******************************************************************
I2CStart:发动IIC总线起始信号
******************************************************************/
void I2CStart (void)
{
SomeNop();
SCL = 1;
SomeNop();
SDA = 0;
SomeNop();
SCL = 0;
SomeNop();
}
/*****************************************************************
I2CStop:发出IIC总线结束信号
*****************************************************************/
void I2CStop(void)
{
SDA = 0;
SomeNop();
SCL = 1;
SomeNop();
SDA = 1;
SomeNop();
SCL = 0;
}
/***************************************************************
I2CInit:I2C总线初始化程序
***************************************************************/
void I2CInit (void)
{
SCL=0;
SomeNop();
I2CStop();
}
/**************************************************************
I2Cclock: 发送总线时钟信号,并返回时钟电平为高期间SDA上的状态,
可用于发送,也可用于接收。
***************************************************************/
bit I2CClock (void)
{
bit sample;
SomeNop();
SCL = 1;
_nop_(); _nop_(); _nop_();
sample = SDA;
_nop_(); _nop_();
SCL = 0;
SomeNop();
return(sample);
}
/************************************************************
I2CSendByte: 向I2C总线发送一个字节,并请求应答,若收到应答
则返回1,否则返回0
**************************************************************/
bit I2CSendByte (char I2CData)
{
register unsigned char i;
for (i=0; i<8; i++){
SDA = (bit) (I2CData&0x80);
I2CData <<= 1;
I2CClock();
}
SDA = 1;
return(~I2CClock());
}
/************************************************************
I2CReceiveByte: 从总线接收1 个字节,并返回该字节,不回送
该字节,不回送应答信号,主函数调用本函数
应保证SDA为1
************************************************************/
char I2CReceiveByte (void)
{
unsigned char I2CData = 0;
register unsigned char i;
for (i=0; i<8; i++)
{
I2CData <<= 1;
if (I2CClock())
I2CData++;
}
return(I2CData);
}
/************************************************************
I2CSendAck: 向I2C总线发送应答信号ACK
************************************************************/
void I2CSendAck(void)
{
SDA=0;
I2CClock();
SDA = 1;
}
/***********************************************************
I2CSendNotAck: 发送非应答信号到I2C总线
**********************************************************/
void I2CSendNotAck (void)
{
SDA = 1;
I2CClock();
}
/*********************************************************
WRBYTES: 读写RAM单元
参数:
Ramaddr: 指定的RAM单元地址
buf: 读写数据缓存区首地址
num: 从addr开始读写的数据字节个数
wr: 读写标志,1为主机读,0为主机写
**********************************************************/
void WRBYTES(unsigned masteraddr,unsigned char Ramaddr,unsigned char buf[],unsigned char num,bit wr)
{
unsigned char index;
EA = 0;
I2CInit();
I2CStart();
I2CSendByte(masteraddr);
I2CSendByte(Ramaddr);
if (wr==0)
{
for(index=0; index<num; index++)
{ I2CSendByte(buf[index]);
}
}
else if (wr==1)
{
I2CStart();
I2CSendByte(masteraddr|0x01);
for (index=0; index<num-1; index++)
{ SDA = 1;
buf[index] = I2CReceiveByte();
I2CSendAck ();
}
buf[index] = I2CReceiveByte();
I2CSendNotAck();
}
I2CStop();
EA = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -