最新STM32实现万年历.doc
《最新STM32实现万年历.doc》由会员分享,可在线阅读,更多相关《最新STM32实现万年历.doc(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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得到计数的天数,根据这个得到年月
2、日。Count%86400得到时分秒。2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。指针运动算法和屏幕重绘方法是本程序主要难点所在。(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下:x =圆心x坐标 + 指针长度 * cos (指针方向角)y =圆心y坐标 + 指针长度 * sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是
3、整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。另外,秒表为RTC一秒钟定时计数。程序分析: uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。void App_UCGUI_TaskCreate (void) CPU_INT08U os_er
4、r;os_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 *)0,
5、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); /秒更新任务 os_er
6、r = 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的数据。static voi
7、d 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_DispStringAt(一,15,47); /显示星期一GUI_D
8、ispStringAt(二,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时钟得到万年历时间的初值,注意,这个值是根据用户查询万年历变化GUI_SetF
9、ont(&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);/设置中文字体GUI_DispString(月);/显示月GUI_SetFont(&GUI_Font16_1
10、 );/设置英文字体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; index 2099)/超过范围处理s_time.tm_year=1970;else if(key=41)/年数减小按钮s_time.tm_
11、year-; /F2if(s_time.tm_year12)/超过范围处理s_time.tm_mon=1;else if(key=43) /月数减小按钮s_time.tm_mon-; /F4if(s_time.tm_mongetDays(s_time.tm_year,s_time.tm_mon)/超过范围处理s_time.tm_mday=1;else if(key=45) /日数减小按钮s_time.tm_mday-; /F6if(s_time.tm_mday0)/超过范围处理s_time.tm_mday=getDays(s_time.tm_year,s_time.tm_mon);GUI_Se
12、tFont(&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);GUI_DispString(月);/显示月GUI_SetFont(&GUI_Font16_1 );GUI_DispDec(s_time.tm_md
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 STM32 实现 万年历
限制150内