求助:ATmega88程序问题

[复制链接]
2758|7
 楼主| 神之胡之 发表于 2012-3-27 22:37 | 显示全部楼层 |阅读模式
我在看别人写的一段程序,有个地方看不懂,他用得是ATmega88单片机。
程序如下:

#define CTL_HI (!(ACSR & (1<<ACO)))

其中ACSR是模拟比较器的寄存器,ACO是该寄存器的某一位,用作比较器的输出
我的问题是:1<<ACO是什么意思?<<是移位运算符吗?作用是ACO左移一位吗?
c语言里做一不是都写作a<<1吗?
dqyubsh 发表于 2012-3-28 00:23 | 显示全部楼层
写的这么别扭,无非是将ACSR寄存器中的ACO位置1或者清0。

GCC有个_BK宏,建议用这类标准写法比较瓷实。
dqyubsh 发表于 2012-3-28 00:46 | 显示全部楼层
而且,我认为这个代码似是而非,这个作者简直了。。。

LZ说说这个代码哪来的,
lbygtwx 发表于 2012-3-28 10:22 | 显示全部楼层
你看头文件里,会有#define  ACO      5。
1<<ACO相当于1<<5。
(!(ACSR & (1<<ACO)))相当于(!(ACSR & (1<<5))),也相当于(!(ACSR & (0x20))),
(ACSR & (1<<ACO))就是想判断ACO这位是1还是0.
 楼主| 神之胡之 发表于 2012-3-28 16:04 | 显示全部楼层
谢谢楼上两位的指点,你们说的对
简单地说1<<ACO就是让ACO位置1
display8989 发表于 2012-3-28 16:27 | 显示全部楼层
确实挺别扭的
dqyubsh 发表于 2012-3-30 18:54 | 显示全部楼层
不仅写的别扭,还是错的。两个字:浮躁。
qq65411253 发表于 2012-3-30 19:05 | 显示全部楼层
这样写是为了保证兼容性,虽然“1<<ACO相当于1<<5。”,但是后者换了芯片或修改程序时会给作者带来**烦。而前者则不用改动一个字节,最差最坏的情况下也就是改一下头文件而已。

评分

参与人数 1威望 +1 收起 理由
神之胡之 + 1 原来如此

查看全部评分

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

本版积分规则

0

主题

23

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部