專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

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

很多初學(xué)者都會被移位算法迷惑,移位算法形如(1<<X)這樣的形式,高手寫程序時,習(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

這樣的寫法對高手是福,這些代碼里面說明了操作了寄存器的哪些位,能夠看出它的操作的意義;對新手確是禍害,因?yàn)樾率挚床欢@樣的程序。


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

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

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

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


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

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

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

相關(guān)文章