|
|
在P3^4上加上一個按鍵命名為k2,k2鎖死就會自動倒計時,k2打開就恢復,可以直接先用你的k1中斷0中斷1設置時間再鎖死k2,也可以先鎖死再用你的k1和中斷0中斷1調整
#include<reg51.h>
#define uchar unsigned char//宏替換
#define uint unsigned int
sbit k1=P3^1; //第一個按鍵,選擇設置
sbit k2=P3^4;
bit c;
uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數碼管段碼表(0-9,-)
uchar disbuf[8]; //聲明顯示緩沖區8個單元
uchar hour=12; //聲明小時變量,初值為12
uchar minute=59; //聲明分變量,初值為59
uchar second; //聲明秒變量
uchar t0n; //定時器T0中斷計數,定時50ms,中斷20次為1秒
uchar dis; //調時狀態下,顯示小數點位
void delay() //延時子程序,用于顯示子程序
{
uint j;
for(j=300;j>0;j--);
}
//顯示子程序,參數dis為顯示小數點位
void display(uchar dis) // ????????????????????????????
{
uchar j,disbit=0x01; //位碼(未知)
for(j=0;j<8;j++)
{
P2=~disbit; //P2口輸出位碼
if(dis>0&&dis==j) //調時狀態下,顯示小數點(看不懂)
P0=distab[disbuf[j]]+0x80; //在小時,分,秒位上顯示小數點
else
P0=distab[disbuf[j]]; //其它位正常顯示
disbit<<=1; //取下一個位碼
delay(); //延時
}
}
void main()//主函數
{
disbuf[2]=disbuf[5]=10;//數碼管第3,6位顯示-
TMOD=0x01; //t0定時器方式1
TH0 =0x3C; //單片機晶振頻率=12M,定時50ms,時間常數=3CB0
TL0 =0xB0;
IE =0x82; //開定時器T0中斷(EX1外部中斷1沒開)
TR0 =1; //啟動定時器T0
IT0 =1; //設置外部中斷為下降沿有效
IT1 =1;
while(1)
{
display(dis); //調顯示子程序(未知)
if(k1==0) //選擇設置
{
dis++; //停止計時,進入調時狀態(暫停了秒計時)
EX0=1; //調時狀態下,允許外部INT0,INT1中斷
EX1=1; //用來調小時,分,秒
if(dis>7) //調小時,在小時位顯示小數點
{
dis=0; //滅小數點
t0n=0; //調時結束,開始計時
TR0=1;
EX0=0; //關外部中斷
EX1=0;
}
else if(dis==2)dis=4; //調分,在分位顯示小數點
else if(dis==5)dis=7; //調秒,在秒位顯示小數點
while(k1==0)display(dis); //等待按鍵釋放
}
//這里做改動
if(c==0);
{
if(t0n>=20&&dis==0) //中斷20次,1秒到,計時狀態下時鐘計時
{
t0n=0;
second++; //秒加1
if(second>=60) //到60秒
{
second=0;
minute++; //分加1
if(minute>=60) //到60分
{
minute=0;
hour++; //小時加1
if(hour>=24)
hour=0;
}
}
}
}
if(k2==0)
{
c=~c;
ET0=~ET0;
while(k1==0)display(dis);
}
if(c==1)
{
second--; //秒加1
if(second==0xff) //到60秒
{
second=59;
minute--; //分加1
if(minute==0xff) //到60分
{
minute=59;
hour--; //小時加1
if(hour==0xff)
hour=23;
}
}
}
disbuf[0]=hour/10; //顯示小時十位
disbuf[1]=hour%10; //顯示小時個位
disbuf[3]=minute/10; //顯示分十位
disbuf[4]=minute%10; //顯示分個位
disbuf[6]=second/10; //顯示秒十位
disbuf[7]=second%10; //顯示秒個位
}
}
//定時器T0中斷服務子程序
void T0_isr() interrupt 1
{
TH0=0x3C; //重寫時間常數
TL0=0xb0;
t0n++; //中斷次加1
}
//外部中斷INT0服務程序,調時狀態下,加1
void INT0_ISR() interrupt 0
{
if(dis==1) //調小時
{
hour++; //小時加1
if(hour>=24)
hour=0;
}
if(dis==4) //調分
{
minute++; //分加1
if(minute>=60)
minute=0;
}
if(dis==7) //調秒
{
second++; //秒加1
if(second>=60)
second=0;
}
}
//外部中斷INT1服務程序,調時狀態下,減1
void INT1_ISR() interrupt 2
{
if(dis==1) //調小時
{
hour--; //小時減1
if(hour==0xff)
hour=23;
}
if(dis==4) //調分
{
minute--; //分減1
if(minute==0xff)
minute=59;
}
if(dis==7) //調秒
{
second--;//秒減1
if(second==0xff)
second=59;
}
}
|
|