欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

         找回密碼
         立即注冊

        QQ登錄

        只需一步,快速開始

        搜索
        查看: 2978|回復(fù): 2
        收起左側(cè)

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

        [復(fù)制鏈接]
        ID:711830 發(fā)表于 2020-4-16 20:33 | 顯示全部樓層 |閱讀模式
        思路:我想通過矩陣鍵盤修改RTC時間,通過矩陣鍵盤輸入一串字符串到數(shù)組里面,然后通過數(shù)組的值對RTC進行修改,但是數(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("鬧鐘到達\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;//進入配置模式        
        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ù)制代碼

        回復(fù)

        使用道具 舉報

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

        使用道具 舉報

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

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

        使用道具 舉報

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

        本版積分規(guī)則

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

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

        快速回復(fù) 返回頂部 返回列表