使用IO口模拟IIC来控制PCF 下载本文

内容发布更新时间 : 2024/12/29 14:11:29星期一 下面是文章的全部内容请认真阅读。

如有你有帮助,请购买下载,谢谢!

/**********延时函数*****************/ /*----------------------------------------------- delay_us :1us延时函数

------------------------------------------------*/ void delay_us(void) {

asm(\}

/*----------------------------------------------- delay_nus :长延时函数 输入参数: t :延时时间 us

------------------------------------------------*/ void delay_nus(unsigned int t) {

while(t--) delay_us(); }

/*---------------------------------------------- delay_ms :1ms延时函数

-----------------------------------------------*/ void delay_ms(void) {

unsigned int i;

for(i=0;i<1140;i++); }

/*---------------------------------------------- delay_nms :长延时函数 输入参数: t :延时时间 ms -----------------------------------------------*/ void delay_nms(unsigned int t) {

while(t--) delay_ms(); }

#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);

1如有你有帮助,请购买下载,谢谢!

}

//iic起始信号 void iic_start(void) {

delay_nus(20); sda_h;

delay_nus(20); scl_h;

delay_nus(20); sda_l;

delay_nus(20); scl_l;

delay_nus(20); }

//iic停止信号 void iic_stop(void) {

delay_nus(20); sda_l;

delay_nus(20); scl_h;

delay_nus(20); sda_h;

delay_nus(20); }

//输出ack

void wack(unsigned char a) {

delay_nus(20); if(a) sda_l; else sda_h;

delay_nus(20); scl_h;

delay_nus(20); scl_l;

delay_nus(20); }

//i2c读写调用的函数

//把一个字节数据输入器件,并以收到应答信号为止 //写入成功返回1,失败返回0

unsigned char write_iic_byte(unsigned char byte) {

2页

unsigned char i; for(i=0;i<8;i++) {

delay_nus(20); if(byte&0x80) sda_h; else sda_l;

delay_nus(20); scl_h;

delay_nus(20); scl_l;

byte=byte<<1; }

DDRC&=~BIT(sda); delay_nus(20); sda_h;

delay_nus(20); scl_h;

delay_nus(20); scl_l;

delay_nus(20); if(PINC&BIT(sda)) i=1; else i=0;

delay_nus(20); scl_l;

delay_nus(20); DDRC|=BIT(sda); return i; }

//i2c读要调用的函数 //从器件读出一个字节

unsigned char read_iic_byte(void) {

unsigned char i,buff=0; DDRC&=~BIT(sda); delay_nus(20); sda_h;

for(i=0;i<8;i++) {

buff=buff<<1; delay_nus(20);

如有你有帮助,请购买下载,谢谢!

3页