|
- #include<reg51.h>
- #include<lcd1602.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key0=P1^0;
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit key3=P1^3;
- sbit buzzer=P2^5;
- sbit relay=P2^3;//buzzer & relay均為低電平工作
- sbit led=P2^4;
- sbit lamp=P2^5;
- uchar code date[]=" H.I.T. CHINA ";
- uchar code time[]=" ALARM 23:58 ";
- uchar code bell[]=" ALARM : ";
- uchar second=40,minute=58,hour=23,counter=0;
- uchar bellminute=0,bellhour=0;
- uchar buzzerflag,clockflag;//若標(biāo)志為1,則工作
- void ledshow()//led閃爍,標(biāo)示程序開(kāi)始運(yùn)轉(zhuǎn)
- {
- uchar i;
- for(i=0;i<=100;i++)
- {
- led=~led;
- delay(5);
- }
- }
- uchar keyscan()//鍵盤掃描
- {
- uchar keyvalue,temp;
-
- keyvalue=0;
- P1=0xff;
- temp=P1;
- if(~(P1&temp))
- {
- switch(temp)
- {
- case 0xfe:
- keyvalue=1;
- break;
- case 0xfd:
- keyvalue=2;
- break;
- case 0xfb:
- keyvalue=3;
- break;
- case 0xf7:
- keyvalue=4;
- break;
- default:
- keyvalue=0;
- break;
- }
- }
- return keyvalue;
- }
- void clock_init()//lcd時(shí)鐘寫(xiě)入初始化
- {
- uchar i,j;
- for(i=0;i<16;i++)
- {
- write_data(date[i]);[/i][i]
- }
- write_com(0x80+0x40);
- for(j=0;j<16;j++)
- {
- write_data(time[j]);
- }
- }
- void timer0_init()//中斷初始化
- {
- EA=1;
- ET0=1;
- TMOD=0x01;
- TH0=0xd8;//每10m中斷一次
- TL0=0xf0;
- TR0=1;
- }
- void clock_write()//時(shí)鐘實(shí)時(shí)寫(xiě)入
- {
- write_sfm(0x49,hour);
- write_sfm(0x4c,minute);
- }
- void key_menu()//總鍵盤掃描函數(shù)
- {
- unsigned char keyvalue_menu=0,keyvalue_change=0,i,j;
- keyvalue_menu=keyscan();
- if(keyvalue_menu)
- {
- if(keyvalue_menu==1)//按鍵1,走時(shí)停止,開(kāi)始更改時(shí)鐘值
- {
- while(~key0);//防抖
- TR0=0;
- do{
- keyvalue_change=keyscan();
- if(keyvalue_change==1)//按下1鍵,更改小時(shí)
- {
- while(~key0);
- if(hour<23)
- {
- hour++;
- }
- else
- {
- hour=0;
- }
- }
- else if(keyvalue_change==2)//按下2鍵,更改分鐘
- {
- while(~key1);
- if(minute<59)
- {
- minute++;
- }
- else
- {
- minute=0;
- }
- }
- else if(keyvalue_change==4)//按下4鍵,更改響鈴方式
- {
- while(~key3);
- buzzerflag=~buzzerflag;
- if(buzzerflag)//鬧鈴運(yùn)轉(zhuǎn),3聲
- {
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- }
- else//鬧鈴關(guān)閉,1聲
- {
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- }
- }
- write_sfm(0x49,hour);
- write_sfm(0x4c,minute);
- }while(keyvalue_change!=3);//按下3鍵,從新開(kāi)始走時(shí)
- while(~key2==0);
- TR0=1;//調(diào)整時(shí)間后從新開(kāi)始走時(shí)
- }
- else if(keyvalue_menu==2)//按鍵2,走時(shí)繼續(xù),顯示鬧鐘值
- {
- while(~key1);//防抖
- do{
- for(i=0;i<16;i++)
- {
- write_data(date[i]);[/i][i]
- }
- write_com(0x80+0x40);
- for(j=0;j<16;j++)
- {
- write_data(bell[j]);
- }
- write_sfm(0x49,bellhour);
- write_sfm(0x4c,bellminute);
- keyvalue_change=keyscan();
- }while(keyvalue_change!=3);//未完成設(shè)置前始終顯示當(dāng)前鬧鐘
- while(~key2);
- }
- else if(keyvalue_menu==3)//按鍵3,走時(shí)繼續(xù),設(shè)置鬧鐘值
- {
- while(~key2);
- do{
- if(keyvalue_change==1)//按下1鍵,更改小時(shí)
- {
- while(~key0);
- if(bellhour<23)
- {
- bellhour++;
- }
- else
- {
- bellhour=0;
- }
- }
- else if(keyvalue_change==2)//按下2鍵,更改分鐘
- {
- while(~key1);
- if(bellminute<59)
- {
- bellminute++;
- }
- else
- {
- bellminute=0;
- }
- }
- else if(keyvalue_change==4)//按下4鍵,更改響鈴方式
- {
- while(~key3);
- buzzerflag=~buzzerflag;
- if(buzzerflag)//鬧鈴運(yùn)轉(zhuǎn),3聲
- {
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- }
- else//鬧鈴關(guān)閉,1聲
- {
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- }
- }
- for(i=0;i<16;i++) //實(shí)時(shí)顯示修改結(jié)果
- {
- write_data(date[i]);[/i][i]
- }
- write_com(0x80+0x40);
- for(j=0;j<16;j++)
- {
- write_data(bell[j]);
- }
- write_sfm(0x49,bellhour);
- write_sfm(0x4c,bellminute);
- keyvalue_change=keyscan();
- }while(keyvalue_change!=3);//按下3鍵,重新開(kāi)始顯示走時(shí)
- while(~key2);//防抖
- }
- else if(keyvalue_menu==4)//按鍵4,關(guān)閉/開(kāi)啟鬧鐘
- {
- while(~key2);
- clockflag=!clockflag;
- if(clockflag)//鬧鐘運(yùn)轉(zhuǎn),3聲
- {
- [color=#f4a460] buzzer=0;[/color]
- [color=#f4a460] delay(100);[/color]
- [color=#f4a460] buzzer=1;[/color]
- [color=#f4a460] delay(100);[/color]
- [color=#f4a460] buzzer=0;[/color]
- [color=#f4a460] delay(100);[/color]
- [color=#f4a460] buzzer=1;[/color]
- [color=#f4a460] delay(100);[/color]
- [color=#f4a460] buzzer=0;[/color]
- [color=#f4a460] delay(100);[/color]
- [color=#f4a460] buzzer=1;[/color]
- [color=#f4a460] delay(100);[/color]
- }
- else//鬧鐘關(guān)閉,1聲
- {
- buzzer=0;
- delay(100);
- buzzer=1;
- delay(100);
- }
- }
- }
- }
- void alarm_clock()
- {
- if((minute==bellminute)&&(hour==bellhour)&&(clockflag))//鬧鐘打開(kāi)且達(dá)到預(yù)設(shè)時(shí)間時(shí)啟動(dòng)鬧鐘
- {
- if(buzzerflag)//如果鬧鈴打開(kāi)
- {
- relay=0;
- buzzer=0;
- }
- else
- {
- relay=0;
- buzzer=1;
- }
- }
- else
- {
- relay=1;
- buzzer=1;
- }
- }
- void main()
- {
- ledshow();//程序啟動(dòng),led閃爍
- init1602();//lcd初始化
- clock_init();//時(shí)鐘初始化
- timer0_init();//中斷初始化
- while(1)
- {
- clock_write();
- key_menu();
- alarm_clock();
- }
- }
- void timer0() interrupt 1
- {
- if(counter<100) //判斷時(shí)間變換問(wèn)題
- {
- counter++;
- }
- else
- {
- counter=0;
- led=~led;
- if(second<59)
- {
- second++;
- }
- else
- {
- second=0;
- if(minute<59)
- {
- minute++;
- }
- else
- {
- minute=0;
- if(hour<23)
- {
- hour++;
- }
- else
- {
- hour=0;
- }
- }
- }
- }
- TH0=0xd8;//重新加載中斷值
- TL0=0xf0;
- TR0=1;
- }
復(fù)制代碼
|
|