完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
很多初学者都会被移位算法迷惑,移位算法形如(1《《X)这样的形式,高手写程序时,习惯用移位算法来写出各个寄存器的使用。比如下面一段是AVR的USART 的初始化代码。
UCSRC =(1《《URSEL)|(1《《UCSZ1)|(1《《UCSZ0); UCSR0B =(1《《RXCIE)|(1《《TXCIE)|(1《《RXEN)|(1《《TXENRXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1 这样的写法对高手是福,这些代码里面说明了操作了寄存器的哪些位,能够看出它的操作的意义;对新手确是祸害,因为新手看不懂这样的程序。 回到开始的地方,解释一下,什么是移位算法: 如:A = (1《《2),1写成二进制就是00000001,这个一左移2位就是0000 0100,所以得到的数A为0000 0100,即0x04。 再如:B = (2《《4),2写成二进制就是00000010,这个一左移4位就是0010 0000,所以得到的数B为0010 0000,即0x20。 上面两个移位算法都是正确的,第一种写法,表示第三位为1其余都是0的数,数的时候是从0数起的,再比如(1《《0)表示的是00000001,(1《《7)表示的是10000000,但是第二种写法没有没有这种意义,移位也用于乘除法,左移一位乘以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 |
|
|
|
只有小组成员才能发言,加入小组>>
2562 浏览 0 评论
1159浏览 2评论
762浏览 1评论
515浏览 0评论
272浏览 0评论
454浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 23:15 , Processed in 2.311089 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号