|
一直按著切換按鈕 可以調(diào)鬧鐘 鬧鐘到了LED閃爍 但是程序按著切換按鈕無法切換到鬧鐘畫面 還是繼續(xù)計時 為什么 ? #include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit NZSET=P1^7;
uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0}; //顯示緩存
uchar Scan_BIT; //掃描位,選擇要顯示的數(shù)碼管
uchar DSY_IDX; //顯示緩存索引
uchar Key_State; //P1端口按鍵狀態(tài)
uchar h,m,s,s100; //十分秒,1/100s
uchar dispnz[8]; //鬧鐘數(shù)組
uchar code table[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};
uchar code scan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xbf,0x7f,0xdf};
unsigned char restar=0;
unsigned char Second1,Minute1,Hour1;
bit nzbz;
void Delay(uchar x) //延時
{
uchar i;
while(x--) for(i=0;i<120;i++); //計時函數(shù)
}
//鬧鐘設(shè)置掃描顯示函數(shù)
void SCANDISPNZ()
{
unsigned char i,value;
for(i=0;i<8;i++)
{
P3=0xff;
value=table[dispnz[i]];
P0=value;
P3=scan[i];
Delay(50);
}
}
//鬧鐘顯示內(nèi)容處理函數(shù)
void DISPLAYNZ()
{
SCANDISPNZ();
dispnz[6]=Second1/10;
dispnz[7]=Second1%10;
dispnz[5]=10;
dispnz[3]=Minute1/10;
dispnz[4]=Minute1%10;
dispnz[2]=10;
dispnz[0]=Hour1/10;
dispnz[1]=Hour1%10;
}
void Increase_Hour() //計算時的函數(shù)
{
if(++h>23)h=0;
DSY_BUFFER[0]=DSY_CODE[h/10];
DSY_BUFFER[1]=DSY_CODE[h%10];
}
void Increase_Minute()
{ //計算分的函數(shù)
if(++m>59)
{
m=0;Increase_Hour();
}
DSY_BUFFER[3]=DSY_CODE[m/10];
DSY_BUFFER[4]=DSY_CODE[m%10];
}
void Increase_Second() //計算秒的函數(shù)
{
if((++s>59))
{
s=0;Increase_Minute();
}
DSY_BUFFER[6]=DSY_CODE[s/10];
DSY_BUFFER[7]=DSY_CODE[s%10];
}
void T0_INT() interrupt 1 //T0中斷動態(tài)掃描數(shù)碼管顯示
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
P3=Scan_BIT; //選通相應(yīng)數(shù)碼管
P0=~DSY_BUFFER[DSY_IDX]; //段碼送P0取反
Scan_BIT=_crol_(Scan_BIT,1); //準(zhǔn)別下次選通的數(shù)碼管
DSY_IDX=(DSY_IDX+1)%8; //索引0-7內(nèi)循環(huán)
}
void T1_INT() interrupt 3 //中斷時鐘控制程序運(yùn)行
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(++s100==20)
{ //50ms*20=1s延時
s100=0;Increase_Second();
}
}
void KEY_TEST() //時間設(shè)定與復(fù)位
{
P0=P3=0xFF;
TMOD=0x11; //T0,T1工作在模式1
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TH1=0xDC;
TL1=0;
TCON=0x01;
EA=1; //開中斷
ET0=1;
ET1=1;
h=0;
m=s=s100=0; //將時分秒放入顯存
DSY_BUFFER[0]=DSY_CODE[h/10];
DSY_BUFFER[1]=DSY_CODE[h%10];
DSY_BUFFER[3]=DSY_CODE[m/10];
DSY_BUFFER[4]=DSY_CODE[m%10];
DSY_BUFFER[6]=DSY_CODE[s/10];
DSY_BUFFER[7]=DSY_CODE[s%10];
Scan_BIT=0xFE; DSY_IDX=0;
TR0=TR1=1; //啟動兩個定時器
Key_State=0xFF;
while(1)
{
if(P1^Key_State)
{
Delay(10);
if(P1^Key_State)
{
Key_State=P1;EA=0;
if((Key_State&0x04)==0)Increase_Hour(); //小時+1
if((Key_State&0x02)==0)Increase_Minute(); //分鐘+1
if((Key_State&0x01)==0)Increase_Second(); //秒+1
else if((Key_State&0x08)==0)
{
s=0;
DSY_BUFFER[6]=DSY_CODE[s/10];
DSY_BUFFER[7]=DSY_CODE[s%10];
m=0;
DSY_BUFFER[3]=DSY_CODE[m/10];
DSY_BUFFER[4]=DSY_CODE[m%10];
h=0;
DSY_BUFFER[0]=DSY_CODE[h/10];
DSY_BUFFER[1]=DSY_CODE[h%10];
}
EA=1;
}
}
}
}
//鬧鐘設(shè)定按鍵掃描和鍵值處理函數(shù)
void NZKEY_TEST()
{
DISPLAYNZ();
P1=0xff;
restar=0;
if((Key_State&0x10)==0) //秒+1
{
Delay(100);
if((Key_State&0x10)==0)
{
Increase_Second1();
if(Second1==60)
{
Second1=0;
}
while((Key_State&0x10)==0) DISPLAY();
}
}
if((Key_State&0x20)==0) //分+1
{
Delay(100);
if((Key_State&0x20)==0)
{
Increase_Minute1();
if(Minute1==60)
{
Minute1=0;
}
while((Key_State&0x20)==0) DISPLAY();
}
}
if((Key_State&0x40)==0); //時+1
{
Delay(100);
if((Key_State&0x40)==0);
{
Increase_Hour1();
if(Hour1==24)
{
Hour1=0;
}
while((Key_State&0x40)==0) DISPLAY();
}
}
}
//主函數(shù)
void main()
{
while(1)
{
Hour1=0;
Minute1=0;
Second1=0;
s100=0;
h=0;
m=0;
s=0;
TMOD=0x01;
TH0=(65536-1000)/256; //T0定時器
TL0=(65536-1000)%256;
IE=0x82;
TR0=1;
P2=1;
while(1) //跳轉(zhuǎn)鬧鐘程序
{
if(NZSET=1)
{KEY_TEST();}
else NZKEY_TEST();
if((h=Hour1)&&(m=Minute1)&&(s=Second1))
{
P2=0;
nzbz=1;
}
if(restar==1)
break;
}
}
}
|
|