【实验目的】实现一个创意的OLED时钟
【硬件】
  • Mini-F5330开发板
  • OLED显示屏
【实验步聚】
  • 复制OLED显示工程,重命为RTC_clock。
  • 复制一份官方例程RTC_Calendar中的rt_calendar.c/h到新工程的RTC文件夹下。
140246cqq5rfzl311ia1qa
3、把rt_calendar.c添加到工程中的RTC分组中,并把头文件添另进工程。
140246f5uc2nf2mgcutfun
140246xm73ojfovwa3jxjj
4、根据编译的提示,添加hal_rtc、hal_bkp、hal_pwr、hal_misc等必需的驱动库。
在mm32f5330_it.c中添加rtc的中断函数:
/***********************************************************************************************************************
  * @brief  This function handles RTC Handler
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void RTC_IRQHandler(void)
{
    if (RESET != RTC_GetITStatus(RTC_IT_SEC))
    {
        RTC_UpdateCalendar();
        RTC_PrintDateTime();
        RTC_ClearITPendingBit(RTC_IT_SEC);
        RTC_WaitForLastTask();
    }
}
下载好程序后,我们在开发板上看到了串口打印出来的日期时间:
140247l67aiew7666cw7m3
5、在main.c中,我们添加显示时间的函数代码如下:
#include "platform.h"
#include "main.h"
#include "oled.h"
#include "rtc_calendar.h"
#include "string.h"
#include <stdio.h>
extern uint8_t rtc_state;
extern RTC_CalendarTypeDef RTC_Calendar;
char data_buff[] = "2024-01-07";
char time_buff[] = "01:01:01";       
int main(void)
{
    PLATFORM_Init();
                RTC_Configure();
                OLED_Init();
                OLED_ShowStr(10,0,"MM32F5330!",2);
                OLED_RefreshRAM();

    while (1)
    {
                        if(rtc_state == 1)
                        {
                                rtc_state = 0;
                                sprintf(data_buff,"%04d-%02d-%02d",RTC_Calendar.year,RTC_Calendar.month, RTC_Calendar.day);
                                sprintf(time_buff,"%02d:%02d:%02d", RTC_Calendar.hour, RTC_Calendar.minute, RTC_Calendar.second);
                                OLED_ShowStr(10,16,data_buff,2);
                                OLED_ShowStr(10,32,time_buff,2);
                                OLED_RefreshRAM();
                                PLATFORM_LED_Toggle(LED1);
                        }


    }
}
下载好程序后就可以看到时间可以动态显示了:
140247sg9pffghfhbog9lt
【添回动态显示时间】
添加动态显示的时钟draw_rolling_clock.c到工程中,并把头文件添加进工程,在主函数中,我们添加代码如下:
#define _MAIN_C_
/* Files include */
#include "platform.h"
#include "main.h"
#include "oled.h"
#include "rtc_calendar.h"
#include "string.h"
#include <stdio.h>
extern uint8_t rtc_state;
extern RTC_CalendarTypeDef RTC_Calendar;
char data_buff[] = "2024-01-07";
char time_buff[] = "01:01:01";       
extern uint8_t H1,H2,M1,M2,S1,S2;
int main(void)
{
    PLATFORM_Init();
                RTC_Configure();
                OLED_Init();
//                OLED_ShowStr(10,0,"MM32F5330!",2);
//                OLED_RefreshRAM();

    while (1)
    {
                        if(rtc_state == 1)
                        {
                                rtc_state = 0;
                                sprintf(data_buff,"%04d-%02d-%02d",RTC_Calendar.year,RTC_Calendar.month, RTC_Calendar.day);
                                OLED_ShowStr(10,0,data_buff,2);
                                OLED_RefreshPartRAM(0,1,0,127);
                                H1 = RTC_Calendar.hour/10;
                                H2 = RTC_Calendar.hour%10;
                                M1 = RTC_Calendar.minute/10;
                                M2 = RTC_Calendar.minute%10;
                                S1 = RTC_Calendar.second/10;
                                S2 = RTC_Calendar.second%10;

                                PLATFORM_LED_Toggle(LED1);
                        }

                        Draw_Rolling_Clock();
    }
}
实现效果如下: