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

📄 i2c.c

📁 24c04读写程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
//#define	 unsigned char uchar
//#define  unsigned int uint
#define _Nop() _nop_()

bit     ack;
sbit	WP=P0^3;
sbit	SCL=P0^4;
sbit	SDA=P0^5;
sbit 	JK=P0^0;


void delay();
void start_i2c();
void stop_i2c();
void write_b(uchar);
char read_b();
void ack_i2c(bit a);
bit mcu_write_b(char sla,char c);
bit mcu_write_str(char sla,char suba,char *s,char no);
bit mcu_read_b(char sla,char *c);
bit mcu_read_str(char sla,char suba,char *s,char no);

char i2c_write_[10]={0,1,2,03,4,5,6,7,8,9};
char led_dm[10]={0x3f,0x03,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void main()
{	
	char i2c_rec[10];
	char i;
//	char *j;
	WP=0;//器件不进行写保护//
	JK=1;
	delay();
	delay();
	
	do
	{
		if(mcu_write_b(0xa0,0x01))
		JK=0;
		else 
		JK=1;
		delay();
		delay();
	//	JK=0;

	
	/*
		if(mcu_write_str(0xa1,0x10,i2c_write_,10))
			JK=1;
		else
			JK=0;
			delay();

		if(mcu_read_str(0xa0,0x10,i2c_rec,10))
			JK=0;
		else
			JK=1;
			delay();

		for(i=0;i<10;i++)
		{
			P2=0x00;
			P1=led_dm[i2c_rec[i]];
			delay();
			delay();

		}
		*/
  	}while(JK);

}


void start_i2c()//启动信号
{
	SDA=1;
	_Nop();
	SCL=1;
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	SDA=0;
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	SCL=0;
	_Nop();
	_Nop();

}

void stop_i2c()//停止信号
{
	SDA=0;
	_Nop();
	SCL=1;
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	SDA=1;
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
}

void write_b(char c)//发送一个字节到EEPROM
{
	char bitcnt;
	for(bitcnt=0;bitcnt<8;bitcnt++)
	{
		if((c<<bitcnt)&0x80)//判断数据位上是"1"还是"0"
		SDA=1;
		else
		SDA=0;
		_Nop();
		SCL=1;
		_Nop();
		_Nop();
		_Nop();
		_Nop();
		_Nop();
		SCL=0;
	}
	_Nop();
	_Nop();
	SDA=1;
	_Nop();
	_Nop();
	SCL=1;
	_Nop();
	_Nop();
	_Nop();
	if(SDA=1)ack=0;//判断EEPROM是否回复应答信号
	else ack=1;
	SCL=0;
	_Nop();
	_Nop();
	_Nop();
}

char read_b()//接受EEPROM发送过来的一个字节
{
	char retc;
	char bitcnt;
	retc=0;
	SDA=1;
	for(bitcnt=0;bitcnt<8;bitcnt++)
	{
		_Nop();
		SCL=0;
		_Nop();
		_Nop();
		_Nop();
		_Nop();
		_Nop();
		SCL=1;
		_Nop();
		_Nop();
		retc=retc<<1;
		if(SDA==1)retc=retc+1;
		_Nop();
		_Nop();
	}
	SCL=0;
	_Nop();
	_Nop();
	return(retc);
}


void ack_i2c(bit a)//发送应答信号或是非应答信号
{
	if(a==0)SDA=0;
	else SDA=1;
	_Nop();
	_Nop();
	_Nop();
	SCL=1;
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	_Nop();
	SCL=0;
	_Nop();
	_Nop();

}


bit mcu_write_b(char sla,char c)//向i2c器件中送入一字节
{
	start_i2c();
	write_b(sla);
	if(ack==0)return(0);
	write_b(c);
	if(ack==0)return(0);
	stop_i2c();
	return(1);
}


bit mcu_write_str(char sla,char suba,char *s,char no)//向i2c器件的指定地址中写入no个数据
{
	char i;
	start_i2c();
	write_b(sla);
	if(ack==0)return(0);
	write_b(suba);
	if(ack==0)return(0);
	for(i=0;i<no;i++)
	{
		write_b(*s);
		if(ack==0)return(0);
		s++;
	}
	stop_i2c();
	return(1);
}


bit mcu_read_b(char sla,char *c)//接收一个字节
{
	start_i2c();
	write_b(sla+1);
	if(ack==0)return(0);
	*c=read_b();
	ack_i2c(1);
	stop_i2c();
	return(1);
}


bit mcu_read_str(char sla,char suba,char *s,char no)//从器件的指定地址中读取no个数据
{
	char i;
	start_i2c();
	write_b(sla);
	if(ack==0)return(0);
	write_b(suba);
	if(ack==0)return(0);
	start_i2c();
	write_b(sla+1);
	if(ack==0)return(0);
	for(i=0;i<no-1;i++)
	{
		*s=read_b();
		ack_i2c();
		s++;
	}
	*s=read_b();
	ack_i2c(1);
	stop_i2c();
	return(1);
}





void delay()
{
	int i;
	for(i=10000;i>0;i--)
	{;}
}

⌨️ 快捷键说明

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