分內容轉自:《51單片機C語言創新教程》溫子祺等著。
原理:
軟件設計方面使用動態驅動數碼管的方式,即要保證當數碼管顯示時的效果沒有閃爍的現象出現,亮
度壹致,沒有拖尾現象。由於人眼對頻率大於對24Hz以上的光的閃爍不敏感,這是利用了人眼視覺暫留的特點。壹般來說,每壹個數碼管點亮時間為1~2ms就可以了。如果某壹個數碼管點亮時間過長,則這個數碼管的亮度過高,如果某壹個數碼管的點亮時間過短,則這個數碼管的亮度過暗。因此我們必須設計壹個定時器來定時點亮數碼管,在該例子中,定時器的定時為5ms,即每個數碼管點亮時間為5ms,掃描四個數碼管的時間為20ms。
源碼:
/*實驗名稱:數碼管實驗
*描 述:在該章節的數碼管實驗當中,
使用動態驅動數碼管的方式來編寫程序,
程序的實現方式是數碼管從0-9999循環顯示
*作 者:溫子祺
*修改日期:2010/5/4
*/
#include "stc.h"
#define HIGH 1
#define LOW 0
#define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
#define LS164_CLK(x) {if((x))P0_5=1;else P0_5=0;}
#define SEG_PORT P0
unsigned char Timer0IRQEvent=0;
unsigned char Time1SecEvent=0;
unsigned int TimeCount=0;
unsigned char SegCurPosition=0;
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
//code unsigned char SegPosition[4]={0xfe,0xfd,0xfb,0xf7};
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};
unsigned char SegBuf[4] ={0};
void LS164Send(unsigned char byte)
{
unsigned char j;
for(j=0;j=7;j++)
{
if(byte&(1(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
void RefreshDisplayBuf(void) //刷新顯示緩存
{
SegBuf[0] =TimeCount%10;
SegBuf[1] =TimeCount/10%10;
SegBuf[2] =TimeCount/100%10;
SegBuf[3] =TimeCount/1000%10;
}
void SegDisplay(void)
{
unsig......綠竹別其三分景 紅梅正報萬家春 春回大地