【前言】
最近看到了一个波特律动大佬的一个万年历教学视频,这次跟着他的视频,把万年历系统移植到Mini-F5375-OB开发板上来。
工程的基础是在前面几期的帖子基础之上添加的:
在这几篇文章的基础之上,我创建了3个任务,分别为key、RTC、编码器,综合起来就搭建了一个可以跑时,可以设置日历的综合DEMO。
【程序设计思路】
创建3个FreeRTOS的任务,
1、Time_task,他实现日期的展示。
2、Encoder_Task,他实现对编码器的管理,通过正、反转,来实现对日历的增加减少,来设置日历。
3、key_task,他对编码器的按键进行管理,来实现进入设置(退出)模式,以及设置项目的切换。
【程序代码】
1、显示日期函数:
void showTime(RTC_CalendarTypeDef * my_Calendar) { uint8_t x_week; OLED_Printf(20,0,OLED_8X16,"%d-%02d-%02d", my_Calendar->year, my_Calendar->month, my_Calendar->day); OLED_Printf(12,20,OLED_12X24,"%02d:%02d:%02d", my_Calendar->hour,my_Calendar->minute,my_Calendar->second); x_week = (128 - strlen(weeks[my_Calendar->week]) * 8)/2; //计算显示星期的位置 OLED_Printf(x_week,48,OLED_8X16,"%s", weeks[my_Calendar->week]); }
传入参数为RTC的日期结构体函数,通过OLED_Printf来实现格式化输出到OLED屏上。
2、光标显示函数:
typedef struct { uint8_t x1; uint8_t y1; uint8_t x2; uint8_t y2; } CursorPosition; CursorPosition cursorPosition[6] = { {20, 17, 50, 17}, //Year {60, 17, 76, 17}, //Month {84, 17, 100, 17}, //Day {14, 45, 36, 45}, //Hour {48, 45, 74, 45}, //Minute {86, 45, 104, 45}, //Second }; void showCursor(void) { static uint8_t showstate = 0; showstate = (showstate+1)%2; if(showstate == 0) { OLED_DrawLine(cursorPosition[settingState].x1, cursorPosition[settingState].y1, cursorPosition[settingState].x2, cursorPosition[settingState].y2); } }
通过按键的切换,在showCursor函数中,可以动态的在相应的year、month等下标中显示光标。
3、按键切换回调函数:
void Btn1_Dowm_CallBack(void *btn) { PRINT_INFO("Button1 单击!"); if(calendarState == CalendarState_Normal) { settingState = Year; memcpy(&settingTime, &RTC_Calendar, sizeof(RTC_Calendar)); calendarState = CalendarState_Setting; } else { if(settingState == Second) { calendarState = CalendarState_Normal; RTC_SetDateTime(settingTime.year, settingTime.month,settingTime.day, settingTime.hour, settingTime.minute, settingTime.second); } else{ settingState ++; } } }
在移植好按键驱动后,按键的单击回调函数中,先判断是在什么状态,可以通过普通(CalendarState_Normal)、设置模式(CalendareSate_Settings)之间切换。
4、编码器向前向后的方向,可以实现在设置模式下面的对月日年,时分秒的参数的调定。
void onKnobForward(void) { printf("Forward\r\n"); if(calendarState == CalendarState_Setting) { switch (settingState) { case Year: settingTime.year++; break; case Month: settingTime.month++; if(settingTime.month > 12) { settingTime.month = 1; } break; case Day: settingTime.day++; if(settingTime.day > 31) { settingTime.day = 1; } if (settingTime.month == 2) { if(settingTime.year % 4 == 0) { if(settingTime.day > 29) { settingTime.day = 1; } } else { if(settingTime.day > 28) { settingTime.day = 1; } } } else if (settingTime.month == 4 || settingTime.month == 6 || settingTime.month == 9 || settingTime.month == 11) { if(settingTime.day > 30) { settingTime.day = 1; } } break; case Hour: settingTime.hour++; if(settingTime.hour > 23) { settingTime.hour = 0; } break; case Minute: settingTime.minute++; if(settingTime.minute > 59) { settingTime.minute = 0; } break; case Second: settingTime.second++; if(settingTime.second > 59) { settingTime.second = 0; } break; default: break; } } } void onKnobBackward(void) { printf("Backward\r\n"); if(calendarState == CalendarState_Setting) { switch (settingState) { case Year: settingTime.year--; if(settingTime.year < 2000) { settingTime.year = 2000; } break; case Month: settingTime.month--; if(settingTime.month < 1) { settingTime.month = 12; } break; case Day: settingTime.day--; if(settingTime.day < 1) { settingTime.day = 31; } if(settingTime.month == 2) { if(settingTime.year % 4 == 0) { if(settingTime.day < 1) { settingTime.day = 29; } } else { if(settingTime.day < 1) { settingTime.day = 28; } } }else if (settingTime.month == 4 || settingTime.month == 6 || settingTime.month == 9 || settingTime.month == 11) { if(settingTime.day < 1) { settingTime.day = 30; } } break; case Hour: settingTime.hour --; if(settingTime.hour < 0) { settingTime.hour = 23; } break; case Minute: settingTime.minute--; if(settingTime.minute < 0) { settingTime.minute = 59; } break; case Second: settingTime.second--; if(settingTime.second < 0) { settingTime.second = 59; } break; default: break; } } }
【程序源码】
视频介绍
" target="_self" title="视频介绍"视频介绍
链接:https://www.bilibili.com/video/BV1BEcFe9EX8/?vd_source=e1bd226340c8b87027d5dcfc6b0c3344