打印
[AVR单片机]

这个语句怎么解释?

[复制链接]
1948|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
彪哥|  楼主 | 2008-5-31 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
while(!(UCSRA & (1<<UDRE)));
    该语句是等待串口发送缓冲器置位,置位后表示准备就绪,可以发送下一帧数据。
我不明白的是这个寄存器(UCSRA)是不是不能按位操作?所以才这样判断?这种格式的判断哪位老师能帮我解释一下吗?我在C语言的书上查不到啊。

相关帖子

沙发
computer00| | 2008-5-31 22:50 | 只看该作者

UCSRA是一个寄存器。&是按位与操作,<<是左移,UDRE是个常数

它表示哪个位。最后的结果就是:UCSRA中的UDRE被保留,其它位都被清0

使用特权

评论回复
板凳
彪哥|  楼主 | 2008-5-31 23:14 | 只看该作者

再问圈圈

    
    可是左移的表达式应该是:UDRE<<1呀, 
    如果UDRE是个uchar型,这么写表示UDRE的值左移一位,右面补零。可现在UDRE是UCSRA 寄存器中的一个位呀?移位操作也能适用于一位数的操作吗?如果适用就等于把UDRE位清零对吗?那干嘛非要这么麻烦?
直接用while(!(UCSRA & 0xDF))不就行了吗?(注:UDRE是UCSRA中的bit.5位,将其屏蔽)
为什么要这么写  while(!(UCSRA & (1<<UDRE))); 
 
再有,我发现写avr的程序好多都用这种写法,
例如,UCSRC = (1<<UCSRC)|(1<<UCSZ1)|(1<<UCSZ0);不明白为什么。是不是因为avr的寄存器都不像51那样能按位操作,所以每次都是操作整个寄存器?

使用特权

评论回复
地板
taoest| | 2008-5-31 23:27 | 只看该作者

UDRE

是一个宏定义。表示是第几位。是一个0~7之间的整数。
用1<<UDRE是正确的。 

标准C语言是支持位操作的,你不用管AVR的寄存器是否支持位操作。你按照c的规范来写,编译器会给你搞定。这是高级语言的优势之一。

使用特权

评论回复
5
taoest| | 2008-5-31 23:31 | 只看该作者

while(!(UCSRA & 0xDF))

while(!(UCSRA & 0xDF)) 没问题。但是以后你看程序的时候,要查资料才知道这句起什么作用。如果用while(!(UCSRA & (1<<UDRE))),一看就知道是检测UDRE位。方便易读,还不容易写错。 1<<UDRE 就是 1<<5 

使用特权

评论回复
6
彪哥|  楼主 | 2008-5-31 23:33 | 只看该作者

继续问

    啊?!!!UDRE怎么能等于5呀?他不是UCSRA中的第5位吗?一个位变量啊,只能是1或者0 啊?晕了!

使用特权

评论回复
7
computer00| | 2008-5-31 23:58 | 只看该作者

晕...都说了UDRE是一个常数呀,如果它是第五位,就是5了。

你可以去找找它的定义,它就是一个宏定义,
#define UDRE 5

然后1<<UDRE展开就是1<<5,结果就是把1左移5位,结果就是0x20.

然后再跟UCSRA来与,就是取出了第五位。

使用特权

评论回复
8
彪哥|  楼主 | 2008-6-1 00:04 | 只看该作者

我没看头文件

    谢谢两位老师!但我还要问,这个语句能不能像C51那样很简单的写?就是这样:while(!UDRE);行吗?这样岂不是更简单、明了?

使用特权

评论回复
9
computer00| | 2008-6-1 02:07 | 只看该作者

也可以啊,那你得先改改这个宏定义了:

#define UDRE (UCSRA & (1<<5))

而不是库中自带头文件中的#define UDRE 5

使用特权

评论回复
10
彪哥|  楼主 | 2008-6-1 12:05 | 只看该作者

再问圈圈

    while();语句应该是判断括号中的表达式的值呀,真则执行,否则跳出。
可这个语句 while(!(UCSRA & (1<<UDRE)));  的结果是将UCSRA取反之后再判断,可UCSRA是一个字节呀,字节有真、假之说吗?

使用特权

评论回复
11
computer00| | 2008-6-1 13:56 | 只看该作者

有。只要是整数,就可以。0即为假,非0为真。

C语言里没有真正的逻辑变量。通常都是用char,int等来代替的。

使用特权

评论回复
12
彪哥|  楼主 | 2008-6-1 20:24 | 只看该作者

再次谢谢圈圈

都明白了,我有几个概念弄混了。呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

171

帖子

1

粉丝