動態顯示的基本原理
多個數碼管顯示數字的時候,實際上是輪流點亮數碼管(一個時刻內只有一個數碼管是亮的)利用人眼的視覺暫留現象(也叫餘暉效應)就可以做到看起來是所有數碼管都同時亮了,這就是動態顯示,也叫作動態掃描
例如:有兩個數碼管,要顯示“12”這個數字,先讓高位的位選三極體導通,然後控制段選讓其顯示“1”,延時一定時間後再讓低位的位選三極體導通,然後控制端選讓其顯示“2”把這個流程以一定的速度迴圈執行就可以讓數碼管顯示出“12”由於交替速度非常快,人眼識別到的就是“12”這兩位數字同時亮了。
6個數碼管組合正計時[從0到999999再從0開始]
#include <reg52.h>
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned char code LedIndex[] =
{
0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED
};
void main(void)
{
unsigned int cnt = 0;//設定迴圈次數為0
unsigned int sec = 0;//經過時間,單位為s
int i = 0;//數碼管序號
int iP0 = 0, iP1 = 0, iP2 = 0, iP3 = 0, iP4 = 0, iP5 = 0;
TMOD = 1;//設定定時器0為模式1
TH0 = 0xF7;
TL0 = 0x00;//設定定時器0的初始值為0xF700,溢位一次0.0025s
TR0 = 1;//啟動定時器0
P1 = LedIndex[0];
P0 = LedChar[sec];
while (1)
{
if (1 == TF0)//溢位
{
TH0 = 0xF7;
TL0 = 0x00;
TF0 = 0;//初始化定時器0
cnt++;//迴圈次數+1
if (400 == cnt)//1s
{
sec++;
cnt = 0;
if (1000000 == sec)
sec = 0;
iP0 = sec % 10;
iP1 = sec / 10 % 10;
iP2 = sec / 100 % 10;
iP3 = sec / 1000 % 10;
iP4 = sec / 10000 % 10;
iP5 = sec / 100000 % 10;
}
switch (i)
{
case 0:
if (sec >= 0)
{
P1 = LedIndex[i];
P0 = LedChar[iP0];
}
i++;
break;
case 1:
if (sec > 9)
{
P1 = LedIndex[i];
P0 = LedChar[iP1];
}
i++;
break;
case 2:
if (sec > 99)
{
P1 = LedIndex[i];
P0 = LedChar[iP2];
}
i++;
break;
case 3:
if (sec > 999)
{
P1 = LedIndex[i];
P0 = LedChar[iP3];
}
i++;
break;
case 4:
if (sec > 9999)
{
P1 = LedIndex[i];
P0 = LedChar[iP4];
}
i++;
break;
case 5:
if (sec > 99999)
{
P1 = LedIndex[i];
P0 = LedChar[iP5];
}
i = 0;
break;
}
}
}
}