- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key1=P3^4;
- sbit key2=P3^5;
- sbit key3=P3^6;
- sbit wela=P2^7;
- sbit dula=P2^6;
- sbit beep=P2^3;
- uchar code table[]= //定義數組
- {0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};
- uchar code table1[]=
- {0xfe,0xfd,0xdf,0xf7,0xef,0xfb,0xbf,0x7f};
- char shi=0,fen=0,n=0,shit=0,fent=1,numt,b=0,x=0,y=0,z=0,num,num2;
- unsigned char a=0;
- uchar flag;
-
- void delayms(uint xms) //延時函數
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void di()//蜂鳴器函數
- {
- beep=0;
- delayms(100);
- beep=1;
- }
-
-
- void keyscan()//獨立按鍵程序
- {
- if(key1==0) //第一位為功能鍵
- {
- delayms(10);
- if(key1==0)
- {
- n++;
- if(n==8)
- {n=0;a=0;TR1=1;}
- while(!key1);
- di();
- }
- }
- if(n==0)
- {
- TR0=1;
- }
-
- if(n==1) //調時
- {
- TR0=0;
- if(key2==0)
- {
- delayms(10);
- if(key2==0)
- {
- shi++;
- if(shi==24)
- shi=0;
- while(!key2);
- di();
- }
- }
- if(key3==0)
- {
- delayms(10);
- if(key3==0)
- {
- shi--;
- if(shi==-1)
- shi=23;
- while(!key3);
- di();
- }
- }
- }
- if(n==2)//調分
- {
- TR0=0;
- if(key2==0)
- {
- delayms(10);
- if(key2==0)
- {
- fen++;
- if(fen==60)
- fen=0;
- while(!key2);
- di();
- }
- }
- if(key3==0)
- {
- delayms(10);
- if(key3==0)
- {
- fen--;
- if(fen==-1)
- fen=59;
- while(!key3);
- di();
- }
- }
- }
-
- if(n==3) //調秒
- {
- TR0=0;
- if(key2==0)
- {
- delayms(10);
- if(key2==0)
- {
- num++;
- if(num==60)
- num=0;
- while(!key2);
- di();
- }
- }
- if(key3==0)
- {
- delayms(10);
- if(key3==0)
- {
- num--;
- if(num==-1)
- num=59;
- while(!key3);
- di();
- }
- }
- }
-
- if(n==4)//調鬧鈴時
- {
- TR0=0;
- if(key2==0)
- {
- delayms(10);
- if(key2==0)
- {
- shit++;
- if(shit==24)
- shit=0;
- while(!key2);
- di();
- }
- }
- if(key3==0)
- {
- delayms(10);
- if(key3==0)
- {
- shit--;
- if(shit==-1)
- shit=23;
- while(!key3);
- di();
- }
- }
- }
-
- if(n==5)//調鬧鈴分
- {
- TR0=0;
- if(key2==0)
- {
- delayms(10);
- if(key2==0)
- {
- fent++;
- if(fent==60)
- fent=0;
- while(!key2);
- di();
- }
- }
- if(key3==0)
- {
- delayms(10);
- if(key3==0)
- {
- fent--;
- if(fent==-1)
- fent=59;
- while(!key3);
- di();
- }
- }
- }
-
- if(n==6) //調鬧鈴秒
- {
- if(key2==0)
- {
- delayms(10);
- if(key2==0)
- {
- numt++;
- if(numt==60)
- numt=0;
- while(!key2);
- di();
- }
- }
- if(key3==0)
- {
- delayms(10);
- if(key3==0)
- {
- numt--;
- if(numt==-1)
- numt=59;
- while(!key3);
- di();
- }
- }
- }
- if(n==7) //調秒表
- {
- if(a==0){TR1=0;z=0;x=0;y=0;a=1;} //因為當開啟鬧鈴模式時,定時器已經開啟一段時間當按下key1時,a=0;定時器從新至0
- if(!key2){delayms(10);while(!key2);TR1=~TR1;} //TR1=~TR1;以為按下key2件可切換定時器的開啟和停止,從而實現開始和停止
- if(!key3){delayms(10);while(!key3);a=0;x=0;y=0;z=0;} //歸零
- }
- }
-
- void display(uchar s,uchar f,uchar m)
- {
- if(b<25&&(n==1||n==4))
- {
- wela=1;
- P0=0xff;
- wela=0;
- delayms(2);
- }
- else
- {
- wela=1;
- P0=table1[0];
- wela=0;
- //P0=0xff;
-
- dula=1;
- P0=table[s/10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[1];
- wela=0;
- P0=0xff;
-
- dula=1;
- P0=table[s%10];
- dula=0;
- delayms(2);
- }
- wela=1;
- P0=table1[2];
- wela=0;
- dula=1;
- P0=0x40;
- dula=0;
- delayms(2);
-
-
- if(b<25&&(n==2||n==5))
- {
- wela=1;
- P0=0xff;
- wela=0;
- delayms(2);
- }
- else
- {
- wela=1;
- P0=table1[3];
- wela=0;
- //P0=0xff;
- dula=1;
- P0=table[f/10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[4];
- wela=0;
- //P0=0xff;
- dula=1;
- P0=table[f%10];
- dula=0;
- delayms(2);
- }
-
- wela=1;
- P0=table1[5];
- wela=0;
- //P0=0xff;
- dula=1;
- P0=0x40;
- dula=0;
- delayms(2);
-
-
- if(b<25&&(n==3||n==6))
- {
- wela=1;
- P0=0xff;
- wela=0;
- delayms(2);
- }
- else
- {
- wela=1;
- P0=table1[6];
- wela=0;
-
- P0=0xff;
- dula=1;
- P0=table[m/10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[7];
- wela=0;
-
- P0=0xff;
- dula=1;
- P0=table[m%10];
- dula=0;
- delayms(2);
- }
- }
- void display1(uchar x,uchar y,uchar z)
- {
-
- wela=1;
- P0=table1[0];
- wela=0;
-
- dula=1;
- P0=table[x/10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[1];
- wela=0;
- delayms(2);
- P0=0xff;
-
- dula=1;
- P0=table[x%10];
- dula=0;
- delayms(2);
- wela=1;
- P0=table1[2];
- wela=0;
-
- P0=0xff;
- dula=1;
- P0=0x40;
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[3];
- wela=0;
- dula=1;
- P0=table[y/10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[4];
- wela=0;
- //P0=0xff;
-
- dula=1;
- P0=table[y%10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[5];
- wela=0;
-
- P0=0xff;
- dula=1;
- P0=0x40;
- dula=0;
- delayms(2);
-
- wela=1;
- P0=table1[6];
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[z/10];
- dula=0;
- delayms(2);
-
-
- wela=1;
- P0=table1[7];
- wela=0;
- // P0=0xff;
- dula=1;
- P0=table[z%10];
- dula=0;
- delayms(2);
-
- }
- void init()
- {
- //IE=0x8a;//開總中斷
- TMOD=0x11;//選擇工作方式1
- TH0=(65536-50000)/256;// 賦初值 50毫秒
- TL0=(65536-50000)%256;
- TH1=(65536-10000)/256;
- TL1=(65536-10000)%256;
- EA=1;
- ET0=1;//定時器零中斷允許
- TR0=1;//開定時器零
- ET1=1; //定時器一中斷允許
- TR1=1; //開定時器一
- flag=0;
- }
- main()
- {
- init();
- while(1)
- {
- keyscan(); //獨立按鍵
- /*******調鬧鈴當時間和設定時間相等時蜂鳴器響起,當按下任意一鍵,暫停鬧鈴。********/
- if(!flag)
- {
- if(shi==shit&&fen==fent) //開鬧鈴
- {
- di();
- if(!key1||!key2||!key3)flag=1;
- }
- }
- /**************************************************/
- if(shi!=shit||fen!=fent) flag=0;
- if(n==0||n==1||n==2||n==3)//顯示時鐘
- display(shi,fen,num);
- if(n==4||n==5||n==6)
- display(shit,fent,numt);//顯示鬧鈴
- if(n>=7)
- display1(x,y,z); //顯示秒表
- }
- }
-
-
- void T0_time()interrupt 1 //中斷計時0時鐘
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- num2++;
- if(num2==20)
- {
- num2=0;
- num++;
- if(num==60)
- {
- num=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- shi=0;
- }
- }
- }
- }
- void T1_time()interrupt 3//中斷1計時秒表 和 閃爍程序
- {
- TH1=(65536-10000)/256;
- TL1=(65536-10000)%256;
- if(n==7) //秒表程序
- {
- z++;
- if(z==100)
- {
- z=0;
- y++;
- if(y==60)
- {
- y=0;
- x++;
- if(x==60)
- x=0;
- }
-
- }
- }
- else //閃爍程序
- {
- b++;
- if(b==50)
- b=0;
- }
-
- }
復制代碼
|