使用IO口模拟IIC来控制24c

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档