STM32实现万年历..

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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得到计数的天数,根据这个得到年月日。Count%86400得到时分秒。

2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。

3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。指针运动算法和屏幕重绘方法是本程序主要难点所在。(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下:

x =圆心x坐标+ 指针长度* cos (指针方向角)

y =圆心y坐标+ 指针长度* sin (指针方向角)

注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。

由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。

另外,秒表为RTC一秒钟定时计数。

程序分析:

uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。

void App_UCGUI_TaskCreate (void)

{

CPU_INT08U os_err;

os_err = os_err;

Clock_SEM=OSSemCreate(1); //建立秒更新中断的信号量

//硬件平台初始化

BSP_Init();

//主处理任务---------------------------------------------------------

os_err = OSTaskCreateExt(AppTaskUserIF,

(void *)0,

(OS_STK *)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],

APP_TASK_USER_IF_PRIO,

APP_TASK_USER_IF_PRIO,

(OS_STK *)&AppTaskUserIFStk[0],

APP_TASK_USER_IF_STK_SIZE,

(void *)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

//触摸屏任务---------------------------------------------------------

os_err = OSTaskCreateExt(AppTaskKbd,

(void *)0,

(OS_STK *)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1],

APP_TASK_KBD_PRIO,

APP_TASK_KBD_PRIO,

(OS_STK *)&AppTaskKbdStk[0],

APP_TASK_KBD_STK_SIZE,

(void *)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

//秒更新任务

os_err = OSTaskCreateExt(Clock_Updata,

(void *)0,

(OS_STK *)&Clock_Updata_Stk[Clock_Updata_STK_SIZE-1],

Clock_Updata_PRIO,

Clock_Updata_PRIO,

(OS_STK *)&Clock_Updata_Stk[0],

Clock_Updata_STK_SIZE,

(void *)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

}

万年历中的时间用的是STM32自带的RTC实时时钟。

1、主处理任务:界面背景初始化,并根据当前时间,画出图1的数据。

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_DispStringAt("一",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时钟得到万年历时间的初值,注意,这个值是根据用户查询万年历变化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); //设置中文字体

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; index < 60; index++ )//画时钟的刻度

{

x = -(40* cos(( index * 6 ) * DEG2RAD)) + 264;

y = -(40* sin(( index * 6 ) * DEG2RAD)) + 170;

相关文档
最新文档