首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

單晶片數碼管動態顯示原理與 C51 實作

     編輯:關於C語言

硬體環境

  • 實驗板:TX-1C
  • 8 位共陰極數碼管,段選 P0、位選 P2.6/P2.7 控制鎖存器。

動態掃描原理

所有位段選線並聯,位選線分控。以高頻(~1-2ms/位)輪流點亮,利用視覺暫留效應呈現同時顯示。亮度較靜態顯示低,限流電阻宜較小。

完整 C51 程式碼

#include 
#include 

#define uint unsigned int
#define uchar unsigned char

sbit dula = P2^6;   // 段選鎖存
sbit wela = P2^7;   // 位選鎖存

uchar code table_du[] = {  // 0-F 段碼
    0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71
};
uchar code table_we[] = {  // 6 位位選碼
    0xfe,0xfd,0xfb,0xf7, 0xef,0xdf
};

uchar aa, num_du, num_we;

void main() {
    num_du = 1; num_we = 0;
    TMOD = 0x01;                 // T0 模式 1 (16-bit)
    TH0 = (65536-1800)/256;      // 1.8ms @ 12MHz
    TL0 = (65536-1800)%256;
    EA = 1; ET0 = 1; TR0 = 1;    // 啟動中斷

    while (1) {
        if (aa == 1) {           // 定時器標誌
            aa = 0;
            dula = 1; P0 = table_du[num_du]; dula = 0;  // 輸出段碼
            wela = 1; P0 = table_we[num_we]; wela = 0;  // 輸出位選
            if (++num_du == 7) num_du = 1;   // 顯示 1~6
            if (++num_we == 6) num_we = 0;
        }
    }
}

void T0_time() interrupt 1 {
    TH0 = (65536-1800)/256;
    TL0 = (65536-1800)%256;
    aa++;
}

關鍵參數計算

  • 12 MHz 晶振,機器週期 1 μs。
  • 定時 1.8 ms → 計數值 = 65536 - 1800 = 63736。
  • 6 位數碼管,每位 1.8 ms,整體掃描週期 10.8 ms(~92 Hz),無閃爍。

顯示內容擴展

若要顯示變數(如計數器),只需在主迴圈依需求更新 num_du 對應的段碼索引,或增加緩衝陣列 disp_buf[6],中斷內輪詢緩衝區輸出。

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