在对进度要求不是很高的情况下,通过毫秒级延时函数的使用即可快速地实现电子时钟的计时效果。
为此,在原OLED屏的显示函数中需添加一个数值显示函数,其内容为:
void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
{
uint8_t t,temp;
uint8_t enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
continue;
}
else
enshow=1;
}
OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
}
}
随后,在主程序中搭建一个计时进制处理便可实现电子时钟的功效,其主程序的内容为:
void hal_entry(void)
{
uint8_t h=8,m=30,t=0;
OLED_Initd();
OLED_Clear();
OLED_ShowString(0,0,"RA-Eco-RA6M4",16);
OLED_ShowString(0,2," : :",16);
while(1)
{
t=t+1;
if(t>59)
{
m=m+1;
t=0;
if(m>59)
{
h=(h+1)%24;
m=0;
}
}
OLED_ShowNum(0,2,h,2,16);
OLED_ShowNum(24,2,m,2,16);
OLED_ShowNum(48,2,t,2,16);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
}
经程序的编译和下载,其显示效果如图1所示,说明功能正常。

图1 电子时钟计时效果
此外,还有一种更为节省系统资源的方法来实现电子时钟的功能,那就是使用RTC计时器。
首先要在引脚配置的界面中来使能RTC,见图2所示。

图2 使能RTC
然后按图3所示来添加RTC,并按图4来效果参数。

图3 添加RTC

图4 修改参数
实现串口输出RTC计时效果的主程序为:
void hal_entry(void)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = R_RTC_Open(&rtc_ctrl, &rtc_cfg);
assert(FSP_SUCCESS == err);
R_RTC_CalendarTimeSet(&rtc_ctrl, &set_time);
R_RTC_PeriodicIrqRateSet(&rtc_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);
R_RTC_CalendarAlarmSet(&rtc_ctrl, &set_alarm_time);
uint8_t rtc_second= 0;
uint8_t rtc_minute =0;
uint8_t rtc_hour =0;
uint8_t rtc_day =0;
uint8_t rtc_month =0;
uint16_t rtc_year =0;
uint8_t rtc_week =0;
rtc_time_t get_time;
while(1)
{
if(rtc_flag)
{
R_RTC_CalendarTimeGet(&rtc_ctrl, &get_time);
rtc_flag=0;
rtc_second=get_time.tm_sec;
rtc_minute=get_time.tm_min;
rtc_hour=get_time.tm_hour;
rtc_day=get_time.tm_mday;
rtc_month=get_time.tm_mon;
rtc_year=get_time.tm_year;
rtc_week=get_time.tm_wday;
printf(" %d y %d m %d d %d h %d m %d s %d w\n",rtc_year+1900,rtc_month,rtc_day,rtc_hour,rtc_minute,rtc_second,rtc_week);
}
if(rtc_alarm_flag)
{
rtc_alarm_flag=0;
printf("/************Alarm Clock***********/\n");
}
}
}
经程序的编译和下载,其测试效果如图5所示。

图5 输出效果
当然。若配上OLED屏显示后同前面的效果是一致的,当却能更加节省系统资源。
演示视频: