使用IO口模拟IIC来控制24c
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**********延时函数*****************/ /*----------------------------------------------- delay_us :1us延时函数
------------------------------------------------*/ void delay_1us(void)
{
asm("nop");
}
/*----------------------------------------------- delay_nus :长延时函数
输入参数: t :延时时间us
------------------------------------------------*/ void delay_us(unsigned int t)
{
while(t--)
delay_1us();
}
/*---------------------------------------------- delay_ms :1ms延时函数
-----------------------------------------------*/ void delay_1ms(void)
{
unsigned int i;
for(i=0;i<1140;i++);
}
/*---------------------------------------------- delay_nms :长延时函数
输入参数: t :延时时间ms
-----------------------------------------------*/ void delay_ms(unsigned int t)
{
while(t--)
delay_1ms();
}
/*typedef union reccnt
{
unsigned int rcnt;
unsigned char rcntl[2];
}LngToChar;*/
#define sda PC1
#define scl PC0
#define sda_h PORTC|=BIT(sda)
#define sda_l PORTC&=~BIT(sda)
#define scl_h PORTC|=BIT(scl)
#define scl_l PORTC&=~BIT(scl) void iic_init(void)
{
DDRC|=BIT(scl)|BIT(sda); PORTC|=BIT(scl)|BIT(sda);
}
//iic起始信号
void iic_start(void)
{
delay_us(20);
sda_h;
delay_us(20);
scl_h;
delay_us(20);
sda_l;
delay_us(20);
scl_l;
delay_us(20);
}
//iic停止信号
void iic_stop(void)
{
delay_us(20);
sda_l;
delay_us(20);
scl_h;
delay_us(20);
sda_h;
delay_us(20);
}
//输出ack
void wack(unsigned char a)
{
delay_us(20);
if(a)
sda_l;
else
sda_h;
delay_us(20);
scl_h;
delay_us(20);
scl_l;
delay_us(20);
}
//i2c读写调用的函数
//把一个字节数据输入器件,并以收到应答信号为止//写入成功返回1,失败返回0
unsigned char write_iic_byte(unsigned char byte) {
unsigned char i;
for(i=0;i<8;i++)
{
delay_us(20);
if(byte&0x80)
sda_h;
else
sda_l;
delay_us(20);
scl_h;
delay_us(20);
scl_l;
byte=byte<<1;
}
DDRC&=~BIT(sda);
delay_us(20);
sda_h;
delay_us(20);
scl_h;
delay_us(20);
scl_l;
delay_us(20);
if(PINC&BIT(sda))
i=1;
else
i=0;
delay_us(20);
scl_l;
delay_us(20);
DDRC|=BIT(sda);
return i;
}
//i2c读要调用的函数
//从器件读出一个字节
unsigned char read_iic_byte(void)
{
unsigned char i,buff=0;
DDRC&=~BIT(sda);
delay_us(20);