编绎错误求助

2019-03-24 21:07发布

以下是我写的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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
David_Lee
1楼-- · 2019-03-25 07:22
原帖由 hz_university 于 2011-7-7 17:43 发表
以下是我写的IIC总线的写字节子程序,但是编绎错误,显示如下
!E D:AVR文件PCF85918591.c(65): unrecognized statement!E D:AVR文件PCF85918591.c(66): syntax error; found `(' expecting `;'
&nbsp;
#def ...


#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;这种乍看时比较碍眼的代码。
hz_university
2楼-- · 2019-03-25 10:59
感谢你非常详细的解答,真的太感谢了。谢谢好心人,你是个高手

一周热门 更多>