i2c.c

来自「利用51和1602液晶屏读写EEPROM的内容,可以查看,修改,也可以发给PC的」· C语言 代码 · 共 119 行

C
119
字号
#include "externh.h"
#define I2CDLY	2
void I2CStart(void);
void I2CStop(void);
void I2CAck(unsigned char ack);
void I2CTx(unsigned char ch);
unsigned char I2CRx(void);
void I2CSetReadAddr(I2CAddr_T Addr);
void I2CDelay(U8 ms)
{
	while(ms--);
}

void I2CStart(void)
{
	SetBit(I2CPort,SDA);  /*发送起始条件的数据信号*/
	SetBit(I2CPort,SCL);
	I2CDelay(I2CDLY);
	ClrBit(I2CPort,SDA);  /*发送起始信号*/
	I2CDelay(I2CDLY);
	I2CDelay(I2CDLY);
	ClrBit(I2CPort,SCL);  /*钳住I2C总线,准备发送或接收数据 */
}
void I2CStop(void)
{
	ClrBit(I2CPort,SDA);  /*发送结束条件的数据信号*/
	I2CDelay(I2CDLY);
	SetBit(I2CPort,SCL);  /*结束条件建立时间大于4μs*/
	I2CDelay(I2CDLY);
	I2CDelay(I2CDLY);
	SetBit(I2CPort,SDA);  /*发送I2C总线结束信号*/
}
void I2CAck(unsigned char ack)
{	
	ClrBit(I2CPort,SDA);
	if(ack) SetBit(I2CPort,SDA);
	I2CDelay(I2CDLY);
	SetBit(I2CPort,SCL);
	I2CDelay(I2CDLY);
	ClrBit(I2CPort,SCL);
}
void I2CTx(unsigned char ch)
{
	unsigned char i;
	for(i=0;i<8;i++){
		ClrBit(I2CPort,SCL);
		I2CDelay(I2CDLY);
		ClrBit(I2CPort,SDA);
		if(ch&0x80) SetBit(I2CPort,SDA);
		I2CDelay(I2CDLY);
		SetBit(I2CPort,SCL);
		I2CDelay(I2CDLY);
		ch <<=1;
	}
	ClrBit(I2CPort,SCL);
	I2CDelay(I2CDLY);

	SetBit(I2CPort,SDA);	//Set Input.
	I2CDelay(I2CDLY);
	SetBit(I2CPort,SCL);
	I2CDelay(I2CDLY);
	while(ChkBit(I2CPort,SDA));
	ClrBit(I2CPort,SCL);

}
unsigned char I2CRx(void)
{
	unsigned char i,ch;
	SetBit(I2CPort,SDA);
	i=0;
	for(i=0;i<8;i++){
		ClrBit(I2CPort,SCL);
		I2CDelay(I2CDLY);
		SetBit(I2CPort,SCL);
		I2CDelay(I2CDLY);
		ch <<=1;
		if(ChkBit(I2CPort,SDA)) ch |=0x01;
		ClrBit(I2CPort,SCL);		
	}
	ClrBit(I2CPort,SCL);
	return(ch);
}

void I2CReadStr(I2CAddr_T Addr,unsigned char *ptr,unsigned char num)
{
	U8 i;
	I2CStart();
	I2CTx(0xa0);
#if I2CSIZE>2	
	I2CTx(Addr/256);
#endif	
	I2CTx(Addr%256);
	I2CStart();	
	I2CTx(0xa1);
	for(i=0;i<num-1;i++){
		*ptr++=I2CRx();
		I2CAck(0);
	}
	*ptr=I2CRx();
	I2CAck(1);
	I2CStop();
}
void I2CWriteStr(I2CAddr_T Addr,unsigned char *ptr,unsigned char num)
{
	while(num--){
		I2CStart();
		I2CTx(0xa0);
#if I2CSIZE>2	
		I2CTx(Addr/256);
#endif	
		I2CTx(Addr%256);
		I2CTx(*ptr);
		I2CStop();		
		ptr++;
		Addr++;
		Delay(3);
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?