|
- #include "stm32f10x.h" // Device header
- #include "Delay.h" //延時(shí)模塊,主函數(shù)中未使用
- #include "OLED.h" //OLED顯示模塊
- #include "MyRTC.h" //RTC模塊
- #include "Key.h" //按鍵模塊
- #include "Buzzer.h" //蜂鳴器模塊
- #include "Encoder.h"
- /*
- 功能: 簡(jiǎn)易時(shí)鐘,可以通過按鍵調(diào)整日期時(shí)間和設(shè)定鬧鐘,通過OLED顯示日期時(shí)間等相關(guān)信息
-
- 原理: RTC
-
- 接線: OLED顯示屏:SCK接PB8,SDA接PB9
- 有源蜂鳴器(低電平觸發(fā)):I/O接PB12
- 1~4號(hào)獨(dú)立按鍵:分別接PB11,PB10,PB1,PB0
-
- 注意: 若出現(xiàn)沒有現(xiàn)象或時(shí)間不動(dòng)等情況,請(qǐng)查看MyRTC.c
- */
- uint16_t MyRTC_Time[] = {2024,4,11,12,0,0}; //定義全局的時(shí)間數(shù)組,數(shù)組內(nèi)容分別為年、月、日、時(shí)、分、秒
- uint32_t Alarm_CNT,Alarm_Time,Alarm_Time_Rest; //鬧鐘相關(guān)變量,單位都是秒
- uint8_t Hour,Min,Sec; //用來調(diào)整鬧鐘時(shí)間的變量
- uint8_t KeyNum ; //按鍵鍵碼值
- uint8_t Flag_Count; //是否在計(jì)時(shí)標(biāo)志,0為不在計(jì)時(shí)
- uint8_t Flag_Change; //按鍵調(diào)節(jié)鬧鐘/日期/時(shí)間,0為調(diào)節(jié)鬧鐘,1為調(diào)節(jié)日期,2為調(diào)節(jié)時(shí)間
- /*按鍵控制函數(shù)*/
- void Key_Control(void)
- {
- KeyNum = Key_GetNum(); //讀取按鍵鍵碼
-
- if(Flag_Change == 0) //調(diào)節(jié)鬧鐘
- {
- if(KeyNum == 1) //1號(hào)按鍵調(diào)整小時(shí)
- {
- Hour+= Encoder_Get();
- if(Hour > 60)
- Hour = 0;
- }
- else if(KeyNum == 2) //2號(hào)按鍵調(diào)整分鐘
- {
- Min+= Encoder_Get();
- if(Min > 60)
- Min = 0;
- }
- else if(KeyNum == 3) //3號(hào)按鍵調(diào)整秒
- {
- Sec+= Encoder_Get();
- if(Sec > 60)
- Sec = 0;
- }
- else if(KeyNum == 4) //4號(hào)按鍵
- {
- if(Buzzer_State()==0) //若蜂鳴器沒響
- {
- Alarm_Time = Hour*3600 + Min*60 + Sec; //計(jì)算鬧鐘時(shí)長(zhǎng),單位是秒
-
- if(Alarm_Time > 0)
- {
- Alarm_CNT = RTC_GetCounter()+Alarm_Time-1; //設(shè)定鬧鐘值,需要-1
- RTC_SetAlarm(Alarm_CNT); //寫入鬧鐘值到RTC的ALR寄存器
- Flag_Count = 1;
- }
- else //若鬧鐘時(shí)長(zhǎng)為0,則轉(zhuǎn)到按鍵調(diào)節(jié)日期
- {
- Flag_Change = 1;
- }
- }
- else //若蜂鳴器響
- {
- Buzzer_OFF(); //關(guān)閉蜂鳴器
- OLED_ShowString(4,1," "); //刷新oled第四行
- }
- }
- }
-
- else if(Flag_Change == 1) //調(diào)節(jié)日期
- {
- Delay_ms(2000);
- KeyNum = Key_GetNum();
- if(KeyNum == 1) //1號(hào)按鍵調(diào)整年
- {
- MyRTC_Time[0]+= Encoder_Get();
- MyRTC_SetTime();
- }
- else if(KeyNum == 2) //2號(hào)按鍵調(diào)整月
- {
- MyRTC_Time[1]+= Encoder_Get();
- MyRTC_SetTime();
- }
- else if(KeyNum == 3) //3號(hào)按鍵調(diào)整日
- {
- MyRTC_Time[2]+= Encoder_Get();
- MyRTC_SetTime();
- }
- else if(KeyNum == 4) //4號(hào)按鍵,改為調(diào)整時(shí)間
- {
- Flag_Change = 2;
- }
- }
-
- else if(Flag_Change == 2) //調(diào)節(jié)時(shí)間
- {
- Delay_ms(2000);
- KeyNum = Key_GetNum();
- if(KeyNum == 1) //1號(hào)按鍵調(diào)整小時(shí)
- {
- MyRTC_Time[3]+= Encoder_Get();
- MyRTC_SetTime();
- }
- else if(KeyNum == 2) //2號(hào)按鍵調(diào)整分鐘
- {
- MyRTC_Time[4]+= Encoder_Get();
- MyRTC_SetTime();
- }
- else if(KeyNum == 3) //3號(hào)按鍵調(diào)整秒
- {
- MyRTC_Time[5]+= Encoder_Get();
- MyRTC_SetTime();
- }
- else if(KeyNum == 4) //4號(hào)按鍵
- {
- Flag_Change = 0; //改為調(diào)整鬧鐘
- OLED_ShowString(4,1," "); //刷新oled第四行
- }
- }
- }
- int main(void)
- {
- /*模塊初始化*/
- OLED_Init(); //OLED初始化
- MyRTC_Init(); //RTC初始化
- Key_Init(); //按鍵初始化
- Buzzer_Init(); //蜂鳴器初始化
- Encoder_Init(); //旋轉(zhuǎn)編碼器初始化
-
- /*顯示靜態(tài)字符串*/
- OLED_ShowString(1, 1, "Date:XXXX-XX-XX");
- OLED_ShowString(2, 1, "Time:XX:XX:XX");
- OLED_ShowString(3, 1, "Alarm:XX:XX:XX");
- while (1)
- {
- MyRTC_ReadTime(); //RTC讀取時(shí)間,最新的時(shí)間存儲(chǔ)到MyRTC_Time數(shù)組中
- Key_Control(); //調(diào)用按鍵控制函數(shù)
- OLED_ShowNum(1, 6, MyRTC_Time[0], 4); //顯示MyRTC_Time數(shù)組中的時(shí)間值,年
- OLED_ShowNum(1, 11, MyRTC_Time[1], 2); //月
- OLED_ShowNum(1, 14, MyRTC_Time[2], 2); //日
- OLED_ShowNum(2, 6, MyRTC_Time[3], 2); //時(shí)
- OLED_ShowNum(2, 9, MyRTC_Time[4], 2); //分
- OLED_ShowNum(2, 12, MyRTC_Time[5], 2); //秒
- OLED_ShowNum(4, 15, Key_GetNum(), 2); //秒
-
- if(Flag_Count) //正在計(jì)時(shí),則顯示鬧鐘響起剩余時(shí)間
- {
- Alarm_Time_Rest = Alarm_CNT-RTC_GetCounter()+1; //計(jì)算鬧鐘響起剩余時(shí)間
- if(Alarm_Time_Rest > Alarm_Time) //防止溢出錯(cuò)誤
- Alarm_Time_Rest = 0;
-
- OLED_ShowNum(3,7,Alarm_Time_Rest/3600,2); //顯示剩余小時(shí)
- OLED_ShowNum(3,10,(Alarm_Time_Rest%3600)/60,2); //顯示剩余分鐘
- OLED_ShowNum(3,13,(Alarm_Time_Rest%3600)%60,2); //顯示剩余秒
-
- if(RTC_GetFlagStatus(RTC_FLAG_ALR) == 1) //鬧鐘時(shí)間到,檢查標(biāo)志位為1
- {
- RTC_ClearFlag(RTC_FLAG_ALR); //清除標(biāo)志位
- Flag_Count = 0;Alarm_Time = 0; //重置相關(guān)參數(shù)
- Hour = 0;Min = 0; Sec = 0;
-
- Buzzer_ON(); //打開蜂鳴器
- OLED_ShowString(4,1,"Time Out");
- }
- else //鬧鐘時(shí)間未到
- {
- OLED_ShowString(4,1,"Counting"); //顯示正在計(jì)時(shí)
- }
- }
- else //不在計(jì)時(shí),則顯示需要設(shè)定的鬧鐘時(shí)間
- {
- OLED_ShowNum(3,7,Hour,2);
- OLED_ShowNum(3,10,Min,2);
- OLED_ShowNum(3,13,Sec,2);
- }
-
- if(Flag_Change == 1) //顯示“調(diào)節(jié)日期”
- {
- OLED_ShowString(4,1,"Change Date");
- }
- else if(Flag_Change == 2) //顯示“調(diào)節(jié)時(shí)間”
- {
- OLED_ShowString(4,1,"Change Time");
- }
- }
- }
復(fù)制代碼
原理圖: 無
仿真: 無
代碼:
Project.7z
(187.52 KB, 下載次數(shù): 24)
2024-7-4 23:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|