首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

51 單片機數碼管動態顯示原理與停止現象解析

     編輯:程式設計疑難解答

動態掃描原理

多位數碼管共用段碼線(a~g, dp),透過位選線(共陽/共陰)輪流啟用。利用人眼視覺暫留效應(約 1/24 秒),以高頻率(通常 > 200Hz)依序點亮各位,形成「同時顯示」假象。

倒計時突然停止會發生什麼?

若程式在動態掃描迴圈中強制停留(如進入死循環、中斷未恢復),掃描停止於某一位。此時只有該位數碼管持續亮著,其餘位熄滅。並非「只顯示一位數字」,而是該位的七段全亮或依當時段碼顯示。

常見誤區澄清

  • ❌ 停止後只顯示一位數字 → 正確:停止在某一位,該位顯示當時的段碼內容。
  • ❌ 所有位都會殘留影像 → 視覺暫留約 0.04 秒,超過則逐漸消失。
  • ✅ 若需「凍結顯示」,應在主迴圈持續呼叫掃描函式,僅更新緩存數值。

程式架構建議

// 顯示緩存
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;
}

總結

動態顯示靠持續掃描維持。停止掃描 = 停在單一位。正確設計應將「資料更新」與「掃描顯示」分離,掃描放在定時器中斷,主程式只負責修改顯示緩存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved