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

📄 i2c.c

📁 I2C 总线C语言集锦包括,PIC单片机,51单片机,AVR单片机.
💻 C
字号:
#include <pic.h>
#include <pic1687x.h>
#define scl RB4
#define sda RB5
//**********************************//
void delay(unsigned char i);
void initialz(void);
void start(void);
void ack(void);
void no_ack(void);
void stop(void);
void write_data_byte(unsigned char w_data_byte);
void read_data_byte(void);
void write_address(unsigned char address);
void write(void);
void read(void);
//*********************************************************************************************//
//********短延时************//
void delay(unsigned char n)
{
	while(--n);
}
//********初始化I/0口及空闲状态*******//
void initialz(void)
{
	INTCON=0X00;
	TRISC=0X00;
	PORTC=0X00;
	TRISB4=0;
	TRISB5=0;
	scl=1;
		delay(1)
	sda=1;
		delay(1)
}
//********开始信号*******//
void start(void)
{
	sda=1;
		delay(1)
	scl=1;		//sda与此同时scl都为高状态为空闲//
		delay(1)
	sda=0;		//起始信号//
		delay(1)
	scl=0;		//准备发送及接收信号//
		delay(1)
}
//********应答信号,在第九个时钟周期把SDA拉低表示应答信号*****//
void ack(void)
{
	unsigned char i;
	scl=1;		
		delay(1)
	sda=1;
		delay(1)
	if((sda==1)&&(i<200))
	i++;
	scl=0;		
		delay(1)
}
//********没有应答信号,在第九个时钟周期把SDA拉低表示没有应答信号*****//
void no_ack(void)
{
	sda=1;		//起始信号//
		delay(1)
	scl=1;		
		delay(1)
	scl=0;		
		delay(1)
}
//***停止信号,时钟线保持高电平期间,数扰线电平从低到高的跳变****//
void stop(void)
{
	sda=0;		
		delay(1)
	scl=1;		
		delay(1)
	sda=1;		
		delay(1)
}
//*********写一个数据到I2C上*****************//
void write_data_byte(unsigned char w_data_byte)
{
	unsigned char i;
	w_data_byte=w_data_byte&0xff;
	for(i=8;i!=0;i--)
	{
		if(w_data_byte&0x80)
		{
			sda=1;		//数据送到总线上//
				delay(1)
			scl=1;		//使数据有效//
				delay(1)
			scl=0;		//准备接收//
				delay(1)
		
		}
		else
		{
			sda=0;		//数据送到总线上//
				delay(1)
			scl=1;		//使数据有效//
				delay(1)
			scl=0;		//准备接收//
				delay(1)
			
		}
		w_data_byte<<=1;
  }
}	
//****************读一个字节数据*************//
void read_data_byte(void)
{
	unsigned char i,read_data;
	read_data=0x00;
	TRISB5=1;
	scl=0;		//读入数据//
		delay(1)
	sda=1;
		delay(1)	
	for(i=8;i!=0;i--)
	{		
		scl=1;		//置时钟使数据有效//
			delay(1)
		read_data=(read_data<<1)|sda;
		scl=0;		//读入数据//
			delay(1)
	}
	PORTC=read_data;
}
//*********写命令地址到I2C上***************//
void write_address(unsigned char address)
{
	unsigned char i;
	address=address&0xff;
	for(i=8;i!=0;i--)
	{
		if(address&0x80)
		{
		
			scl=0;	//使数据有效//
				delay(1)
			sda=1;		//数据送到总线上//
			scl=1;	//准备接收//
				delay(1)	
		}
		else
		{
		
			scl=0;	//使数据有效//
			delay(1)
			sda=0;		//数据送到总线上//
			scl=1;//准备接收//
				delay(1)
		}
 		address<<=1;
	}
		scl=0;	//使数据有效//
			delay(1)
		sda=1;
			delay(1)
}
void write(void)
{
	unsigned char a,b,c;
	a=0xa0;
	b=0x03;
	c=0xb3;
	start();
	write_address(a);
	ack();
	write_address(b);
	ack();
	write_data_byte(c);
	ack();
	stop();
}
void read(void)	
{
	unsigned char d,e,f;
	d=0xa0;
	e=0x03;
	f=0xa1;
	start();
	write_address(d);
	ack();
	write_address(e);
	ack();
	start();	
   	write_address(f);
   	ack();
	read_data_byte();
	stop();
}
void main(void)
{
	while(1)
	{
		initialz();
		write();
		read();
	}
}

⌨️ 快捷键说明

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