|
- #include<reg52.h> //頭文件
- #include<intrins.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned int
- sbit key1=P1^0; //位聲明
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit fmq=P3^3;//鬧鐘
- uchar code table[]={0xc0,0xf9,0xa4,//數碼管顯示的數值
- 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
- 0x40,0x79,0x24,//帶小數點的數值
- 0x30,0x19,0x12,0x02,0x78,0x00,0x10};
- void jia(); //函數聲明
- void jian();
- uchar table_1[6]; //定義數組,數組內含有6個數值
- uchar table_2[6];
- uchar shi=23,fen=59,miao=50; //顯示初始值
- uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;//定義全局變量
- uchar flag,flag1,cnt,count;//定義全局變量
- void delay(uchar i) //延時函數,用于動態掃描數碼管
- {
- uchar x,y;
- for(x=i;x>0;x--)
- for(y=110;y>0;y--);
- }
- void init() //初始化函數
- {
- TMOD=0X01; //工作方式1
- TH0=(65536-50000)/256; //定時時間為:50ms
- TL0=(65536-50000)%256;
- ET0=1; //打開定時器
- EA=1; //開總中斷
- TR0=1; //啟動定時器
- }
- void display() //顯示子函數,用于顯示時間數值
- {
- uchar i,j;
- table_1[0]=miao%10; //分離秒的各位與十位
- table_1[1]=miao/10;
- table_1[2]=fen%10+11; //分離分的各位與十位
- table_1[3]=fen/10;
- table_1[4]=shi%10+11; //分離時的各位與十位
- table_1[5]=shi/10;
- j=0x7f; //從秒到時的掃描(位選)
- for(i=0;i<6;i++)
- {
- P2=j;
- P0=table[table_1[i]];//顯示數值
- delay(10);
- j=_cror_(j,1);//循環右移
- }
- }
- void display_1() //顯示子函數,用于顯示定時時間
- {
- uchar i,j;
- table_2[0]=miao2%10; //以下含義同上
- table_2[1]=miao2/10;
- table_2[2]=fen2%10+11;
- table_2[3]=fen2/10;
- table_2[4]=shi2%10+11;
- table_2[5]=shi2/10;
- j=0x7f;
- for(i=0;i<6;i++)
- {
- P2=j;
- P0=table[table_2[i]];
- delay(10);
- j=_cror_(j,1);
- }
- }
- void shijian() //時間子函數
- {
- if(flag>=20) //判斷是否到一秒
- {
- flag=0; //到了,則標志位清零
- miao++; //秒加1
- if(miao>=60) //判斷秒是否到60s
- {
- miao=0;//到了,則清零
- fen++; //分加1
- if(fen>=59) //以下含義同上
- {
- fen=0;
- shi++;
- if(shi>23)
- shi=0;
- }
- }
- }
- }
- void key_scan() //鍵盤掃描子函數
- {
- uchar i; //定義局部變量
- if(key1==0)
- {
- while(!key1) //防止掉顯
- {
- if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
- {
- display();
- }
- if(cnt==5||cnt==6||cnt==7)
- {
- display_1();
- }
- }
- cnt++; //記下按鍵key1按下的次數
- if(cnt==1) //第一次按下,停止計數
- TR0=0;
- if(cnt==2) //第二次按下
- {
- miao1=miao; //保存秒的數值
- miao=99;//顯示99,表示可以調節秒的數值了
- for(i=0;i<100;i++)
- display(); //顯示99
- miao=miao1; //恢復前一刻秒的數值
- }
- if(cnt==3) //以下含義同上
- {
- fen1=fen;
- fen=99;
- for(i=0;i<100;i++)
- display();
- fen=fen1;
- }
- if(cnt==4)
- {
- shi1=shi;
- shi=99;
- for(i=0;i<100;i++)
- display();
- shi=shi1;
- }
- if(cnt==5)
- {
- miao1=miao2;
- miao2=88;
- for(i=0;i<100;i++)
- display_1();
- miao2=miao1;
- }
- if(cnt==6)
- {
- fen1=fen2;
- fen2=88;
- for(i=0;i<100;i++)
- display_1();
- fen2=fen1;
- }
- if(cnt==7)
- {
- shi1=shi2;
- shi2=88;
- for(i=0;i<100;i++)
- display_1();
- shi2=shi1;
- }
- if(cnt==8) //第八次按下
- {
- TR0=1; //開始計數
- cnt=0; //按下次數清零
- }
- }
- if(key2==0) //判斷key2是否按下
- {
- while(!key2) //防止掉顯
- {
- if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
- {
- display();
- }
- if(cnt==5||cnt==6||cnt==7)
- {
- display_1();
- }
- }
- jia();//調用加1的子函數
- }
- if(key3==0) //判斷key3是否按下
- {
- while(!key3) //防止掉顯
- {
- if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
- {
- display();
- }
- if(cnt==5||cnt==6||cnt==7)
- {
- display_1();
- }
- }
- jian(); //調用減1子函數
- }
- }
- void jia() //加1子函數
- {
- if(cnt==2) //判斷key1按下的次數是否為2
- {
- miao++; //是,則秒加1
- if(miao>59) //判斷秒是否大于59,是,則秒清零
- miao=0;
- }
- if(cnt==3) //以下含義同上
- {
- fen++;
- if(fen>59)
- fen=0;
- }
- if(cnt==4)
- {
- shi++;
- if(shi>23)
- shi=0;
- }
- if(cnt==5)
- {
- miao2++;
- if(miao2>59)
- miao2=0;
- }
- if(cnt==6)
- {
- fen2++;
- if(fen2>59)
- fen2=0;
- }
- if(cnt==7)
- {
- shi2++;
- if(shi2>23)
- shi2=0;
- }
- }
- void jian() //減1子函數
- {
- if(cnt==2) //判斷key1按下的次數是否為2,是則秒減1
- {
- miao--;
- if(miao==255) //判斷秒是否減到255,是,則秒清零
- miao=59;
- }
- if(cnt==3)
- {
- fen--;
- if(fen==255)
- fen=59;
- }
- if(cnt==4)
- {
- shi--;
- if(shi==255)
- shi=23;
- }
- if(cnt==5)
- {
- miao2--;
- if(miao2==255)
- miao2=59;
- }
- if(cnt==6)
- {
- fen2--;
- if(fen2==255)
- fen2=59;
- }
- if(cnt==7)
- {
- shi2--;
- if(shi2==255)
- shi2=23;
- }
- }
- void clock() //鬧鈴子函數
- {
- if(miao2==miao) //顯判斷秒的數值是否相等
- if(fen2==fen) //是,在判斷分是否相等
- if(shi2==shi) //是,再判斷時是否相等
- {
- flag1=0; //是,則標志位,flag1清零
- while(!(flag1==100)) //判斷flag1是否到100
- {
- fmq=0; //沒有,則,繼續驅動蜂鳴器響,時間約為:5s
- shijian(); //調用時間子函數
- display(); //調用顯示子函數
- }
- fmq=1;//關閉蜂鳴器
- }
- }
- void main()
- {
- init();//調用初始化子函數
- while(1)
- {
- key_scan(); //調用鍵盤掃描子函數
- shijian(); //時間子函數
- clock(); //鬧鐘子函數
- //顯示子函數
- if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
- {
- display();
- }
- if(cnt==5||cnt==6||cnt==7)
- {
- display_1();
- }
- }
- }
- void time0() interrupt 1 //定時器0
- {
- TH0=(65536-50000)/256; //初值50ms
- TL0=(65536-50000)%256;
- flag++; //標志位
- flag1++;
- }
復制代碼
|
|