#include <reg51.h>
#include <intrins.h>
void delay(unsigned int i); //函數聲名
//此表為 LED 的字模, 共陰數碼管 0-9 -
Unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段碼控制
//此表為8個數碼管位選控制, 共陰數碼管 1-8個 -
unsigned char code dispbit[6]={0x20,0x10,0x08,0x04,0x02,0x01}; //位選控制 查表的方法控制
unsigned char xdata *p=0x8004;
unsigned char xdata *q=0x8002;
bit flag;
unsigned int i,LedNumVal=0; //變量定義
unsigned int LedOut[6];
int r;
/************主函數**********************/
int main(void)
{
flag=0;
//定時器1初始化;使用定時器1
TMOD=0X10;
TH1=0X3C;
TL1=0XB0;
// 中斷初始化;開放定時器1中斷和外中斷0、1
EA=1;
ET1=1;
ET0=1;
EX0=1;
EX1=1;
IT1=1;
IT0=1;
r=0;
loop:
while(flag!=1)
{
LedOut[0]=Disp_Tab[LedNumVal/60/10];
if(LedNumVal>=360||LedNumVal==0)
LedOut[1]=Disp_Tab[LedNumVal/60%10]|0x80;
else
LedOut[1]=Disp_Tab[(LedNumVal-240)/60%10]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%60/10];
LedOut[3]=Disp_Tab[LedNumVal%60%10];
LedOut[4]=Disp_Tab[1*LedNumVal/30/10];
LedOut[5]=Disp_Tab[1*LedNumVal/30%10]|0x80;
for( i=0; i<6; i++)
{
*p=LedOut[i];
*q=dispbit[i]; //使用查表法進行位選
delay(75); //掃描間隔時間 太長會數碼管會有閃爍感
}
*q=0x00;
}
LedNumVal=240;
while(flag!=0)
{
LedOut[0]=Disp_Tab[(LedNumVal-240)/60/10];
LedOut[1]=Disp_Tab[(LedNumVal-240)/60%10]|0x80;
LedOut[2]=Disp_Tab[(LedNumVal-240)%60/10];
LedOut[3]=Disp_Tab[(LedNumVal-240)%60%10];
if(LedNumVal<=360)
{
LedOut[4]=Disp_Tab[1*240/30/10];
LedOut[5]=Disp_Tab[1*240/30%10]|0x80;
}
else
{
LedOut[4]=Disp_Tab[(1*LedNumVal-120)/30/10];
LedOut[5]=Disp_Tab[(1*LedNumVal-120)/30%10]|0x80;
}
for( i=0; i<6; i++)
{
*p=LedOut[i];
*q=dispbit[i]; //使用查表法進行位選
delay(75); //掃描間隔時間,太長會數碼管會有閃爍感
}
*q=0x00;
}
goto loop;
return 0;
/*************************************************************************** 延時處理
****************************************************************************/
void delay(unsigned int i)
{
char j;
for( ; i> 0; i--)
for(j = 200; j > 0; j--);
}
/**************************************************************************
* 定時器中斷處理
****************************************************************************/
void timer1(void) interrupt 3
{
ET1=0;
if(r<10){r++;
TH1=0X3C;
TL1=0XB0;
ET1=1;
}
else {
r=0;
LedNumVal++;
TH1=0X3C;
TL1=0XB0;
ET1=1;
}
}
/**************************************************************************
* 外中斷1中斷處理
****************************************************************************/
void int1(void) interrupt 2
{
EX1=0;
flag=0x0;
EX1=1;
TR1=0;
}
/**************************************************************************
* 外中斷0中斷處理
****************************************************************************/
void int0(void) interrupt 0
{
EX0=0;
flag=0x1;
LedNumVal=0;
TR1=1;
EX0=1;
}
|