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

📄 i2c.c

📁 单片机
💻 C
字号:
#include <reg52.h>
#include "lyj.h"
#include "I2C.h"

#ifdef I2C_SUPPORT
#define t_lp_n 2                //I2C 读写单步延时
                                //22.1184MHZ时,12机械周期情况下,t_lp_n  =2可用
#define I2C_WRITE_DELAY 250	//I2C 写完需要一个10ms的延时;应根据晶体的震荡频率适当调节
                                //22.1184MHZ时,12机械周期情况下,I2C_WRITE_DELAY =250可用
sbit I2C_SCL = P1^0;
sbit I2C_SDA = P1^1;
//sbit I2C_WP  = P3^5;

void t_lp(UINT i)
{
	UINT j;
	for(j = 0 ; j< i ; j++);
}
//I2C START 过程
void I2C_START()
{
	I2C_SCL = 0;
	t_lp(t_lp_n);
	I2C_SDA = 1;
	t_lp(t_lp_n);
	I2C_SCL = 1;
	t_lp(t_lp_n);
	I2C_SDA = 0;
	t_lp(t_lp_n);
	I2C_SCL = 0;  
	t_lp(t_lp_n);
}
//I2C stop 过程
void I2C_STOP()
{
	I2C_SCL = 0;
	t_lp(t_lp_n);
	I2C_SDA = 0;
	t_lp(t_lp_n);
	I2C_SCL = 1;
	t_lp(t_lp_n);
	I2C_SDA = 1;
	t_lp(t_lp_n);
}

void I2C_CK()
{
	I2C_SCL = 0;
	t_lp(t_lp_n);
	I2C_SCL = 1;
	t_lp(t_lp_n);
	I2C_SCL = 0; 
	t_lp(t_lp_n);
}
 
bit I2C_OUT(UCHAR i2c_sda_out)
{ 
	UCHAR i; 
	bit j;   
	for(i=0;i<8;i++)
	{	    
		I2C_SDA = (i2c_sda_out << i)&0x80;
		I2C_CK();
	}  
	I2C_SCL = 0;
	t_lp(t_lp_n);
	I2C_SCL = 1;
	t_lp(t_lp_n);
	j = I2C_SDA;
	I2C_SCL = 0;
	t_lp(t_lp_n);
	return j;  
}

UCHAR I2C_IN()
{ 
	UCHAR i; 
	UCHAR j;   
	for(i=0;i<8;i++)
	{
		I2C_SCL = 0;
		t_lp(t_lp_n);
		I2C_SCL = 1;
		t_lp(t_lp_n); 
		
		if (I2C_SDA == 1) 
			j = (j<<1) | 0x01;
		else
			j = j<<1 ;
	
		I2C_SCL = 0;
		t_lp(t_lp_n); 
	}
	I2C_SDA = 1;
	I2C_SCL = 0;
	t_lp(t_lp_n);
	I2C_SDA = 1;
	t_lp(t_lp_n);
	I2C_SCL = 1;
	t_lp(t_lp_n);
	I2C_SCL = 0;
	t_lp(t_lp_n);
	I2C_SDA = 0;
	t_lp(t_lp_n);
	I2C_STOP();
	return j;  
}


//I2C字节写函数,device_address器件级联地址,本硬件没有级联;word_address要写得字节的存储地址;I2C_DATA要向I2C内写的字节数据
//写成功返回1,失败返回0
UCHAR I2C_WRITE(UCHAR device_address,UCHAR word_address,UCHAR I2C_DATA)
{
	UCHAR i = 0;
	device_address = ((device_address & 0x07) << 1) | 0xa0;
//	I2C_WP= 0;
	while(i<3)
	{
		I2C_START();
		if (I2C_OUT(device_address) == 1) 
		{ 
			i++;
			continue	;
		}
		
		if (I2C_OUT(word_address) == 1) 
		{ 
			i++;
			continue	;
		}
		
		if (I2C_OUT(I2C_DATA) == 1) 
		{ 
			i++;
			continue	;
		}
		else 
		{
			I2C_STOP();
			t_lp(I2C_WRITE_DELAY) ; 
//			           I2C_WP= 1;    
			return 1;
		}	 
	}
	return 0;
}


//I2C字节读函数device_address器件级联地址,本硬件没有级联;word_address要读得字节的存储地址。
//直接返回要读的地址值.
UCHAR I2C_READ(UCHAR device_address,UCHAR word_address)
{
	UCHAR i = 0;
	device_address = ((device_address & 0x07) << 1) | 0xa0;
	while(i<3)
	{
		I2C_START();      
		if (I2C_OUT(device_address) == 1) 
		{ 
			i++;
			continue	;
		}
		
		if(I2C_OUT(word_address) == 1)
		{ 
			i++;
			continue ;
		}
	 
		I2C_START();      
		if (I2C_OUT(device_address | 0x01) == 1) 
        { 
		  i++;
		  continue	;
		}

		return I2C_IN();		 
	}
	return 0; 
}

void saveConfig()
{
	I2C_WRITE( 0, 0, scanshu.hanghead ); //起始横坐标
	I2C_WRITE( 0, 1, scanshu.liehead );  //起始纵坐标
	I2C_WRITE( 0, 2, scanshu.wide );  //标签宽度  
	I2C_WRITE( 0, 3, scanshu.painum ); //打印排数
	I2C_WRITE( 0, 4, scanshu.type  );  //条码类型
	I2C_WRITE( 0, 5, scanshu.comm ); //输出串口
}
void restoreConfig()
{
	scanshu.hanghead = I2C_READ(0, 0);   //起始横坐标 
	scanshu.liehead = I2C_READ(0, 1);     //起始纵坐标
	scanshu.wide = I2C_READ(0, 2);        //标签宽度       
	scanshu.painum = I2C_READ(0, 3);    //打印排数
	scanshu.type = I2C_READ(0, 4);        //条码类型
	scanshu.comm = I2C_READ(0, 5);     //输出串口
}

#endif

⌨️ 快捷键说明

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