久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2805|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

通過矩陣鍵盤修改STM32F103的RTC時間

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:711830 發(fā)表于 2020-4-16 20:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
思路:我想通過矩陣鍵盤修改RTC時間,通過矩陣鍵盤輸入一串字符串到數(shù)組里面,然后通過數(shù)組的值對RTC進(jìn)行修改,但是數(shù)組里面有數(shù)據(jù)RTC卻無法修改時間為什么?

  1. void set_time() //設(shè)置時間
  2. {
  3.         unsigned char n=0;
  4.         int m;
  5.         for(;;)
  6.         {
  7.                 OLED_Clear(0);
  8.                 OLED_Display_Flont(0+16*2,0,flont_shijian[0]);
  9.                 OLED_Display_Flont(0+16*3,0,flont_shijian[1]);
  10.                 OLED_Display_Flont(0+16*4,0,flont_shijian[2]);
  11.                 OLED_Display_Flont(0+16*5,0,flont_shijian[3]);
  12.                 OLED_Display_Flont(0+16*1,2,flont_shijian[4]);
  13.                 OLED_Display_Flont(0+16*2,2,flont_shijian[5]);
  14.                 OLED_Display_Flont(0+16*3,2,flont_shijian[6]);
  15.                 OLED_Display_Flont(0+16*4,2,flont_shijian[7]);
  16.                 OLED_Display_Flont(0+16*5,2,flont_shijian[8]);
  17.                 OLED_Display_Flont(0+16*6,2,flont_shijian[9]);
  18.                 for(;;)
  19.                 {
  20.                         key=Key_Scan();//檢測按鍵
  21.                         if(key>=0&&key<=9)
  22.                         {
  23.                                                 sjxg_time[n]=key;
  24.                                                 printf("%d\n",sjxg_time[n]);
  25.                                                 OLED_DisplayString(0+8*n,48,16,&sjxg_time[n]);
  26.                                                 OLED_Refresh_GRAM();
  27.                                                 OLED_Clear_GRAM();
  28.                                                 n++;

  29.                         }
  30.                         if(key=='*')
  31.                         {
  32.                                  yuanshi();
  33.                                  break;
  34.                         }
  35.                         if(key=='#')
  36.                         {
  37.                                 rtc_time.year=(sjxg_time[0]-'0')*1000 +(sjxg_time[1]-'0')*100+(sjxg_time[2]-'0')*10+(sjxg_time[3]-'0');
  38.                                 rtc_time.mon=(sjxg_time[4]-'0')*10+(sjxg_time[5]-'0');
  39.                                 rtc_time.day=(sjxg_time[6]-'0')*10+(sjxg_time[6]-'0');
  40.                                 rtc_time.hour=(sjxg_time[8]-'0')*10+(sjxg_time[9]-'0');
  41.                                 rtc_time.min=(sjxg_time[10]-'0')*10+(sjxg_time[11]-'0');
  42.                                 rtc_time.sec=(sjxg_time[12]-'0')*10+(sjxg_time[13]-'0');
  43.                                 SET_RTC_TIME(rtc_time.year,rtc_time.mon,rtc_time.day,rtc_time.hour,rtc_time.min,rtc_time.sec);
  44.                                 memset(sjxg_time,0,sizeof(sjxg_time));
  45.                                 break;
  46.                         }
  47.                 }
  48.                 break;
  49.         }
  50. }



  51. void RTC_IRQHandler(void)
  52. {
  53.         u32 time;
  54.         if(RTC->CRL & 1<<0)//秒中斷標(biāo)志
  55.         {
  56.                 time=RTC->CNTL;       //獲取低位
  57.                 time|=RTC->CNTH<<16;  //獲取高位
  58.                 GET_RTC_TIME(time);
  59. //                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);
  60.                 yuanshi();
  61.         }
  62.         if(RTC->CRL & 1<<1)//鬧鐘中斷標(biāo)志
  63.         {
  64.                 printf("鬧鐘到達(dá)\r\n");
  65.         }
  66.         RTC->CRL&=~(0X3<<0);//清除中斷標(biāo)志位
  67.         RTC_WaitForLastTask();                              
  68. }

  69. void yuanshi(void)
  70. {
  71.         char str[50];
  72.         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);
  73.         OLED_DisplayString(0,48,16,(u8*)str);
  74.         OLED_Refresh_GRAM();
  75.                
  76.         OLED_Clear_GRAM();
  77.         OLED_Display_Flont(0+16*0,0,flont_chu1[0]); //您好
  78.         OLED_Display_Flont(0+16*1,0,flont_chu1[1]);
  79.                
  80.         OLED_Display_Flont(0+16*3,2,flont_chu2[0]); //請打卡!
  81.         OLED_Display_Flont(0+16*4,2,flont_chu2[1]);
  82.         OLED_Display_Flont(0+16*5,2,flont_chu2[2]);
  83.         OLED_Display_Flont(0+16*6,2,flont_chu2[3]);
  84. }
  85. //返回值  0代表平年  1代表閏年
  86. u8 GET_TIME_STATE(u32 year)
  87. {
  88.         if((year % 4 ==0 && year % 100!=0) || year %400 ==0 )return 1;
  89.         else return 0;
  90. }

  91. u8 mon_r[12]={31,29,31,30,31,30,31,31,30,31,30,31};
  92. u8 mon_p[12]={31,28,31,30,31,30,31,31,30,31,30,31};

  93. //年月日轉(zhuǎn)秒
  94. void SET_RTC_TIME(u32 year ,u32 mon,u32 day,u32 hour,u32 min,u32 sec)
  95. {
  96.         u32 i;
  97.         u32 rtc_sec=0;
  98.         for(i=2020;i<year;i++)
  99.         {
  100.                 if(GET_TIME_STATE(i))
  101.                 {
  102.                         rtc_sec+=366*24*60*60;
  103.                 }
  104.                 else
  105.                 {
  106.                         rtc_sec+=365*24*60*60;
  107.                 }
  108.         }
  109.         for(i=0;i<mon-1;i++)
  110.         {
  111.                 if(GET_TIME_STATE(year))
  112.                 {
  113.                         rtc_sec+=mon_r[i]*24*60*60;
  114.                 }
  115.                 else
  116.                 {
  117.                         rtc_sec+=mon_p[i]*24*60*60;
  118.                 }
  119.         }
  120.         rtc_sec+=(day-1)*24*60*60;
  121.         rtc_sec+=hour*60*60;
  122.         rtc_sec+=min*60;
  123.         rtc_sec+=sec;
  124.         
  125.         RCC->APB1ENR|=1<<28;//電源接口時鐘使能
  126.         RCC->APB1ENR|=1<<27;//備份域接口時鐘使能
  127.         PWR->CR|=1<<8;//允許對備份域和RTC的寫入
  128.         while(!(RTC->CRL& 1<<5)){}//等待RTC操作完成
  129.         RTC->CRL|=1<<4;//進(jìn)入配置模式        
  130.         RTC->CNTH=rtc_sec>>16;
  131.         RTC->CNTL=rtc_sec&0xFFFF;//計數(shù)值清0
  132.         RTC->CRL&=~(1<<4);//退出配置模式        
  133.         while(!(RTC->CRL& 1<<5)){}//等待RTC操作完成
  134. }
  135. //秒轉(zhuǎn)年月日
  136. void GET_RTC_TIME(u32 sec)
  137. {
  138.         u32 i=0;
  139.         rtc_time.year=2020;
  140.         rtc_time.mon=1;
  141.         rtc_time.day=1;
  142.         rtc_time.hour=0;
  143.         rtc_time.min=0;
  144.         rtc_time.sec=0;
  145.         
  146.         while(1)
  147.         {
  148.                 if(GET_TIME_STATE(rtc_time.year))
  149.                 {
  150.                         if(sec>=366*24*60*60)
  151.                         {
  152.                                 sec-=366*24*60*60;
  153.                                 rtc_time.year++;
  154.                         }
  155.                         else break;
  156.                 }
  157.                 else
  158.                 {
  159.                         if(sec>=365*24*60*60)
  160.                         {
  161.                                 sec-=365*24*60*60;
  162.                                 rtc_time.year++;
  163.                         }
  164.                         else break;
  165.                 }
  166.         }
  167.         for(i=0;i<12;i++)
  168.         {
  169.                 if(GET_TIME_STATE(rtc_time.year))
  170.                 {
  171.                         if(sec>=mon_r[i]*24*60*60)
  172.                         {
  173.                                 sec-=mon_r[i]*24*60*60;
  174.                                 rtc_time.mon++;
  175.                         }
  176.                         else break;
  177.                 }
  178.                 else
  179.                 {
  180.                         if(sec>=mon_p[i]*24*60*60)
  181.                         {
  182.                                 sec-=mon_p[i]*24*60*60;
  183.                                 rtc_time.mon++;
  184.                         }
  185.                         else break;
  186.                 }
  187.         }
  188.         while(1)
  189.         {
  190.                 if(sec>=24*60*60)
  191.                 {
  192.                         sec-=24*60*60;
  193.                         rtc_time.day++;
  194.                 }
  195.                 else break;
  196.         }
  197.         while(1)
  198.         {
  199.                 if(sec>=60*60)
  200.                 {
  201.                         sec-=60*60;
  202.                         rtc_time.hour++;
  203.                 }
  204.                 else break;
  205.         }
  206.         while(1)
  207.         {
  208.                 if(sec>=60)
  209.                 {
  210.                         sec-=60;
  211.                         rtc_time.min++;
  212.                 }
  213.                 else break;
  214.         }
  215.         rtc_time.sec=sec;
  216. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:729982 發(fā)表于 2020-4-16 23:12 | 只看該作者
你的代碼沒什么注釋就看的很吃力,我覺得有可能是你中斷處理的問題,進(jìn)入中斷服務(wù)函數(shù)后先關(guān)中斷,然后才執(zhí)行操作,不然有可能讓中斷重復(fù)觸發(fā)導(dǎo)致具體操作沒能達(dá)到預(yù)期(當(dāng)然也可能不是這個問題),我只是給樓主一個可能的方向
回復(fù)

使用道具 舉報

板凳
ID:711830 發(fā)表于 2020-4-17 10:13 | 只看該作者
我未曾來過 發(fā)表于 2020-4-16 23:12
你的代碼沒什么注釋就看的很吃力,我覺得有可能是你中斷處理的問題,進(jìn)入中斷服務(wù)函數(shù)后先關(guān)中斷,然后才執(zhí) ...

我也在思考這個問題,因為我是通過OLED屏幕進(jìn)行時間顯示的,在RTC中斷中一直刷新時間在屏幕上進(jìn)行顯示,但是我一按按鍵就出現(xiàn)一下時間修改界面(時間差不多5s左右),然后就又跳到時間中斷里面一直刷新時間了,按鍵修改就沒用,一直想不明白為什么
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 超碰免费在线 | 欧美日韩国产三级 | 中文字幕国产精品视频 | 亚洲交性 | 成人精品一区二区三区中文字幕 | 国产毛片av | 国产香蕉视频在线播放 | 久久33| 成人在线激情 | 一级做a爰片性色毛片视频停止 | 国产精品一区二区在线观看 | 国产精品国产精品国产专区不片 | 欧美一区二区三区小说 | 日韩一区精品 | 久久精品无码一区二区三区 | 国产成人免费视频 | 国产精品久久久久久久久图文区 | 91看片网 | 少妇一区二区三区 | 亚洲男女激情 | 7799精品视频天天看 | 成人午夜电影在线观看 | 国产高潮好爽受不了了夜色 | 欧美日一区二区 | av中文字幕网 | 在线一区视频 | 久久在视频 | a在线视频观看 | 91精品久久久久久久久 | 亚洲 欧美 日韩 在线 | 亚洲男人天堂 | 日韩av高清 | 福利视频三区 | 国产精品久久久久久久久久久久冷 | 午夜一区二区三区在线观看 | 国产99久久精品一区二区永久免费 | 一区二区久久 | 欧美一级三级在线观看 | 美国黄色一级片 | 亚洲成人av一区二区 | 视频三区 |