×
单片机 > 单片机程序设计 > 详情

avr移位算法详解

发布时间:2021-07-30 发布时间:
|

  或许很多初学者都会被移位算法迷惑,移位算法形如 (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&TImes;2&TImes;2&TImes;2&TImes;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

关键字:avr  移位算法  寄存器

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计