短文标题:595级联+动态扫描:3个IO驱动多位数码管

你有没有想过一个问题:4位数码管需要32个IO,STM32哪来这么多引脚?74HC595级联 + 动态扫描 = 3个IO搞定。74HC595:串行输入,并行输出74HC595内部有8位移位寄存器 + 8位锁存器。只需3个IO:
- A(数据线):送每一位
- SHIFT_CLOCK(移位时钟):上升沿移入数据
- LATCH_CLOCK(锁存时钟):上升沿锁存输出
送完8个bit后LATCH,8个输出引脚同时更新。3个IO换8个输出,净赚5个。菊花链级联:从8个到无限个,SQH(串行输出)是移位寄存器的"溢出端",接到下一片595的A引脚。送16个bit:前8个存第一片,后8个从SQH流到第二片。一个LATCH,两片同时输出------16个输出。N片级联,3个IO,8N个输出。

**动态扫描:4位数码管只用12个IO,**4位数码管实际连接:8根段选线(所有位共用)+4根位选线 = 12个IO。工作方式:第1位显示数字→延时几毫秒→第2位显示数字→延时几毫秒→......循环。频率>50Hz,人眼视觉暂留认为"同时亮"。
组合方案:595级联 + 动态扫描
- 一片595驱动8根段选线
- 另一片595驱动4根位选线(只用4个输出)
- 2片595级联,3个IO搞定4位数码管
省下29个IO干别的事。驱动代码核心
// 送16位数据(段选+位选)
uint16_t data = (seg_code << 8) | (1 << bit_index);
for (int i = 15; i >= 0; i--) {
GPIO_WriteBit(DATA_PIN, (data >> i) & 1);
GPIO_SetBits(SCK_PIN);
GPIO_ResetBits(SCK_PIN);
}
GPIO_SetBits(RCK_PIN);
GPIO_ResetBits(RCK_PIN);

常见问题,鬼影(残影) :改段选时旧位选未关。正确顺序:关位选→改段选→开位选→延时 。亮度不足 :N位数码管每位的亮度 = 1/N。位数越多越暗,需增加段驱动电流或使用高亮数码管。使用专用驱动芯片(TM1650)或ULN2003增强驱动。应用场景
- 多位数码管显示(时钟、计数器)
- LED点阵屏(16×16、32×32)
- 工业指示灯板
- 任何IO不够、输出点多的情况
这个故事的启示, 595级联解决"输出不够",动态扫描解决"引脚不够"。两个技术合在一起,3个IO能驱动成百上千个LED。写在最后, IO不够不是换芯片的理由。595级联+动态扫描,用时间换空间,用串行换并行。资源不够,架构来凑。

(本文灵感源于于振南《新概念ARM32单片机》教程第3.7节、第3.8节、第3.9节。)
觉得有用?点赞、转发,让更多人看懂"595级联+动态扫描"的IO扩展组合拳。
本回答由 AI 生成,内容仅供参考,请仔细甄别
