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