*proteus仿真中晶振電路及復位電路自行添加
*晶振:12M
*
*
*********************************************************/
#include <reg51.h>
sbit K1=P3^7; //
sbit K2=P3^6; //
bit flag=0; //
int num;
int L[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管段選數(shù)據 根據實際電路修改
int wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //數(shù)碼管位選信號 根據實際電路修改
unsigned char dat[4];
/************延時***************/
void delay(int i)
{
int x,y;
for(x=i;x>0;x--)
for(y=125;y>0;y--);
}
void main(void)
{
TMOD = 0x01; //定時器0 方式一
TH0 = 0x0FC; //10ms計時高8位
TL0 = 0x18; //10ms計時低8位
EA = 1; //開啟總中斷
ET0 = 1; //開啟定時器0中斷
TR0 = 1; //開啟定時器0計數(shù)
while(1)
{
if(!K1) //判斷K1鍵
{
delay(10); //按鍵去抖
if(!K1)
{
flag=~flag;
while(!K1); //等待按鍵彈起
}
}
if(!K2) //判斷K2鍵
{
delay(10); //按鍵去抖
if(!K2)
{
num=0;
}
}
}
}
void Timer0Interrupt(void) interrupt 1 //10ms中斷
{ int i;
TH0 = 0x0D8; //中斷初值重裝
TL0 = 0x0F0;
if(flag) num++; //中斷次數(shù)記錄
if(num==10000) //10次中斷為10*10ms=1s
{
num=0;
}
dat[0]=L[num%10000/1000];
dat[1]=L[num%1000/100]|0x80;;
dat[2]=L[num%100/10];
dat[3]=L[num%10];
for(i=0;i<4;i++) //數(shù)碼管顯示
{
P1=dat[i]; //P1段選 根據實際電路修改
P2=wei[i]; //P3位選 根據實際電路修改 建議修改為其他IO口
delay(1);
P2=0xff; //去重影
}
} |