ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:33.06KB ,
资源ID:13737      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/13737.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(STM32实现万年历.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

STM32实现万年历.docx

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