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