电子常识
或许很多初学者都会被移位算法迷惑,移位算法形如 (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
全部0条评论
快来发表一下你的评论吧 !