#include <reg52.h> #include<intrins.h> #include<stdio.h> #include"zm.h" #include"delay.h" #include"lcd12864.h" #include"ds18b20.h" #include"ds1302.h" #include"process.h" /*------------------------------------ 全局變量定義 ------------------------------------*/ bit Temperature_Flag; //讀取并顯示溫度標(biāo)簽,使溫度刷新頻率低些 //bit Re_Time_Flag; //bit Flag1; //進(jìn)入子菜單后置標(biāo)志,中斷一次Menu_Count自加一次 bit Bell_Work; /*------------------------------------ 轉(zhuǎn)換表 ------------------------------------*/ //code UINT8 *WEEK_TAB[]={"一","二","三","四","五","六","日",}; //星期中文字庫表 /*------------------------------------ 函數(shù)聲明部分 ------------------------------------*/ //void Display_Time(); //void System_BootScreen(); //void Timer0_Init(); //void Int0_Init(); //void Display_Temperature(); //UINT8 Conver_Week(bit c,UINT8 year,UINT8 month,UINT8 date); /*------------------------------------ 啟動畫面 ------------------------------------*/ void System_BootScreen() { UINT8 i; LCD_SendImg128x64(User0_128x64); //歡迎畫面 for(i=0;i<10;i++) DelayMs(255); //畫面延時 LCD_SendImg128x64(User1_128x64); //照片顯示 for(i=0;i<10;i++) DelayMs(255); } /*------------------------------------ 初始化定時器 ------------------------------------*/ void Timer_1 int() { TMOD|=0x11; //兩個定時器置方式一 IE=0X8a; //開總中斷開關(guān)和兩個定時器中斷開關(guān) PT1=1; //按鍵音產(chǎn)生中斷T1權(quán)拉高,使之能在INT0下產(chǎn)生聲響 TR0=1; //開啟定時器0,刷新用 //PX0=1; //TR1=1; } /*------------------------------------ 初始化INT0 ------------------------------------*/ void int0_Init() { EX0=1; //打開外中斷0,中斷允許 IT0=1; //設(shè)置下降沿觸發(fā) } /*------------------------------------ INT0中斷處理函數(shù) ------------------------------------*/ Void int0_IRQ() interrupt 0 { Menu_Flag=1; //進(jìn)入主菜單標(biāo)簽 TR1=1; //開啟TR1有按鍵音 while(!KEY_MENU) ; //等待按鍵結(jié)束,使用中斷做按鍵,能讓它實(shí)時性比較 TR1=0; //按鍵結(jié)束,按鍵音結(jié)束 if(Menu0) //子菜單0(設(shè)置時間進(jìn)入后) { Set_Hour=~Set_Hour; //因為只有時鐘和分鐘個設(shè)置,0和1兩種狀態(tài)能區(qū)分了 } else if(Menu1) //子菜單1(設(shè)置日期進(jìn)入后) Menu1_Flag=1; //為減少中斷代碼長度,事實(shí)證明,用個標(biāo)志更好 else if(Menu2) Menu2_Flag=1; else if(Menu3) Set_Bright=~Set_Bright; //子菜單3(背景光開關(guān)) else if(Menu4) Set_Speaker=~Set_Speaker; //子菜單4(按鍵音開關(guān)) Refresh_SetTime=1; //在子狀態(tài)中任何狀態(tài)按一下都會使產(chǎn)生刷新顯示標(biāo)簽。 } /*------------------------------------ T0中斷處理函數(shù) ------------------------------------*/ void Timer0_IRQ() interrupt 1 { static UINT8 i; TH0=0x3; TL0=-50000%256; i++; if(i==80) Temperature_Flag=1; //2.5s中產(chǎn)生一次(讀取并刷新溫度的標(biāo)簽) } /*------------------------------------ T1中斷處理函數(shù) ------------------------------------*/ void Timer1_IRQ() interrupt 3 { TH1=-600/256; //產(chǎn)生某種頻率的按鍵音 TL1=-600%256; //經(jīng)測試,2000HZ~4000HZ左右的比較適合做按鍵音 SPEAKER=~SPEAKER; //產(chǎn)生方波 提供某種頻率的按鍵音 } /*------------------------------------ 主函數(shù) ------------------------------------*/ void main() { LCD_ClearGDRAM(); //清除DDRAM和GDRAM的顯示 System_BootScreen(); //啟動畫面 DS1302_Init(); //初始化DS1302 Int0_Init(); //初始化外中斷0 LCD_Init(); //初始化12864 Timer_Init(); //初始化定時器 LCD_ClearGDRAM(); //清屏DDRAM和GDRAM LCD_SetCGRAM(1,User1_16x16);//寫入CGRAM自定義字符 主菜單指向箭頭 LCD_SetCGRAM(0,User0_16x16);//鬧鐘標(biāo)志 LCD_SetCGRAM(2,User2_16x16);//℃ LCD_SetCGRAM(3,User4_16x16);//溫度計 Display_Temperature(); //開始的時候先顯示下溫度,使界面比較完整不會空缺 SPEAKER=0; //斷開喇叭,使之不會長時間導(dǎo)通燒壞 BRIGHT=1; //打開背景光 while(1) { SPEAKER=0; //斷開喇叭,使之不會長時間導(dǎo)通燒壞 if(Temperature_Flag) //大循環(huán)下,溫度標(biāo)簽置位后刷新顯示溫度 { Temperature_Flag=0; //清零標(biāo)簽 Display_Temperature(); } if(!Menu_Flag) //沒有菜單標(biāo)簽則顯示主時鐘界面 { DS1302_ReadDate(); //讀取日期 if(Bell_Flag) //Bell標(biāo)志被置位,表明在設(shè)置菜單里,開始定時了,開始往下執(zhí)行,等待定時到 { if(Hour==Bell_Hour&&Minute==Bell_Minute) { LCD_ClearGDRAM(); LCD_SendImg128x64(User2_128x64); Bell_Work=1; ET1=1; TR1=1; while(1) { if(!KEY_ENTER) { DelayMs(10); if(!KEY_ENTER) { while(!KEY_ENTER); Bell_Flag=0; Temperature_Flag=1; Bell_Work=0; TR1=0; Menu_Flag=0; LCD_ClearGDRAM(); LCD_Init(); break; } } } } } Display_Date(); //填充顯示日期 Display_Week(); //填充顯示星期 DS1302_ReadTime(); //讀取時間 Display_Time(); //填充顯示時間 } else if(Menu_Flag) //顯示控制界面 { LCD_ClearGDRAM(); //清屏之前的主時鐘界面 LCD_RefreshMenu(); //菜單顯示 FanHui1=0; //清零FanHui1標(biāo)簽,使之每一次進(jìn)入菜單后都能停在下面那個while菜單循環(huán)中 //guide_old++; // while(!FanHui1) //FanHui沒有被置1,死循環(huán),當(dāng)主菜單下按了返回則置1,跳出循環(huán) { MainMenu_Pro(); //主菜單處理函數(shù) SPEAKER=0; //斷開喇叭,使之不會長時間導(dǎo)通燒壞 while(Enter_Menu) //進(jìn)入子菜單標(biāo)簽 { if(Menu0) Menu0_Pro(); //子菜單0處理函數(shù) else if(Menu1) Menu1_Pro(); else if(Menu2) Menu2_Pro(); else if(Menu3) Menu3_Pro(); else if(Menu4) Menu4_Pro(); else if(Menu5) Menu5_Pro(); SPEAKER=0; //斷開喇叭,使之不會長時間導(dǎo)通燒壞 } }//一級菜單while() Temperature_Flag=1; //每當(dāng)退出主菜單,重新顯示溫度 }//顯示界面塊 } } |