为了账号安全,请及时绑定邮箱和手机立即绑定

我觉得这个<<不代表移位操作,是什么意思还不懂。谁能给说明白点?

我觉得这个<<不代表移位操作,是什么意思还不懂。谁能给说明白点?

潇潇雨雨 2022-10-02 16:09:55
解释一下这两句:1) UCSR0A&(1<<UDRE0)2)value+=(8<<ADCH)说明:这个事avr单片机里的程序,<<不是移位运算么?但是上面两句看不大懂现在不管原始问题的第二问,只看第一个问题,第一个问题的全部代码是:1)void putc(char c){while(!UCSR0A&(1<<UDRE0))UDR0=c;}说明:UCSR0A是一个寄存器(8位,编号0-7),UDRE0是其中的第5位(bit5),我感觉的意思就是如果UDRE0是1的话,UDR0=c,但是上面那种表示搞不明白为什么。————————————————————————————————好吧,在说的详细点,1)代码就是一个简单的函数,UDR0是USART(也就是串口)数据寄存器,UCSR0A是USART的控制和状态寄存器,其中,bit-5是UDRE0,UDRE0的作用是标志发送缓冲器UDR0是否准备好接受。----------------------------------------------------------------我知道<<是移位操作,但是有一点不懂的是UDRE0是一位啊,也就是说要么是0要么是1那UCSR0A要么与0x1,要么与0x2,但是UCSR0A的最后两位并不是与此函数功能相关的位
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

ADCH应该是个宏,最终对应一个整数,
8<<ADCH可理解为把8乘了ADCH次2,再加到value里。
用移位来做乘2或者除以2操作比直接乘除快很多。

哦,这么回事呀。那么我猜是这样:
UCSR0A中的第UDRE0位表示发送缓冲器UDR0是否就绪。
因为函数名叫putc(我理解是向UDR0对应的设备输出一个字符)
while(!UCSR0A&(1<<UDRE0)持续的检查UDR0是否已经就绪了。
若就绪,就把字符c传入UDR0中(就是写入设备)

查看完整回答
反对 回复 2022-10-06
?
炎炎设计

TA贡献1808条经验 获得超4个赞

你给了这么多代码,不知道给你解释哪个
就按照你最初的问题解释吧
我没有做过AVR单片机,只是按照代码给你解释
(1)当UDRE0为0时 UCSR0A与上0x01
当UDRE0为1时 UCSR0A与上0x02,

(2)value=value+(0x08左移ADCH位的值)
比如ADCH为0时 (0x08左移ADCH位的值)是0x08
比如ADCH为1时 (0x08左移ADCH位的值)是0x10
比如ADCH为2时 (0x08左移ADCH位的值)是0x20


查看完整回答
反对 回复 2022-10-06
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

UCSR0A&(1<<UDRE0)
这一句的意思是如果UCSR0A的第UDRE0位为1的话,整句的结果就为UDRE0

查看完整回答
反对 回复 2022-10-06
  • 3 回答
  • 0 关注
  • 217 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号