今天写代码的时候再次用到了与或非等逻辑运算符来完成一些二进制处理应用,总结记录一下;
一、缘起
以下是一个显示板的原理图,由于LED数量较多,因此在LED控制方案的选择上是选用了一块串转并的芯片74HC595;
![]() |
|---|
对于74HC595的使用在这里就不再赘述;
74HC595串转并是转出8个输出端,再加上三个直接连接单片机引脚的COM端,理论上是可以很容易控制24个LED灯亮灭,就像是控制三个数码管一样,利用人眼的暂留现象,就可以使这24个LED灯的亮灭随意组合;
每一个COM端和8个LED组成一个组合,然后轮询点亮这三组LED,速度够快的话,就能看到三组LED被同时点亮;
二、解决
为了消除残影问题,在每一组的LED点亮后,应该马上写入使LED全部熄灭的命令,以消除可能会出现的残影问题;
首先定义三个uint8_t变量,例如代码中的LED_NUM1、LED_NUM2、LED_NUM3,然后通过控制COM端,分别向每组LED中写入这三个数据:
| 第一组 | COM引脚排布:100 | 待写入74HC595中的数据:LED_NUM1 |
|---|---|---|
| 第二组 | COM引脚排布:010 | 待写入74HC595中的数据:LED_NUM2 |
| 第三组 | COM引脚排布:001 | 待写入74HC595中的数据:LED_NUM3 |
然后对于每一个单独LED的控制,就需要用到逻辑运算,例如图中的LED1,其属于第三组LED,因为其控制COM引脚为COM3,
因而代码可以写为:
1 | //只点亮LED1,而不影响本组内其他LED的显示 |
其他的LED控制也是一样的道理;
可以提取出公式,如LED的编号为0~7,分别接在74HC595的Q0~Q1引脚上,设任意一引脚为n号引脚,则其控制代码为:
1 | //只点亮LEDn,而不影响本组内其他LED的显示 |
三、参考源码
具体的函数实现代码如下所示(包括74HC595芯片驱动以及LED控制函数):
1 | /*软件SPI调试正常 |
,
