可是左移的表达式应该是: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那样能按位操作,所以每次都是操作整个寄存器?
|