以下是我写的IIC总线的写字节子程序,但是编绎错误,显示如下
!E D:AVR文件PCF85918591.c(65): unrecognized statement
!E D:AVR文件PCF85918591.c(66): syntax error; found `(' expecting `;'
#define uchar unsigned char
#define sda PORTB|=BIT(4);
#define scl PORTB|=BIT(3);
#define clr_sda PORTB&=~BIT(4);
#define clr_scl PORTB&=~BIT(3);
void write_byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
if(temp&0x80)
sda;
else
clr_sda;
scl;
delay(5);
temp<<=1;
clr_scl;
delay(5);
}
}
当我把sda与clr_sda分别用定义的
PORTB|=BIT(4);
PORTB&=~BIT(4);
代替时,错误就没有了。我想问的是,难道定义的sda,clr_sda不对吗?
我是参考的别人的程序才这样定义的。
[
本帖最后由 hz_university 于 2011-7-7 17:45 编辑 ]
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#define实现的是语句的替换,#define sda PORTB|=BIT(4);这条语句的作用是下面的程序中,出现sda的地方,都用PORTB|=BIT(4);来替换掉,也包含了它后面的那个分号。
所以,当你用下面的方式使用sda那些的时候:
if(temp&0x80)
sda;
else
clr_sda;
你的程序将被替换为:
if(temp&0x80)
PORTB|=BIT(4);;
else
PORTB&=~BIT(4);;
显然,上面语句后面是有两个分号的,也就是说if后面是有两条语句,后面一条为空语句,而if和else之间是只能有一条语句或一个程序段(程序段需要用大括号括起来),所以会报错。
平时写代码应该养成习惯:
if(条件)
{
语句;
}
else
{
语句;
}
所以,你的程序修改为下面形式,就不会报错了:
if(temp&0x80)
{
sda;
}
或者更改宏定义部分为:
#define sda PORTB|=BIT(4)
按照我个人的习惯,我常定义为:
#define sda() PORTB|=BIT(4)
调用形式为:
sda();
这样调用的时候,才不会出现多了一个分号,以致多了一条空语句,也不会出现sda;这种乍看时比较碍眼的代码。
一周热门 更多>