MCU引腳不夠用?老工程師簡單一招把1根線抻成N根
發布日期:2026-08-12
點擊次數:2
你肯定遇到過這種的時刻: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.mm3658.com









