打印

求助:ATmega88程序问题

[复制链接]
2009|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.

使用特权

评论回复
5
神之胡之|  楼主 | 2012-3-28 16:04 | 只看该作者
谢谢楼上两位的指点,你们说的对
简单地说1<<ACO就是让ACO位置1

使用特权

评论回复
6
display8989| | 2012-3-28 16:27 | 只看该作者
确实挺别扭的

使用特权

评论回复
7
dqyubsh| | 2012-3-30 18:54 | 只看该作者
不仅写的别扭,还是错的。两个字:浮躁。

使用特权

评论回复
8
qq65411253| | 2012-3-30 19:05 | 只看该作者
这样写是为了保证兼容性,虽然“1<<ACO相当于1<<5。”,但是后者换了芯片或修改程序时会给作者带来**烦。而前者则不用改动一个字节,最差最坏的情况下也就是改一下头文件而已。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
神之胡之 + 1 原来如此
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

23

帖子

1

粉丝