以下图片引用自微信公众号:电路啊,电子设计联盟
一些低成本电子产品,例如电动牙刷和充电宝等,需要多个LED来显示设备状态,比如电池电量,就需要用到单片机的IO口了。
而这类产品为了节约成本,往往采用很廉价的单片机,几毛钱几分钱一片的那种,单片机引脚也很少,往往少于需要驱动的LED的数量。
那么这时单片机是如何来驱动LED的呢?
这里就引出了今天的话题: 查理复用 。
查理复用就是一种以少量引脚驱动多个LED的方式。
以电动牙刷为例:

这是这款电动牙刷的拆解图,可以看到,电路板上用的单片机,只有8个脚,却要控制1个按键、6个LED灯、1个震动的马达电机。
初看之下,GPIO应该是不够用的。单片机除去电源脚(正极)和GND脚(负极),只剩最多6个GPIO脚。那么是怎么做到够用的?
原来,经过巧妙的电路设计,这款电动牙刷实现了用3个GPIO控制6个LED灯,节省了GPIO。而剩下的3个IO口足以控制按键和电机了。
这个巧妙的电路如下:

6个LED灯为相同的型号,为方便查看,用红绿两种颜色区分两种不同的方向。
原理分析
1、当只有LED1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路)
电流只有在图中红色路径可以流动,其他路径是走不通的。

此时GPIO3为高阻态,不会有电流流入流出。所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。
2、当只有LED2亮起时,单片机各GPIO的状态如下:

3、当只有LED3亮起时,单片机各GPIO的状态如下:

4、当只有LED4亮起时,单片机各GPIO的状态如下:

5、当只有LED5亮起时,单片机各GPIO的状态如下:

6、当只有LED6亮起时,单片机各GPIO的状态如下:

将以上6个LED的亮灭状态汇集为一个真值表的形式:

这样就可以用用单片机的3个IO口的6组不同的状态来控制6个IO口的亮灭了。
如果要同时亮起两个以上的LED,怎么办?
交替点亮他们就行,只要交替切换的速度够快,由于人眼的视觉暂留效应,看起来就是同时亮起的。
下面总结了2个IO口、3个IO口、4个IO口分别的查理复用:
2个IO口:

3个IO口:

4个IO口:

