在处理tm1637 的数码管控制代码中看到了以下代码
for(i=0;i<8;i++) //sent 8bit data
{
digitalWrite(Clkpin,LOW);
if(wr_data & 0x01)digitalWrite(Datapin,HIGH);//LSB first
else digitalWrite(Datapin,LOW);
wr_data >>= 1;
digitalWrite(Clkpin,HIGH);
}
对于上面两句代码不理解,于是就重新学习了一下:
if(wr_data & 0x01)digitalWrite(Datapin,HIGH);
wr_data >>= 1;
因为平常学习的语言都没有这么操作的,补习的结果才明白在arduino中(应该包括C和C++):
我们的运算符其实分为:
算术运算符、关系运算符、逻辑运算符、位运算符、混合运算符
平常用的比较多的就是前三,偶尔会有第5,对于位运算符用的比较少,偶尔会有些同学用来处理权限,而个人其实很少用到异或这种东西,而异或这种在PHP这种语言中它是逻辑运算符。
这个区分其实很重要,但是说回来位运算符。
我们有个数字 127,它的2进制八位码是
01111111
当它和0x01进行按位与(&)的位运算的时候,如下图
01111111
00000001
只有对应的两个二进制位都为1时,结果位才为1,所以127&0x01 的结果是
00000001
结果是1
也就是上面的wr_data & 0x01 位运算
而接下来的代码
wr_data >>= 1
这里面的>>= 是位运算符和混合运算符,它等效于
wr_data= wr_data>> 1
也就是把wr_data对应的值右移一位,左边用0填充。
于是原来的
01111111
变成了
00111111
在最上面的代码中由于循环了8次,等于说就把wr_data对应的值按照二进制从右第一位开始到最后一位同0x01进行了与的位计算,由于是和0x01也就是1进行的位计算,每次计算都能得到每一位的值。例如
01111111 00111111 00011111 。。。00000000
00000001 00000001 00000001 。。。00000001
1 1 1 .。。。0
按照顺序输出的就是1、1、1、1、1、1、1、0
通过8次循环执行下面的代码
wr_data & 0x01
wr_data >>= 1;
就把wr_data的十进制值对应的二进制值的每一位获取出来了。
然后再按照需要传入对应数码管的寄存器中,就完成了数码管的控制。
它这个给数码管的输出好像还是有问题,好像有专门的函数可以自动处理这个转换!