📄 i2c.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 + -