打印
[方案相关]

【华大测评】+RTC电子时钟

[复制链接]
7787|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2020-9-29 11:25 编辑

HC32F460内部配有RTC功能,这里我们为它配上OLED屏显示,这样它就构成一个RTC电子时钟。
所用的OLED屏就是随板子自带的,该OLED屏的原理图见图1所示。
1  OLED屏原理图

本想以I2C通讯来驱动OLED屏,但将其移到RTC的程序中,比较难协调,最终还是以模拟I2C的方式来轻松地将两者结合在一起。
由于SDASCL 仍占用原位置,故定义其输出高低电平的语句如下:
#define OLED_SCLK_Set()   PORT_SetBits(PortD, Pin00)
#define OLED_SCLK_Clr()   PORT_ResetBits(PortD, Pin00)

#define OLED_SDIN_Set()   PORT_SetBits(PortD, Pin01)
#define OLED_SDIN_Clr()   PORT_ResetBits(PortD, Pin01)

所用的字符显示函数为:
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
        unsigned char j=0;
        while (chr[j]!='\0')
        {               OLED_ShowChar(x,y,chr[j],Char_Size);
                        x+=8;
                        if(x>120){x=0;y+=2;}
                        j++;
        }
}


所用的数值显示函数为:
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);
}
}

进行RTC时间设置的函数为:
static void Rtc_CalendarConfig(void)
{
stc_rtc_date_time_t stcRtcDateTimeCfg;
MEM_ZERO_STRUCT(stcRtcDateTimeCfg);
stcRtcDateTimeCfg.u8Year = 20u;
stcRtcDateTimeCfg.u8Month = 9;
stcRtcDateTimeCfg.u8Day = 27u;
stcRtcDateTimeCfg.u8Weekday = RtcWeekdaySunday;
stcRtcDateTimeCfg.u8Hour = 12u;
stcRtcDateTimeCfg.u8Minute = 23u;
stcRtcDateTimeCfg.u8Second = 01u;
if (RTC_SetDateTime(RtcDataFormatDec, &stcRtcDateTimeCfg, Enable, Enable) != Ok)
{
      printf("write calendar failed!\r\n");
}
}


实现图1和图2显示效果的主程序如下:
int32_t main(void)
{
stc_port_init_t stcPortInit;
stc_rtc_date_time_t stcCurrDateTime;
MEM_ZERO_STRUCT(stcPortInit);
MEM_ZERO_STRUCT(stcCurrDateTime);
LED0_OFF();
stcPortInit.enPinMode = Pin_Mode_Out;
PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
PORT_Init(PortD, Pin00, &stcPortInit);
PORT_Init(PortD, Pin01, &stcPortInit);
Xtal32_ClockConfig();
Ddl_UartInit();
Rtc_Config();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"HC32F460 TEST",16);
OLED_ShowString(0,2,"OLED & RTC",16);
Ddl_Delay1ms(1000u);
OLED_Clear();
OLED_ShowString(0,0,"20  -  -",16);
OLED_ShowString(0,2,"    :  :",16);
while (1)
{
if (1u == u8SecIntFlag)
{
u8SecIntFlag = 0u;
LED0_TOGGLE();
if (RTC_GetDateTime(RtcDataFormatDec, &stcCurrDateTime) = Ok)
{
OLED_ShowNum(16,0,stcCurrDateTime.u8Year,2,16);
OLED_ShowNum(40,0,stcCurrDateTime.u8Month,2,16);
OLED_ShowNum(64,0,stcCurrDateTime.u8Day,2,16);
OLED_ShowNum(16,2,stcCurrDateTime.u8Hour,2,16);
OLED_ShowNum(40,2,stcCurrDateTime.u8Minute,2,16);
OLED_ShowNum(64,2,stcCurrDateTime.u8Second,2,16);
}
}
}
}

2  初始界面

3  RTC运行界面

使用特权

评论回复
沙发
zeshoufx| | 2020-9-29 14:06 | 只看该作者
谢谢分享【RTC电子时钟】

使用特权

评论回复
板凳
华芯3284494788| | 2020-9-29 15:15 | 只看该作者
谢谢分享

使用特权

评论回复
地板
jinglixixi|  楼主 | 2020-9-29 19:39 | 只看该作者
多谢你们的支持和鼓励!!!

使用特权

评论回复
5
allie| | 2020-9-30 01:46 | 只看该作者
我以前用stm32f1系列内部rtc的时候,兼容性较差,请问华大的RTC稳定性怎么样?

使用特权

评论回复
6
jinglixixi|  楼主 | 2020-9-30 23:20 | 只看该作者
allie 发表于 2020-9-30 01:46
我以前用stm32f1系列内部rtc的时候,兼容性较差,请问华大的RTC稳定性怎么样? ...

这个需要有专业的仪器和时间来检测,咱普通人只能说有这项功能还比较好用,不敢在专业性的结论。

使用特权

评论回复
7
gwsan| | 2020-10-11 16:34 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
kxsi| | 2020-10-11 16:35 | 只看该作者
介绍的非常详细

使用特权

评论回复
9
nawu| | 2020-10-11 16:35 | 只看该作者
iic感觉有些娇气

使用特权

评论回复
10
qcliu| | 2020-10-11 16:35 | 只看该作者
代码风格很好

使用特权

评论回复
11
tfqi| | 2020-10-11 16:36 | 只看该作者
正好可以借鉴一下

使用特权

评论回复
12
jinglixixi|  楼主 | 2020-10-11 19:08 | 只看该作者
nawu 发表于 2020-10-11 16:35
iic感觉有些娇气

如果感觉它娇气就用I/O口模拟,最好使、最见效。

使用特权

评论回复
13
jinglixixi|  楼主 | 2020-10-11 19:09 | 只看该作者

这样会好读、已修改。

使用特权

评论回复
14
jinglixixi|  楼主 | 2020-10-11 19:10 | 只看该作者
tfqi 发表于 2020-10-11 16:36
正好可以借鉴一下

有用才有价值感

使用特权

评论回复
15
enm| | 2021-8-24 11:43 | 只看该作者
能分享下源码吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

451

主题

2747

帖子

38

粉丝