1、STM32实现万年历 STM32学习笔记一 竹天笑实现的功能:1、日历功能。2、数字和模拟时钟功能。图1(为LCD截屏保存在SD卡中的图像)最终界面如下,但还存在不少漏洞。1、没有更改时间的设置;2、只有节气显示没有节假日显示3、背景不是用uCGUI画的,是在PS中画好然后存在SD卡中,然后显示的BMP格式图像。要点分析:1、STM32自带了RTC时钟计数器,从0开始计数到232。每一个计数代表秒计数,每六十个计数代表分计数,以此类推。24(小时)*60(分钟)*60(秒钟)=86400代表一天的计数时间。假设当前计数为count,count/86400得到计数的天数,根据这个得到年月日。Co
2、unt%86400得到时分秒。2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。指针运动算法和屏幕重绘方法是本程序主要难点所在。(以下参照XX文库之模拟时钟)不论何种指针,每次转动均以/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下:x =圆心x坐标 + 指针长度 * cos (指针方向角)y =圆心y坐标 + 指针长度 * sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针
3、的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。另外,秒表为RTC一秒钟定时计数。程序分析: uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。void App_UCGUI_TaskCreate (void) CPU_INT08U os_err; o
4、s_err = os_err; Clock_SEM=OSSemCreate(1); /建立秒更新中断的信号量 /硬件平台初始化 BSP_Init(); /主处理任务- os_err = OSTaskCreateExt(AppTaskUserIF, (void *)0, (OS_STK *)&AppTaskUserIFStkAPP_TASK_USER_IF_STK_SIZE-1, APP_TASK_USER_IF_PRIO, APP_TASK_USER_IF_PRIO, (OS_STK *)&AppTaskUserIFStk0, APP_TASK_USER_IF_STK_SIZE, (void
5、*)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); /触摸屏任务- os_err = OSTaskCreateExt(AppTaskKbd, (void *)0, (OS_STK *)&AppTaskKbdStkAPP_TASK_KBD_STK_SIZE-1, APP_TASK_KBD_PRIO, APP_TASK_KBD_PRIO, (OS_STK *)&AppTaskKbdStk0, APP_TASK_KBD_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); /秒更新任务
6、os_err = OSTaskCreateExt(Clock_Updata, (void *)0, (OS_STK *)&Clock_Updata_StkClock_Updata_STK_SIZE-1, Clock_Updata_PRIO, Clock_Updata_PRIO, (OS_STK *)&Clock_Updata_Stk0, Clock_Updata_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); 万年历中的时间用的是STM32自带的RTC实时时钟。1、主处理任务:界面背景初始化,并根据当前时间,画出图1
7、的数据。static void AppTaskUserIF (void *p_arg) (void)p_arg; INT8U err; /界面初始化 GUI_Init(); /ucgui 初始化 _ExecCalibration(); /* 触摸屏校准 */ GUI_SetBkColor(GUI_WHITE); /设置背景色 GUI_SetColor(GUI_GRAY); /设置前景色 GUI_Clear(); /清屏 Lcd_show_bmp(0, 0,/RTC.bmp); /显示万年历背景 GUI_SetFont(&GUI_FontHZ_SimSun_16); GUI_DispString
8、At(一,15,47); /显示星期一 GUI_DispStringAt(二,44,47); /显示星期二 GUI_DispStringAt(三,73,47); /显示星期三 GUI_DispStringAt(四,102,47); /显示星期四 GUI_DispStringAt(五,131,47); /显示星期五 GUI_SetColor(GUI_RED); /用红字显示周末 GUI_DispStringAt(六,160,47); /显示星期六 GUI_DispStringAt(日,189,47); /显示星期日 to_tm(RTC_GetCounter(), &s_time); /根据RTC
9、时钟得到万年历时间的初值,注意,这个值是根据用户查询万年历变化 GUI_SetFont(&GUI_Font16_1 ); /设置英文字体 GUI_DispDecAt(s_time.tm_year,4,13,4);/显示万年历的年份 GUI_SetFont(&GUI_FontHZ_SimSun_16); /设置中文字体 GUI_DispString(年); /显示年 GUI_SetFont(&GUI_Font16_1 ); /设置英文字体 GUI_DispDec(s_time.tm_mon,2); /显示万年历的月份 GUI_SetFont(&GUI_FontHZ_SimSun_16); /设置
10、中文字体 GUI_DispString(月); /显示月 GUI_SetFont(&GUI_Font16_1 ); /设置英文字体 GUI_DispDec(s_time.tm_mday,2); /显示万年历的日子 GUI_SetFont(&GUI_FontHZ_SimSun_16);/设置中文字体 GUI_DispString(日); /显示日 /画模拟时钟界面 u16 index,x,y; GUI_SetPenSize(1); GUI_SetColor(GUI_RED); GUI_DrawCircle(264,170, 45); /画时钟最外层的圆, for( index = 0; inde
11、x 60; index+ )/画时钟的刻度 x = -(40* cos( index * 6 ) * DEG2RAD) + 264; y = -(40* sin( index * 6 ) * DEG2RAD) + 170; if( index % 5 = 0 ) GUI_SetPenSize(4); /指示为小时的刻度用粗点画 else GUI_SetPenSize(2); /其它刻度用西点画 GUI_DrawPoint( x, y ); while(1) RTC_Show(RTC_GetCounter(); /主任务执行程序,接下来分析 OSTimeDlyHMSM(0,0,0,10); /主
12、任务执行程序void RTC_Show(uint32_t TimeVar) u8 str15; / 字符串暂存 u8 i,k; static flag=0; #if (GUI_SUPPORT_CURSOR|GUI_SUPPORT_TOUCH) GUI_CURSOR_Show(); /鼠标显示 #endif WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */ if(flag=0) /初始化按键,只执行一次。 /建立按键F1-F5 _ahButton0 =BUTTON_Crea
13、te(5, 0, 32,13, GUI_KEY_F1 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton1=BUTTON_Create(5, 29, 32,13, GUI_KEY_F2 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton2=BUTTON_Create(53, 0, 16,13, GUI_KEY_F3 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton3=BUTTON_Create(53,29,1
14、6,13, GUI_KEY_F4 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton4=BUTTON_Create(85, 0, 16,13, GUI_KEY_F5, WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton5=BUTTON_Create(85,29, 16,13, GUI_KEY_F6, WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); /按键字体设置 BUTTON_SetFont(_ahButton0,&GUI_Font6x8);/GUI_Font16_ASCII
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1