查理复用是一种利用单片机 GPIO 三态特性,实现少量 IO 口驱动超多 LED的实用方案。其核心是利用 GPIO 的三种状态:输出高电平、输出低电平、高阻输入,用 n 个 GPIO 最多可以驱动 n×(n−1) 个 LED,相比传统点阵方式能大幅节省引脚,非常适合驱动数码管、LED 矩阵等场景。
举例:
- 3 个 GPIO → 最多驱动 6 个 LED4 个 GPIO → 最多驱动 12 个 LED
一、查理复用核心原理
电路上,LED 需要两两反向并联,即一组两个 LED 方向相反地接在任意两个 GPIO 之间。
工作逻辑:
任意两个 GPIO,一个输出高、一个输出低 → 形成电流回路,点亮对应方向的一颗 LED其余 GPIO 全部设置为高阻输入模式,不参与驱动、不产生干扰无有效回路时,LED 熄灭,基本无串扰
二、引脚与 LED 数量关系
最大可驱动 LED 数量公式:
最大 LED 数量 = GPIO 数量 × (GPIO 数量 − 1)
- 3 个 IO:3×2 = 6 个 LED4 个 IO:4×3 = 12 个 LED5 个 IO:5×4 = 20 个 LED
在消费类电子产品设计中,经常会遇到单片机 IO 资源紧张、不够驱动 LED 的问题。而查理复用正是利用 IO 口双向推挽驱动 LED 的特性,在相同引脚数量下点亮更多 LED,理论上 N 个 IO 即可驱动 N×(N−1) 个 LED。
下面从简单到复杂,一步步说明原理:
1)2 个 IO 驱动 2 个 LED
两个 LED 反向并联,红色 LED 阳极接绿色 LED 阴极。
- IO1 高、IO2 低 → 点亮红色 LEDIO1 低、IO2 高 → 点亮绿色 LED
2)3 个 IO 驱动更多 LED
在此基础上增加一个 IO,即可实现 3 个 IO 控制更多 LED。合理布局后,3 个端口即可独立控制 6 个 LED,每个 IO 都会接入两组灯。
工作逻辑举例:
IO1 高、IO2 低、IO3 高阻会形成 IO1→LED1→IO2 以及并联支路 IO1→(LED6+LED4)→IO2。由于并联支路电压被钳位在单颗 LED 点亮电压(如 2.8V),不足以点亮两颗 LED 串联,因此只有 LED1 点亮。
IO1 高、IO2 高阻、IO3 低回路 IO1→LED6→IO3 导通,LED6 点亮;并联支路 LED1+LED3 因电压不足无法点亮。
IO1 高阻、IO2 高、IO3 低同理点亮 LED3,LED2+LED6 因电压不足不亮。LED4、LED2、LED5 的点亮逻辑与此类似。
理解以上原理后,再看数码管就很简单。一个 8 字数码管只需要 7 段 LED,因此用 5 个 IO 就可以驱动 188 型多位数码管。为方便 PCB 布局和软件编程,原理图可以按段和位分别简化示意。
这个明白后,咱们再加一个IO就能实现3个IO控制4个LED如下图二。这个也好理解,如果再升级一下呢,如下图,MCU仅通过3个端口即可单独控制6个LED。那么其和IO1、IO2、IO3 都会接入各2个灯。那么如何工作呢?
1.IO1=高电平,IO2=低电平,IO3=高阻态;那么上述中 IO1->LED1->IO2和 IO1->(LED6+LED4)->IO2能各形成一个回路,由于两路形成并联,(LED6+LED4)和 LED1是并联,所以当电压被钳位到LED1的点亮电压(例如2.8v),那么此时就只有 LED1点亮。LED6+LED4无法点亮。
2.IO1=高电平,IO2=高阻态(输入模式),IO3=0V;IO1->LED6->IO3同理LED6点亮;LED1+LED3 由于并联;LED6原因电压被钳位到比如2.4V,电压太低不足以点亮(LED1+LED3)2个灯。
3.IO1=高阻态(输入模式),IO2=高电平,IOP3=低电平;同理LED3点亮。(LED2+LED6)电压太低不足以点亮2个灯。以此类推,LED4,LED2,LED5点亮同理论。
上面如果你明白了,下面就好理解了,我们知道驱动一个1个8字数码管需要7个LED如下图。
那么我们用5个IO就能控制188型的数码管。
为了更好的让layout画PCB,原理图还可以这样示意。
为了更好理让软件更好的编写程序原理图还可以这样,如第一个8字数码管示意。
第二个8字数码管示意。
硬件部分讲完了,咱们再讲解下软件部分--程序的编写思路
三、软件编程思路
使用查理复用的 LED 驱动电路,程序基本流程如下:
初始化所有 IO 为高阻输入状态选中要点亮的 LED,将其对应的两个 IO 设置为推挽输出控制这两个 IO 一高一低,点亮对应 LED循环重复以上三步,实现持续显示
四、查理复用的四个主要缺点
1)LED 刷新频率要求
查理复用本质是逐颗点亮、轮流刷新,同一时刻只亮一颗 LED。必须保证刷新频率足够快,人眼才会感觉常亮。一般要求每个LED刷新频率 >50Hz,否则会明显闪烁。
2)峰值电流问题
由于是分时驱动,为保证亮度,LED 的峰值电流需要比常亮方式更大。同时,如果程序跑飞或死机,已点亮的 LED 可能承受较大电压,存在一定过流风险。
3)必须支持三态 IO
该方案严格依赖单片机 GPIO 的三态能力(高、低、高阻)。若 IO 驱动能力有限(一般单片 IO 限流约 20mA),会限制整体亮度和 LED 数量;若需要外加驱动电路,往往会抵消省 IO 的优势。
4)正向电压差异带来的复杂性
不同颜色 LED 正向压降不同:
- 红光:1.8V~2.2V黄光:2.0V~2.4V绿光:2.2V~2.8V蓝光 / 白光:2.8V~3.5V
当使用多种颜色或电源电压较高(如 5V)时,若目标 LED 损坏,可能出现串联导通、意外点亮其他 LED的现象,即 “二极管连锁效应”。而 3V 系统一般不易出现该问题,因为电压不足以让两颗 LED 串联导通。此外,查理复用电路的 PCB 布线通常更复杂、走线更绕。
五、设计经验与注意事项
硬件设计
每路 LED 必须串联限流电阻,常用 220Ω~1kΩ,防止过流损坏LED 反向耐压较低,必要时可并联反向保护二极管严格控制单引脚电流,不超过 MCU 额定值(常见 20mA / 引脚)
软件优化
扫描频率建议 >60Hz,单帧时间 ≤16ms,避免闪烁切换显示时加入消隐处理,减少鬼影现象空闲 IO 保持高阻态,降低静态功耗
常见问题与解决
交叉干扰、微亮
-
- 多由高阻态漏电导致,可缩短扫描间隔、优化 PCB 布线拉开间距
亮度不均
-
- 调整每位 / 每段的扫描占空比,统一点亮时间
驱动能力不足
250