📄 i2c.c
字号:
#include "i2c.h"
#include <intrins.h>
#include "w77e532.h"
/*SDA P4_2 SCL P4_3 WP P4_0*/
/*#define SDA P1_0
#define SCL P1_1
extern Uchar volatile xdata D12_Y5;
extern idata Uchar D18CS;//代替WP的作用*/
#define SDA_ON P4|=0x4//SDA=1
#define SDA_OFF P4&=0xb//SDA=0
//#define IIC_CLOCK_HIGH SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_()
//#define IIC_CLOCK_LOW SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_()
#define IIC_CLOCK_HIGH P4&=0x7;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P4|=0x8;_nop_();_nop_()
#define IIC_CLOCK_LOW P4|=0x8;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P4&=0x7;_nop_();_nop_()
unsigned char sda_equalzero()
{
char P4_reg;
P4_reg = P4;
P4_reg &= 0x4;
if (0 == P4_reg)
return 1;
else
return 0;
}
void i2c_wp(char flag)
{
if( flag )
//WP = 1;
P4 |= 0x1;
else
//WP = 0;
P4 &= 0xe;
}
/***************i2c起始位************************/
void i2c_start(void)
{
IIC_CLOCK_HIGH;
//SDA=1;
SDA_ON;
_nop_();
_nop_();
_nop_();
//SDA=0;
SDA_OFF;
_nop_();
_nop_();
IIC_CLOCK_LOW;
}
/***************i2c停止位********************/
void i2c_stop(void)
{
//SDA=0;
SDA_OFF;
_nop_();
_nop_();
IIC_CLOCK_HIGH;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
//SDA=1;
SDA_ON;
}
/***************i2c等应答函数******************/
char i2c_get_ack(void)
{
//SDA=1;
SDA_ON;
_nop_();
_nop_();
IIC_CLOCK_HIGH;
/* if( SDA == 0 )
{
IIC_CLOCK_LOW;
return OK;
}
else
{
IIC_CLOCK_LOW;
return ERROR;
} */
if( 1 == sda_equalzero() )
{
IIC_CLOCK_LOW;
return OK;
}
else
{
IIC_CLOCK_LOW;
return ERROR;
}
}
/*主机发应答,连续读数据用*/
void i2c_send_ack(void)
{
// SDA=0;
SDA_OFF;
_nop_();
IIC_CLOCK_LOW;
// SDA=1; /*释放总线给24C16*/
SDA_ON;
}
/*无需应答位 noack*/
void i2c_send_no_ack(void)
{
// SDA=1;
SDA_ON;
_nop_();
IIC_CLOCK_LOW;
}
/***************写i2c******************/
void i2c_writeByte(unsigned char dat)
{
char i;
unsigned char temp;
temp = dat;
for(i=0;i<8;i++)
{
if(temp & 0x80)
{
// SDA=1;
SDA_ON;
}
else
{
// SDA=0;
SDA_OFF;
}
temp <<= 1;
IIC_CLOCK_LOW;
}
}
/***************读i2c************************/
char i2c_readByte(void)
{
unsigned char dat;
unsigned char i;
i = 8;
dat = 0x00;
while(i--)
{
dat <<= 1;
IIC_CLOCK_HIGH;
// if(SDA)
if (0 == sda_equalzero())
dat |= 0x01;
}
IIC_CLOCK_LOW;
return dat;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -