说明:
在Mega8学习笔记(10.1)里我会用采用CVAVR自带的I2C系统函数写24C02
在Mega8学习笔记(10.2)里我会用像51单片机那样写24C02的方法来写i2c
在Mega8学习笔记(10.3)里我会用avr单片机独特的方式写24C02
以上三种方法均是IO口模拟I2C
以下就是用avr单片机独特的方式写24C02,就是用IO口方向的改变来是IO口的电平产生相应的变化,scl和sda两线上要有4k7到10k的上拉电阻,在程序中有两处 //***********注意************
第一处:要注意优先级
第二处:要注意位移的次数,不要多移哦
现象和(10.1)一样,注释省略
#i nclude <mega8.h>
#i nclude <delay.h>
#define u8 unsigned char
#define SCL DDRC.4
#define SDA DDRC.5
#define SCL_INPUT PINC.4
#define SDA_INPUT PINC.5
#define SCL_OUTPUT PORTC.4
#define SDA_OUTPUT PORTC.5
//带2us的延时等待稳定
#define SCL_HIGHT SCL=0 ;delay_us(2);
#define SCL_LOW SCL=1 ;delay_us(2);
#define SDA_HIGHT SDA=0 ;delay_us(2);
#define SDA_LOW SDA=1 ;delay_us(2);
void init(void)
{
ACSR=0x80;
PORTB=0XFF;
DDRB=0XFF;
SCL_OUTPUT=0;
SDA_OUTPUT=0;
SCL_LOW;
SDA_LOW;
}
void start(void)
{
SDA_HIGHT;
SCL_HIGHT;
SDA_LOW;
SCL_LOW;
}
u8 rece_ack(void)
{
u8 n;
SDA_HIGHT;
SCL_HIGHT;
if(SDA_INPUT==1)
{
n=1;
}
else
{
n=0;
}
SCL_LOW;
return n;
}
void write(u8 w_data)
{
u8 i;
for(i=0;i<=7;i++)
{
if( (w_data&0x80) ==0x80) //**********注意***********
{
SDA_HIGHT;
}
else
{
SDA_LOW;
}
w_data<<=1;
SCL_HIGHT;
SCL_LOW;
}
while( rece_ack() )
{
;
}
}
void stop (void)
{
SDA_LOW;
SCL_HIGHT;
SDA_HIGHT;
}
由于博客文章字数的限制,我将在Mega8学习笔记(10.3.2) 中继续写此文章