久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32單片機rtc鬧鐘,旋鈕,按鍵調節時間日期代碼
[打印本頁]
作者:
今天沒吃飽
時間:
2024-7-4 22:41
標題:
STM32單片機rtc鬧鐘,旋鈕,按鍵調節時間日期代碼
#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
作者:
觸景情傷
時間:
2024-7-9 23:54
精度怎么樣?
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
av香蕉
|
久久黄色网
|
91久久综合
|
欧美一区视频
|
综合久久综合久久
|
在线不卡av
|
精品在线视频播放
|
天天干天天玩天天操
|
日韩在线免费视频
|
午夜男人天堂
|
日韩精品免费一区二区在线观看
|
日本特黄a级高清免费大片 成年人黄色小视频
|
久久久久国产精品人
|
在线免费亚洲视频
|
日本大香伊一区二区三区
|
国产精品伦理一区
|
91精品国产色综合久久
|
国产精品地址
|
xxxxxx国产
|
精品人伦一区二区三区蜜桃网站
|
国产高清自拍视频在线观看
|
一区二区三区免费
|
亚洲精品电影网在线观看
|
一区在线视频
|
一区二区视频
|
久久99国产精一区二区三区
|
久久婷婷色
|
爱草在线
|
一二三四在线视频观看社区
|
久久精品成人热国产成
|
6996成人影院网在线播放
|
亚洲欧美在线一区
|
成人免费黄视频
|
久久国产精品一区
|
a级大片免费观看
|
国产美女精品
|
天堂中文av
|
国产一区 日韩
|
久久久久成人精品
|
欧美激情久久久
|
欧美天堂
|