1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
通過矩陣鍵盤修改STM32F103的RTC時間
[打印本頁]
作者:
yw禿頭了
時間:
2020-4-16 20:33
標題:
通過矩陣鍵盤修改STM32F103的RTC時間
思路:我想通過矩陣鍵盤修改RTC時間,通過矩陣鍵盤輸入一串字符串到數組里面,然后通過數組的值對RTC進行修改,但是數組里面有數據RTC卻無法修改時間為什么?
void set_time() //設置時間
{
unsigned char n=0;
int m;
for(;;)
{
OLED_Clear(0);
OLED_Display_Flont(0+16*2,0,flont_shijian[0]);
OLED_Display_Flont(0+16*3,0,flont_shijian[1]);
OLED_Display_Flont(0+16*4,0,flont_shijian[2]);
OLED_Display_Flont(0+16*5,0,flont_shijian[3]);
OLED_Display_Flont(0+16*1,2,flont_shijian[4]);
OLED_Display_Flont(0+16*2,2,flont_shijian[5]);
OLED_Display_Flont(0+16*3,2,flont_shijian[6]);
OLED_Display_Flont(0+16*4,2,flont_shijian[7]);
OLED_Display_Flont(0+16*5,2,flont_shijian[8]);
OLED_Display_Flont(0+16*6,2,flont_shijian[9]);
for(;;)
{
key=Key_Scan();//檢測按鍵
if(key>=0&&key<=9)
{
sjxg_time[n]=key;
printf("%d\n",sjxg_time[n]);
OLED_DisplayString(0+8*n,48,16,&sjxg_time[n]);
OLED_Refresh_GRAM();
OLED_Clear_GRAM();
n++;
}
if(key=='*')
{
yuanshi();
break;
}
if(key=='#')
{
rtc_time.year=(sjxg_time[0]-'0')*1000 +(sjxg_time[1]-'0')*100+(sjxg_time[2]-'0')*10+(sjxg_time[3]-'0');
rtc_time.mon=(sjxg_time[4]-'0')*10+(sjxg_time[5]-'0');
rtc_time.day=(sjxg_time[6]-'0')*10+(sjxg_time[6]-'0');
rtc_time.hour=(sjxg_time[8]-'0')*10+(sjxg_time[9]-'0');
rtc_time.min=(sjxg_time[10]-'0')*10+(sjxg_time[11]-'0');
rtc_time.sec=(sjxg_time[12]-'0')*10+(sjxg_time[13]-'0');
SET_RTC_TIME(rtc_time.year,rtc_time.mon,rtc_time.day,rtc_time.hour,rtc_time.min,rtc_time.sec);
memset(sjxg_time,0,sizeof(sjxg_time));
break;
}
}
break;
}
}
void RTC_IRQHandler(void)
{
u32 time;
if(RTC->CRL & 1<<0)//秒中斷標志
{
time=RTC->CNTL; //獲取低位
time|=RTC->CNTH<<16; //獲取高位
GET_RTC_TIME(time);
// printf("%d-%d-%d %d:%d:%d\r\n",rtc_time.year,rtc_time.mon,rtc_time.day,rtc_time.hour,rtc_time.min,rtc_time.sec);
yuanshi();
}
if(RTC->CRL & 1<<1)//鬧鐘中斷標志
{
printf("鬧鐘到達\r\n");
}
RTC->CRL&=~(0X3<<0);//清除中斷標志位
RTC_WaitForLastTask();
}
void yuanshi(void)
{
char str[50];
sprintf(str,"%d-%d-%d %d:%d:%d",rtc_time.year,rtc_time.mon,rtc_time.day,rtc_time.hour,rtc_time.min,rtc_time.sec);
OLED_DisplayString(0,48,16,(u8*)str);
OLED_Refresh_GRAM();
OLED_Clear_GRAM();
OLED_Display_Flont(0+16*0,0,flont_chu1[0]); //您好
OLED_Display_Flont(0+16*1,0,flont_chu1[1]);
OLED_Display_Flont(0+16*3,2,flont_chu2[0]); //請打卡!
OLED_Display_Flont(0+16*4,2,flont_chu2[1]);
OLED_Display_Flont(0+16*5,2,flont_chu2[2]);
OLED_Display_Flont(0+16*6,2,flont_chu2[3]);
}
//返回值 0代表平年 1代表閏年
u8 GET_TIME_STATE(u32 year)
{
if((year % 4 ==0 && year % 100!=0) || year %400 ==0 )return 1;
else return 0;
}
u8 mon_r[12]={31,29,31,30,31,30,31,31,30,31,30,31};
u8 mon_p[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//年月日轉秒
void SET_RTC_TIME(u32 year ,u32 mon,u32 day,u32 hour,u32 min,u32 sec)
{
u32 i;
u32 rtc_sec=0;
for(i=2020;i<year;i++)
{
if(GET_TIME_STATE(i))
{
rtc_sec+=366*24*60*60;
}
else
{
rtc_sec+=365*24*60*60;
}
}
for(i=0;i<mon-1;i++)
{
if(GET_TIME_STATE(year))
{
rtc_sec+=mon_r[i]*24*60*60;
}
else
{
rtc_sec+=mon_p[i]*24*60*60;
}
}
rtc_sec+=(day-1)*24*60*60;
rtc_sec+=hour*60*60;
rtc_sec+=min*60;
rtc_sec+=sec;
RCC->APB1ENR|=1<<28;//電源接口時鐘使能
RCC->APB1ENR|=1<<27;//備份域接口時鐘使能
PWR->CR|=1<<8;//允許對備份域和RTC的寫入
while(!(RTC->CRL& 1<<5)){}//等待RTC操作完成
RTC->CRL|=1<<4;//進入配置模式
RTC->CNTH=rtc_sec>>16;
RTC->CNTL=rtc_sec&0xFFFF;//計數值清0
RTC->CRL&=~(1<<4);//退出配置模式
while(!(RTC->CRL& 1<<5)){}//等待RTC操作完成
}
//秒轉年月日
void GET_RTC_TIME(u32 sec)
{
u32 i=0;
rtc_time.year=2020;
rtc_time.mon=1;
rtc_time.day=1;
rtc_time.hour=0;
rtc_time.min=0;
rtc_time.sec=0;
while(1)
{
if(GET_TIME_STATE(rtc_time.year))
{
if(sec>=366*24*60*60)
{
sec-=366*24*60*60;
rtc_time.year++;
}
else break;
}
else
{
if(sec>=365*24*60*60)
{
sec-=365*24*60*60;
rtc_time.year++;
}
else break;
}
}
for(i=0;i<12;i++)
{
if(GET_TIME_STATE(rtc_time.year))
{
if(sec>=mon_r[i]*24*60*60)
{
sec-=mon_r[i]*24*60*60;
rtc_time.mon++;
}
else break;
}
else
{
if(sec>=mon_p[i]*24*60*60)
{
sec-=mon_p[i]*24*60*60;
rtc_time.mon++;
}
else break;
}
}
while(1)
{
if(sec>=24*60*60)
{
sec-=24*60*60;
rtc_time.day++;
}
else break;
}
while(1)
{
if(sec>=60*60)
{
sec-=60*60;
rtc_time.hour++;
}
else break;
}
while(1)
{
if(sec>=60)
{
sec-=60;
rtc_time.min++;
}
else break;
}
rtc_time.sec=sec;
}
復制代碼
作者:
我未曾來過
時間:
2020-4-16 23:12
你的代碼沒什么注釋就看的很吃力,我覺得有可能是你中斷處理的問題,進入中斷服務函數后先關中斷,然后才執行操作,不然有可能讓中斷重復觸發導致具體操作沒能達到預期(當然也可能不是這個問題),我只是給樓主一個可能的方向
作者:
yw禿頭了
時間:
2020-4-17 10:13
我未曾來過 發表于 2020-4-16 23:12
你的代碼沒什么注釋就看的很吃力,我覺得有可能是你中斷處理的問題,進入中斷服務函數后先關中斷,然后才執 ...
我也在思考這個問題,因為我是通過OLED屏幕進行時間顯示的,在RTC中斷中一直刷新時間在屏幕上進行顯示,但是我一按按鍵就出現一下時間修改界面(時間差不多5s左右),然后就又跳到時間中斷里面一直刷新時間了,按鍵修改就沒用,一直想不明白為什么
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1