利用NUCLEO_F767ZI开发板自身所具备的RTC,配以OLED显示屏可实现实时时钟计时功能,其效果如图1所示。 为了便于在OLED屏上实现中文显示,可以PCtoLCD2002字模提取软件来构建小字库,其排列顺序如图2所示。 图1 RTC实时时钟
图2 字模提取
在构建小字库后,可通过下面的程序来实现显示界面的布局。 - void jm()
- {
- OLED_Clear();
- OLED_ShowString(18,0,"RTC",16);
- OLED_ShowCHinese(42,0,14);
- OLED_ShowCHinese(60,0,3);
- OLED_ShowCHinese(78,0,3);
- OLED_ShowCHinese(96,0,15);
- OLED_ShowString(0,2,"2016",16);
- OLED_ShowCHinese(32,2,0);
- OLED_ShowString(50,2,"11",16);
- OLED_ShowCHinese(68,2,1);
- OLED_ShowString(86,2," 7",16);
- OLED_ShowCHinese(104,2,2);
- OLED_ShowString(16,4,"12",16);
- OLED_ShowCHinese(32,4,3);
- OLED_ShowString(50,4,"30",16);
- OLED_ShowCHinese(68,4,4);
- OLED_ShowString(86,4,"00",16);
- OLED_ShowCHinese(104,4,5);
- OLED_ShowCHinese(40,6,6);
- OLED_ShowCHinese(60,6,7);
- OLED_ShowCHinese(80,6,8);
- }
复制代码 在使用HAL库的基础上,通过对RTC设置与读取函数的调用,可实现RTC的实时时钟计时功能,其主函数的内容如下: - int main(void)
- {
- RTC_TimeTypeDef RTC_TimeStruct;
- RTC_DateTypeDef RTC_DateStruct;
- u8 t=0;
- HAL_Init();
- Stm32_Clock_Init(432,25,2,9);
- delay_init(216);
- LED_Init(); // LED初始化
- RTC_Init(); // RTC初始化
- RTC_Set_WakeUp(RTC_WAKEUPCLOCK_CK_SPRE_16BITS,0);
- OLED_Init(); // OLED初始化
- OLED_Clear(); // 清屏
- jm(); // 显示界面
-
- RTC_Set_Time(12,30,0,RTC_HOURFORMAT12_AM); // 设置时间
- RTC_Set_Date(16,11,7,1); // 设置日期
- while(1)
- {
- t++;
- if((t%10)==0)
- { // 读取时间值
- HAL_RTC_GetTime(&RTC_Handler,&RTC_TimeStruct,RTC_FORMAT_BIN);
- // 显示时间值
- OLED_ShowNum(16,4,RTC_TimeStruct.Hours,2,16);
- OLED_ShowNum(50,4,RTC_TimeStruct.Minutes,2,16);
- OLED_ShowNum(86,4,RTC_TimeStruct.Seconds,2,16);
- // 读取日期值
- HAL_RTC_GetDate(&RTC_Handler,&RTC_DateStruct,RTC_FORMAT_BIN);
- // 显示日期值
- OLED_ShowNum(16,2,RTC_DateStruct.Year,2,16);
- OLED_ShowNum(50,2,RTC_DateStruct.Month,2,16);
- OLED_ShowNum(86,2,RTC_DateStruct.Date,2,16);
- if(RTC_DateStruct.WeekDay<7) // 读取星期值并显示
- OLED_ShowCHinese(80,6,7+RTC_DateStruct.WeekDay);
- else OLED_ShowCHinese(80,6,2);
- }
- if((t%20)==0) LED0_Toggle; // 指示灯闪烁提示
- delay_ms(10);
- }
- }
复制代码 受开发板上只有一个USER键的制约,这里没有提供RTC的时钟校正处理,只是以指定数值的方式设置RTC的初始值。若再扩展一个输入键,则可实时地对RTC的值进行调整。
|