MCU引脚不够用?老工程师简单一招把1根线抻成N根
发布日期:2026-08-12
点击次数:1334
你肯定遇到过这种的时刻:MCU 的引脚几乎用完,产品马上要交付,客户突然说要加一个 4 位数码管或者一排指示灯。多一根 GPIO 都挤不出来,加芯片又嫌板子和成本撑不住。今天分享一个偏门玩法——用一个 GPIO,靠“不同长度的脉冲”在硬件上跑出一串串行数据,最后锁存成 N 位并行输出。不再纠结引脚,也不再改 MCU,只需要加些门电路、RC时序电路和移位寄存器就能搞定。

需求有多“坑”:只剩一条 I/O 却要 N 位并行
先说下灵感的来源。EDN 的老朋友 Jayapal 前阵子投稿,说他碰到一个“噩梦开局”:MCU 只剩一个引脚空闲,却临时要加一个 4 位数码管。是不是听起来就头大?再加上马上要交付,完全就是恐怖片开局。
他的做法很聪明——在一条 GPIO 上,用不同时长的软件脉冲来编码控制信息,直接“一拖多”。顺着这个思路,我就在想:能不能把玩法再“泛化”一点?不限于 4 位 BCD,而是任意 N 位并行输出,都用同一根 GPIO。于是就有了下面这套电路与时序方案。
电路要点:一条 GPIO “玩转”三路 RC 与移位寄存器
电路的核心思路其实很简单:
·GPIO 输出的脉冲先经过一个非反相门 U1a 做一下缓冲;
·然后同时给三组 RC/门电路“喂”脉冲:
i.SER 0/1 判别电路 U1b:R1C3 时间常数 400 μs,用来判断这一位是 0 还是 1;
ii.RCLK(锁存时钟)生成电路 U1cd:R4C2=2.4 ms,交流耦合施密特触发,用来在“传输结束”时产生一个并行锁存脉冲;
iii.SRCLK(移位寄存器串行时钟):作为移位时钟,把 SER 上的位一个一个挪进移位寄存器串。
这里所有时钟和控制都由 GPIO 的“脉冲时长”和 RC 充放电来决定。

示例电路
时序设计:用“脉冲长短”编码 0/1 并自动锁存
要玩得稳,最关键的是:MCU 这条 GPIO 必须有稳定、可预测的输出翻转。接下来看具体时序规则,这些是可以直接落地的参数:
·空闲态:GPIO 保持 高电平(1)。
·要发位时,先把 GPIO 拉低(0),这相当于开始脉冲,同时释放各路 RC时序电路。
·发完这一位后,GPIO 再回到高(1)。低电平的持续时间决定了你移进去的是 0 还是 1:
o若 < 100 μs(T0):R1C3 还没来得及把 SER 拉高,当 SRCLK 上升沿到来时,SER 仍然是 0——于是移位寄存器收到的是 0;
o若 > 400 μs(T1):R1C3 有足够时间把 SER 拉高,SRCLK 上升沿锁进的就是 1。

GPIO脉冲时序
只要你控制好相邻脉冲之间的空闲时间 < 600 μs,就可以维持在 2–10 kbps 左右的有效数据率(取决于 0/1 的分布)。
整包数据发完后,只要让 GPIO 空闲 > TR=3.5 ms,R4C2 的 AC 耦合施密特触发就会超时并产生一个 RCLK 脉冲,一次性把移位寄存器里的数据“横向”打到 N 位并行输出口。
如果你是做 4 位 BCD 数码管(16 bit),用两个 8-bit 移位寄存器,整体时序大概在 12 ms 内就够用。对多数低速显示/控制场景来说,完全“打得动”。
使用边界与工程取舍
任何“花式省引脚”的方案,都要清楚它的适用边界。这套玩法有几个点我建议你心里有数:
·可靠性严重依赖 RC 与温度/批次:R/C 的精度、温度系数、电源波动都会影响阈值。如果你对时序要求很严,或者要过宽温范围,最好把 RC 换成更稳定的方案。
·协议是“定制的单总线”:MCU 端需要用软件精确控制脉冲宽度;如果你后面要维护/交接,记得把时序参数写进注释或文档。
·速率不高,适合低速控制/显示:2–10 kbps 级别对状态指示、数码管、继电器阵列等完全够用;但别指望跑高速通信或视频类数据。
·硬件成本 vs 软件成本:如果 MCU 本身还有余量,你当然可以用更“正统”的 扩展方法,或者干脆换一颗引脚更多的 MCU;但在“硬件不能动、BOM 受限、交期卡死”的前提下,这套 RC+移位寄存器的做法是个很实用的补丁方案。
声明:
本文来源于网络 ,转载仅为学习参考,如有问题请联系,谢谢。
深圳市正芯科技有限公司http://www.pluschiptech.com









