多位數碼管共用段碼線(a~g, dp),透過位選線(共陽/共陰)輪流啟用。利用人眼視覺暫留效應(約 1/24 秒),以高頻率(通常 > 200Hz)依序點亮各位,形成「同時顯示」假象。
若程式在動態掃描迴圈中強制停留(如進入死循環、中斷未恢復),掃描停止於某一位。此時只有該位數碼管持續亮著,其餘位熄滅。並非「只顯示一位數字」,而是該位的七段全亮或依當時段碼顯示。
// 顯示緩存
uint8_t dispBuf[4] = {0};
// 定時器中斷(1ms)掃描
void Timer0_ISR() interrupt 1 {
static uint8_t idx = 0;
P0 = 0xFF; // 消隱
P2 = (1 << idx); // 位選
P0 = segCode[dispBuf[idx]]; // 段碼
idx = (idx + 1) % 4;
}
// 主迴圈只更新 dispBuf
void UpdateCountdown(uint16_t sec) {
dispBuf[0] = sec / 1000 % 10;
dispBuf[1] = sec / 100 % 10;
dispBuf[2] = sec / 10 % 10;
dispBuf[3] = sec % 10;
}
動態顯示靠持續掃描維持。停止掃描 = 停在單一位。正確設計應將「資料更新」與「掃描顯示」分離,掃描放在定時器中斷,主程式只負責修改顯示緩存。