⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 利用51和1602液晶屏读写EEPROM的内容,可以查看,修改,也可以发给PC的超级终端作为文件保存下来.
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -