#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit S1=P2^0;
sbit S2=P2^1;
sbit S3=P2^2;
sbit S4=P2^3; //位定義P2.3口
sbit S5=P2^4; // 位定義P2.4口
sbit S6=P2^5; //位P2.5口
sbit Key1=P3^7; //定義P3.7口為按鍵口
uchar code duan_N[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數碼管故低高電平導通,顯示斷碼,不帶小數點
uchar Key1Times=0; //定義按鍵被按下次數
uint M=0; //定義計時次數
void delay(uint); //定義延時函數
void display(uint miao); //定義顯示函數
void main()
{ //設置INT1s
IT1=1; //跳沿觸發方式,負跳變
EX1=0; //關閉INT1中斷容許,EX為外部中斷1允許位 ,1—允許外部中斷1中斷,0-禁止外部中斷1中斷ss
EA=1; //打開總中斷, S
while(1)
{
if(Key1==0) //當有按鍵被按下時
{
delay(10); //去抖
while(Key1==0); //再次檢查按鍵是否被按下
Key1Times++; //記錄按鍵次數+1
}
if(Key1Times==1){EX1=1;} //按鍵第一次按下,允許中斷。
if(Key1Times==2){EX1=0;} //按鍵第二次按下,禁止中斷
if(Key1Times==3){Key1Times=0;M=0;} //第三次按下,均清零
display(M); //調用自定義display函數,使數碼管顯示數字
}
}
void delay(uint xms) //延時函數
{
int i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--); //這里用了for語句的嵌套,用來增加延時時間
}
void display(uint miao) //定義一個顯示函數
{
uchar baimiao,shimiao,yimiao;
baimiao=miao/100; //定義數碼管百位
shimiao=miao/10%10; //十位
yimiao=miao%10; //個位
S1=0;
P0=0x66;
delay(1);
S1=1;
S2=0;
P0=0x4F;
delay(1);
S2=1;
S3=0;
P0=0x5B;
delay(1);
S3=1;
S4=0; //選擇第四位數碼管
P0=duan_N[baimiao]; //調用數組選擇百位的數
delay(1); //延時
S4=1; //釋放第四位數碼管
S5=0; //選擇第五位數碼管
P0=duan_N[shimiao]; //調用數組選擇十位的數
delay(1); //延時
S5=1; //釋放第五位數碼管
S6=0; //選擇第六位數碼管
P0=duan_N[yimiao]; //調用數組選擇個位的數
delay(1); //延時
S6=1; //釋放第六位數碼管
}
void Int1()interrupt 2 //定義中斷函數,中斷源為外部中斷1 ,將中斷函數定義為void,以明確說明其沒有返回值
{
M++;
if(M==1000)
{
M=999;
}
} //結束返回主函數 while(1)循環
|