移位算法
移位算法用于写出各个寄存器的使用状态,如:
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即是位7,1<<UCSZ1选择位2,1<<UCSZ0选择位1,整句话UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);的效果就是让UCSRC的位七,位二,位一为高,其他都为低,然后在数据手册里面你可以看到各个位的作用。UCSRC = (1<<7)|(1<<2)|(1<<1) 即UCSRC = 1000 0110
进阶思考:
1.对PORTB的第四位置高
PORTB |= (1 << 4)
2.用移位算法对AVR的PORTD的低四位循环拉低
for(i=0;i<4;i++)
{
PORTD&=(~(1<<i));
}