|
/*用573鎖存器控制和單片機(jī)腳直接位選控制數(shù)碼管
用中斷T0作為秒計數(shù)器實現(xiàn)實時時鐘功能,由于未學(xué)鍵盤,調(diào)時日后再加*/
#include <reg52.h>
#include <intrins.h>
#define unint unsigned int
#define unchar unsigned char
void delay(unint i); //函數(shù)聲名
char num;
//此表為 LED 的字模, 共陰數(shù)碼管 0-9 -
unsigned char code Disp_Tab[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6,0x02};
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位碼 查表的方法控制
/************主函數(shù)**********************/
main()
{
unint i;
long int LedNumVal=0 ;
unint LedOut[10];
num=0;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num>=20) //控制數(shù)字變化速度
{
num=0;
++LedNumVal;
if(LedNumVal==86400)
LedNumVal=0;
}
LedOut[7]=Disp_Tab[LedNumVal/3600%100/10];//時的十位
LedOut[6]=Disp_Tab[LedNumVal/3600%10];//時的個位
LedOut[5]=Disp_Tab[10];//分隔桿
LedOut[4]=Disp_Tab[LedNumVal%3600/60%100/10];//分的十位
LedOut[3]=Disp_Tab[LedNumVal%3600/60%10];//分的個位
LedOut[2]=Disp_Tab[10];//分隔桿
LedOut[1]=Disp_Tab[LedNumVal%60%100/10];//秒的十位
LedOut[0]=Disp_Tab[LedNumVal%60%10];//秒的個位
for( i=0; i<8; i++)
{
P0 = LedOut[i];
P2 = dispbit[i]; //使用查表法進(jìn)行位選
delay(1); //掃描間隔時間 太長會數(shù)碼管會有閃爍感
}
}
}
void delay(unint z)//延時
{
unint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void time0() interrupt 1//中斷服務(wù)
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
}
|
|