芯海点灯问题调试1

分析到底是或运算左边的错误还是右边的错误

调试过程:

(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位,很可能会被覆盖

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值