所有位段選線並聯,位選線分控。以高頻(~1-2ms/位)輪流點亮,利用視覺暫留效應呈現同時顯示。亮度較靜態顯示低,限流電阻宜較小。
#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++; }
若要顯示變數(如計數器),只需在主迴圈依需求更新 num_du 對應的段碼索引,或增加緩衝陣列 disp_buf[6],中斷內輪詢緩衝區輸出。