2840|2

8

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

编绎错误求助 [复制链接]

以下是我写的IIC总线的写字节子程序,但是编绎错误,显示如下

!E D:\AVR文件\PCF8591\8591.c(65): unrecognized statement
!E D:\AVR文件\PCF8591\8591.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;这种乍看时比较碍眼的代码。  详情 回复 发表于 2011-7-7 20:10
点赞 关注
 

回复
举报

2751

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
原帖由 hz_university 于 2011-7-7 17:43 发表
以下是我写的IIC总线的写字节子程序,但是编绎错误,显示如下
!E D:\AVR文件\PCF8591\8591.c(65): unrecognized statement!E D:\AVR文件\PCF8591\8591.c(66): syntax error; found `(' expecting `;'
 
#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;这种乍看时比较碍眼的代码。
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 David_Lee 的帖子

感谢你非常详细的解答,真的太感谢了。谢谢好心人,你是个高手
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表