AVR单片机里异步串行通信,这句是什么意思:UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0)
请高手详细讲解。。。三个或都讲一下~~~还有为什么步直接赋初值UCSRC=0x86啊,多简单这里面的UCSZ0UPM0URSEL数值是多少是他们的初值还是什么?...
请高手详细讲解。。。
三个或都讲一下~~~
还有为什么步直接赋初值UCSRC=0x86啊,多简单
这里面的UCSZ0 UPM0 URSEL 数值是多少
是他们的初值还是什么? 展开
三个或都讲一下~~~
还有为什么步直接赋初值UCSRC=0x86啊,多简单
这里面的UCSZ0 UPM0 URSEL 数值是多少
是他们的初值还是什么? 展开
2个回答
展开全部
这个几个单词都是有define宏定义的,确实代表了几个数字,在头文件里有,ctrl+f自行搜索一下即可找到。你要是懒得找,我告诉你也行,他其实就是按照某位实际存在的位来定义的,例如UPM0位于bit4,那么头文件里肯定有#define UPM0 4,以此类推。
你问为什么不直接赋值,而通过这种貌似“复杂”的方式?
我来给你说下,举个例子,比如你打算把UCSZ1 、UCSZ0设为1、1(也即UCSZ=3,你懂得)其他全部设0(即0000 0110),那么就应该有UCSRC=0x06.
反过来,当你看到0x06这个数值的时候,你能一下子反应过来,知道UCSZ=3吗,我觉得很难做到。
但是那种“麻烦”的方式却能让读者一目了然就知道UCSRC的设定情况,比如
UCSRS=(3<<UCSZ0)。
实质就是UCSRS=(3<<1)=0000 0110。(因为UCSZ0位于bit1,因此UCSZ0就=1)
这种方式对于URSEL、UPM等等的设定非常重要,当你想要更改UCSRC寄存器设定的时候,你会发现,这种方式非常直观,而不必每次都去“计算或者口算或者心算”他们对应的16进制数
自己体会一下
你问为什么不直接赋值,而通过这种貌似“复杂”的方式?
我来给你说下,举个例子,比如你打算把UCSZ1 、UCSZ0设为1、1(也即UCSZ=3,你懂得)其他全部设0(即0000 0110),那么就应该有UCSRC=0x06.
反过来,当你看到0x06这个数值的时候,你能一下子反应过来,知道UCSZ=3吗,我觉得很难做到。
但是那种“麻烦”的方式却能让读者一目了然就知道UCSRC的设定情况,比如
UCSRS=(3<<UCSZ0)。
实质就是UCSRS=(3<<1)=0000 0110。(因为UCSZ0位于bit1,因此UCSZ0就=1)
这种方式对于URSEL、UPM等等的设定非常重要,当你想要更改UCSRC寄存器设定的时候,你会发现,这种方式非常直观,而不必每次都去“计算或者口算或者心算”他们对应的16进制数
自己体会一下
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询