欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

AVR移位算法詳細解釋 (1<
作者:liht1634   來源:轉自liht1634   點擊數:  更新時間:2014年07月28日   【字體:

很多初學者都會被移位算法迷惑,移位算法形如(1<<X)這樣的形式,高手寫程序時,習慣用移位算法來寫出各個寄存器的使用。比如下面一段是AVR 的USART 的初始化代碼。

 

UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1

這樣的寫法對高手是福,這些代碼里面說明了操作了寄存器的哪些位,能夠看出它的操作的意義;對新手確是禍害,因為新手看不懂這樣的程序。


回到開始的地方,解釋一下,什么是移位算法:

如:A = (1<<2),1寫成二進制就是0000 0001,這個一左移2位就是0000 0100,所以得到的數A為0000 0100,即0x04。

再如:B = (2<<4),2寫成二進制就是0000 0010,這個一左移4位就是0010 0000,所以得到的數B為0010 0000,即0x20。

上面兩個移位算法都是正確的,第一種寫法,表示第三位為1其余都是0的數,數的時候是從0數起的,再比如(1<<0)表示的是0000 0001,(1<<7)表示的是1000 0000,但是第二種寫法沒有沒有這種意義,移位也用于乘除法,左移一位乘以2,右移移位除以2,上面的第二種寫法2左移四位得到的數是2×2×2×2×2=32,也就是上面的0x20。


我們再來看上面的這句話:UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

UCSRC是一個和串口通訊有關的一個八位寄存器,他的每一位都有特殊的定義,我們通過查數據手冊可以看到,如下的內容。

我們在程序中包含的頭文件iom16v.h類似的文件會有#define URSEL 7 這樣的定義,1<<URSEL即是wei7,1<<UCSZ1選擇位2,1<<UCSZ0選擇位1,整句話UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);的效果就是讓UCSRC的位七,位二,位一為高,其他都為低,然后在數據手冊里面你可以看到各個位的作用。UCSRC = (1<<7)|(1<<2)|(1<<1) 即UCSRC = 1000 0110

相關文章