分析到底是或运算左边的错误还是右边的错误
调试过程:
(1)注释掉右边的电池状态灯效,看档位灯是否正常
结果:档位灯正常显示,D10没有暗淡下来
(2)注释掉左边的档位灯灯效,看电池状态灯效是否正常
结果:电池状态灯正常显示。
(3)不注释,看看效果
结果:电池状态灯正常显示,档位灯显示异常,D10暗淡下来
临时结论:问题出在右边的bast身上,亦或者说,排除了或运算左边的错误,剩下的部分都是问题怀疑范围
(1)尝试点亮所有的16个灯 LED = 0xffff;
结果:电池状态灯显示不了16个灯,只能显示15个灯,D19不亮
临时结论:D19出现问题
(2)因为D19和D20的底层实现引脚相似,所以更换两灯的实现逻辑,希望是D20不亮,D19亮
结果:D19不亮,D20亮
临时结论:跟底层实现无关
(3)经过数数,我发现有17个灯,0xffff确实只能点亮16个灯,也显示了16个灯,是我的错误。
(1)led = 0x1ffff;应该全亮
结果:全亮,D10暗淡
(2)led = 0x10000;应该单亮D19
结果:显示D19,D20
需要找到原因为什么D19不能单独点亮、
(3)led = 0x8000;应该单亮D20
结果:显示D20
(4)更换D19和D20的底层实现逻辑,配合led = 0x8000,应该亮D19
结果:显示D20
找不出来,调试这些地方感觉我使错劲了。最后我发现是我led扫描忘记加了一个break退出,现在可以全灯正常点亮了,但是单独点亮D19还是会亮D19和D20。但是暂时还没爆出太大的问题。
补充知识(重要):
1<<15-> 0b 1000 0000 0000 0000->0x8000
1左移15位:1的屁股后面跟了15个0
记住1248,2进制最左边的1代表的是16进制的8,
~ 4
~ 2
2进制最右边的1代表的是16进制的1
eg:
1<<1 => 0b 0000 0000 0000 0010 =>0x0002
1<<2 => 0b 0000 0000 0000 0100 => 0x0004
1<<5 => 0b 0000 0000 0010 0000 => 0x0020
1<<8 => 0b 0000 0001 0000 0000 => 0x0100
1<<11 => 0b 0000 1000 0000 0000 => 0x0800
1<<16 => ob 0001 0000 0000 0000 0000 =>0x 0001 0000
注意:当你的有17个灯要点亮的时候,如果你定义的led变量是unsigned int类型,那么很可能会出现错误,因为int类型只能保存16位,而要点亮第17个灯,需要把1左移17位,超过了16位,很可能会被覆盖