UCOS计算器 设计_第1页
UCOS计算器 设计_第2页
UCOS计算器 设计_第3页
UCOS计算器 设计_第4页
UCOS计算器 设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、物理与电子工程学院设计实验报告 物理与电子工程学院 嵌入式系统设计设计性实验报告 题 目 基于UCOS-II操作系统的简易计算器设计系 别 电子科学与技术系 年 级 电科111 班 级 050211101 学生姓名 卜建锋 指导教师 浦 炜 实验时间 2014-5-29 目 录课题要求21.本课题的目的32.运行环境3正文4一.课题分析4二系统设计9三.技术实现问题23四.总结与体会24设计性实验报告成绩: 指导教师签名:24课题要求1. 本课题的目的 在ucOS-II下设计一个图形化界面的计算器,实现计算器功能。利用ucOS-II下图形界面设计的API函数设计一个操作界面,含数字键、运算键。

2、可以利用触摸屏功能进行操作运算,同时利用实验箱上的小键盘输入进行运算。该项目将主要涉及对ucOS-II下相关API函数的使用、基本图形控件的使用、消息传递机制的掌握运用等方面的综合设计能力的培养和提高。2. 运行环境代码编译使用:CodeWarrior for ARM Developer SuiteCodeWarrior for ARM Developer Suite是 ARM 公司推出的新一代 ARM 集成开发工具。 (图1-1)代码修改使用:source insight 为了方便的修改代码使用,source insight。Source Insight是一个面向项目开发的程序编辑器和代码浏

3、览器,能分析源代码并在工作的同时动态维护它自己的符号数据库,并自动显示有用的上下文信息。 Source Insight提供了快速和革新的访问源代码和源信息的能力。(图1-2)1. 课题分析 图形化界面的计算器的设计包括以下几个部分:触摸屏界面的设计,触摸屏按键功能设计,文本框界面设计,小键盘按键功能设计,计算器逻辑功能的设计。1、触摸屏界面以及功能设计触摸屏界面设计包括文本框的设计以及模拟按键的设计主要用到绘图API以及图形控件,触摸屏尺寸为320*240。文本框的尺寸为20*260,模拟按键尺寸30*40。具体分布见下(图1-3)。(0,0) (0,320) +089 *7 / -564CL

4、EAR2310B=(240,0) (图1-3) 计算机界面设计完毕后既是设计相应的按键功能,相应触摸屏按键用到了消息循环,触摸屏消息的类型pMsg->Message 为OSM_TOUCH_SCREEN,参数pMsg->WParam中包含坐标信息。用下面的语句获得(x,y)坐标值:Touch_Position.x=pMsg->WParam&0xffff;Touch_Position.y=pMsg->WParam>>16;得到了点击触摸点的坐标后,用if(IsInRect2(X, Y)语句判断这个坐标点落在哪个按键区域范围内,便可知道点击的是哪个按键。此

5、时将按键值存在全局变量sysnumber中,以备下面处理使用。为了调试方便使用Uart_Printf("the key is Xn");及时的将按下的键值通过超级终端接受查看。例如语句: if(IsInRect2(pLine_Button_RECT, pTouch_Position) /'7'Uart_Printf("the key is 7n"); sysnumber = 7;可知按键按下的是7 键,按键与sysnumber值的对应表如下:按键012345678键值012345678按键9+-*/=CEB键值91112131417161

6、5 (图1-4)2、 文本框的设计文本框控件的设计,使用CreateTextCtrl()函数来创建文本框控件,同样必须指定文本框的唯一ID。用SetTextCtrlText()函数即可将Unicode 文本添加到文本框中, 而GetTextCtrlText() 函数用来获取文本框中字符串的指针。用AppendChar2TextCtrl()函数和TextCtrlDeleteChar()函数分别在文本框中追加一个字符或删除最后一个字符。也可以用SetTextCtrlEdit()函数设置文本框为编辑状态,使文本框可以响应键盘消息,通过键盘输入文字。创建文本框的代码如下,创建一个20*260的文本框用

7、于显示计算结果。void CreateText() structRECT rect;/定义矩形框结构U16 str20=0;SetRect(&rect, 50,10,270,30);/设置PID参数轴1P的文本框pTextCtrl=CreateTextCtrl(ID_MainTextCtrl,&rect,FONTSIZE_MIDD LE,CTRL_STYLE_FRAME,NULL,NULL); Int2Unicode(sysnumber,str);/将整形数据转换为Unicode数据SetTextCtrlText(pTextCtrl, str,TRUE);/设置文本框内容3、

8、小键盘按键功能设计 对于键盘消息来说其类型pMsg->MessageOSM_KEY,参数pMsg->WParam 则是按键的键码。键盘中断服务程序只向键盘邮箱中发送一个消息,通知键盘扫描任务发生按键事件。当键盘扫描任务等到该邮箱的消息后就会从键盘扫描芯片读取扫描码,继而将该扫描码对应的键码用键盘消息发送到消息队列。 应用程序在Main_Task 任务中等待消息,并对该消息进行判断和处理,如果是键盘消息则提取出键码,变换为对应字符,然后通过超级终端接受查看。实际设计时,可通过超级终端接受按键值,查看小键盘各个按键对应的按键值,再按照上表(图1-4),设置按键值变量sysnumber

9、。4、 计算器逻辑功能的设计计算逻辑是本设计的关键所在,根据触摸屏或小键盘按下不同的键,设置不同的状态。本次设计所实现的功能是:实现两位数的加法,减法,乘法,除法,结果支持负数显示。参与运算的数值不能太大,不然在进行乘法的时候可能会溢出,导致结果出错。所以设置参与运算的数最大100 0000,若超出视为溢出,向开始用户报错,并清零要求重新输入。在做除法时,考虑到除数不能为零,所以在程序设计时,进行判断,当除数为零时,向用户报错,并要求重新输入除数。本设计支持输入清零功能,当用户在输入运算数出错的,可以点击“CLEAR”按键,清零并进行再次输入。支持触摸屏和按键交叉输入,并视为有效参与运算数。运

10、算流程图如下:输入第一个数超出范围清零清零报错 YCLEARN YN输入运算符号 输入第二个数 清零清零报错超出范围YCLEAR NY输入等号执行运算2 系统设计1、 硬件系统液晶电路:触摸屏用于显示,并通过触摸屏功能输入数据用于计算(图1-5)键盘电路:键盘实现输入数据用于计算。(图1-6)2、 软件系统 基于UCOS-II操作系统的简易计算器设计,主要在UCOS-II操作系统的基础上,结合硬件进行进一步的功能开发与设计。uCOS-II任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的最高优先级的任务,所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由调度器(s

11、cheduler)来完成的。任务级的调度是由函数OSSched()完成的,而中断级的调度是由函数OSIntExt()完成。对于OSSched(),它内部调用的是OS_TASK_SW()完成实际的调度;OSIntExt()内部调用的是OSCtxSw()实现调度。任务切换分为两部,第一步:将被挂起任务的处理器寄存器推入自己的任务堆栈。第二步:然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到寄存器中。任务的5种状态睡眠态:任务驻留于程序空间中,暂时没交给ucos-ii处理。就绪态:任务一旦建立,这个任务就进入了就绪态。运行态:调用OSStart()可以启动多任务。OSStart()函数只

12、能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。等待状态:正在运行的任务,通过延迟函数或pend(挂起)相关函数后, 将进入等待状态。中断状态:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。基于UCOS-II操作系统的简易计算器只用到了一个任务,所以无需创建其他的任务。任务的主要功能是:响应触摸屏消息,读取触摸屏对于点的按键信息;响应小键盘按键消息,读取对应的按键值信息。读取完成后,进行相应的计算逻辑,最终将计算的结果通过文本框显示在触摸屏上。同时通过超级终端串口,向上位机及时发送对应的按键信息,以便调试程序,以及查看触摸屏校准情况。3、 核心

13、代码for(;)pMsg=WaitMessage(0); switch(pMsg->Message)case OSM_KEY:/键盘消息 Uart_Printf("C_flag=%d",pMsg->WParam); switch(pMsg->WParam) case 1: sysnumber=14; break;/ '/'case 2: sysnumber=13; break;/ '*'case 3: sysnumber=12; break;/ '-'case 7: sysnumber=11; break;/

14、 '+'case 14: sysnumber=17; break;/ '=' case 4: sysnumber=7; break;/ '/'case 5: sysnumber=8; break;/ '/'case 6: sysnumber=9; break;/ '/'case 8: sysnumber=4; break;/ '/'case 9: sysnumber=5; break;/ '/'case 10: sysnumber=6; break;/ '/'case

15、 11: sysnumber=1; break;/ '/'case 12: sysnumber=2; break;/ '/'case 13: sysnumber=3; break;/ '/'case 15: sysnumber=0; break;/ '/'case 16: sysnumber=16; break;/ 'claer' /*/*计算器处理部分*/ /*/if(sysnumber >= 11)&&(sysnumber<=14) /加减乘除功能C_flag = sysnumber

16、; Uart_Printf("C_flag=%d",C_flag); else if(sysnumber = 17) /等于号switch(C_flag)case 11: ans = Tmp1 + Tmp2; break;/加case 12: ans = Tmp1 - Tmp2; break; /减case 13: ans = Tmp1 * Tmp2; break;/乘case 14:if(Tmp2 = 0) Uart_Printf("error !ans = Tmp1 / Tmp2. Tmp2 must != 0 !n"); break; elsean

17、s = Tmp1 / Tmp2;break; / end switch Uart_Printf("ans=%dn",ans); Int2Unicode(ans,string);/将整形数据转换为Unicode数据 SetTextCtrlText(pTextCtrl, string,TRUE);/设置文本框内容C_flag = 0;Tmp1 = 0;Tmp2 = 0;elseif(C_flag = 0) ans = Tmp1;ans *=10;ans+=sysnumber;if(ans>10000000) /溢出报错,清零重新输入 Uart_Printf("T

18、he number is too large !n"); Tmp1 = 0; ans = 0;else Tmp1 = ans; Uart_Printf("Tmp1=%dn",Tmp1); Int2Unicode(Tmp1,string);/将整形数据转换为Unicode数据 SetTextCtrlText(pTextCtrl, string,TRUE);/设置文本框内容elseans = Tmp2;ans *=10;ans+=sysnumber;if(ans>10000000) /溢出报错,清零重新输入 Uart_Printf("The numbe

19、r is too large !n"); Tmp2 = 0; ans = 0;elseTmp2= ans; Uart_Printf("Tmp2=%dn",Tmp2); Int2Unicode(Tmp2,string);/将整形数据转换为Unicode数据 SetTextCtrlText(pTextCtrl, string,TRUE);/设置文本框内容 if(sysnumber = 15) /清零键ans = 0;Tmp2 = 0; Tmp1 = 0; Int2Unicode(ans,string);/将整形数据转换为Unicode数据SetTextCtrlText

20、(pTextCtrl, string,TRUE);/设置文本框内容 break;case OSM_TOUCH_SCREEN: / 触摸屏消息Touch_Position.x=pMsg->WParam&0xffff;Touch_Position.y=pMsg->WParam>>16;/*按键值得读取*/说明: 数值键盘 0-9 对应数值0-9 / 功能键盘 B (15) CE(16) =(17)/ + (11) *(13)/ - (12) /(14)/*/if(IsInRect2(pLine_Button_RECT, pTouch_Position) /'

21、7'Uart_Printf("the key is 7n"); sysnumber = 7;else if(IsInRect2(pCircle_Button_RECT, pTouch_Position)/'4'Uart_Printf("the key is 4 n");sysnumber = 4;else if(IsInRect2(pCurve_Button_RECT, pTouch_Position)/'1'Uart_Printf("the key is 1n");sysnumber = 1;

22、else if(IsInRect2(pClear_Button_RECT, pTouch_Position)/'0' Uart_Printf("the key is 0n"); sysnumber = 0;else if(IsInRect2(pEIGHT_Button_RECT, pTouch_Position)/'8' Uart_Printf("the key is 8n"); sysnumber = 8;else if(IsInRect2(pFIVE_Button_RECT, pTouch_Position)/'

23、;5' Uart_Printf("the key is 5n"); sysnumber = 5;else if(IsInRect2(pTWO_Button_RECT, pTouch_Position)/'2' Uart_Printf("the key is 2n"); sysnumber = 2;else if(IsInRect2(pB_Button_RECT, pTouch_Position)/'B' Uart_Printf("the key is Bn"); sysnumber = 15;

24、else if(IsInRect2(pNINE_Button_RECT, pTouch_Position)/'9' Uart_Printf("the key is 9n"); sysnumber = 9;else if(IsInRect2(pSIX_Button_RECT, pTouch_Position)/'6' Uart_Printf("the key is 6n"); sysnumber = 6;else if(IsInRect2(pTHREE_Button_RECT, pTouch_Position)/'3

25、' Uart_Printf("the key is 3n"); sysnumber = 3;else if(IsInRect2(pEQUAL_Button_RECT, pTouch_Position)/'=' Uart_Printf("the key is =n");sysnumber = 17; else if(IsInRect2(pADD_Button_RECT, pTouch_Position)/'+' Uart_Printf("the key is +n");sysnumber = 11

26、;else if(IsInRect2(pDEC_Button_RECT, pTouch_Position)/'-' Uart_Printf("the key is -n");sysnumber = 12; else if(IsInRect2(pMUL_Button_RECT, pTouch_Position)/'*' Uart_Printf("the key is *n"); sysnumber = 13;else if(IsInRect2(pDIV_Button_RECT, pTouch_Position)/'/

27、' Uart_Printf("the key is /n"); sysnumber = 14;else if(IsInRect2(pCLEAR_Button_RECT, pTouch_Position)/'CE' Uart_Printf("the key is CE !n"); sysnumber = 15; Uart_Printf("C_flag=%dn",sysnumber); /说明: 数值键盘 0-9 对应数值0-9 / 功能键盘 B (15) CE(16) =(17)/ + (11) *(13)/ -

28、 (12) /(14)/*/ /*计算器处理部分*/ /*/if(sysnumber >= 11)&&(sysnumber<=14) /加减乘除功能C_flag = sysnumber; Uart_Printf("C_flag=%d",C_flag); else if(sysnumber = 17) /等于号switch(C_flag)case 11: ans = Tmp1 + Tmp2; break;/加case 12: ans = Tmp1 - Tmp2; break; /减case 13: ans = Tmp1 * Tmp2; break;

29、/乘case 14:if(Tmp2 = 0) Uart_Printf("error !ans = Tmp1 / Tmp2. Tmp2 must != 0 !n"); break; elseans = Tmp1 / Tmp2;break; / end switch Uart_Printf("ans=%dn",ans); Int2Unicode(ans,string);/将整形数据转换为Unicode数据 SetTextCtrlText(pTextCtrl, string,TRUE);/设置文本框内容C_flag = 0;Tmp1 = 0;Tmp2 = 0;

30、elseif(C_flag = 0) ans = Tmp1;ans *=10;ans+=sysnumber;if(ans>10000000) /溢出报错,清零重新输入 Uart_Printf("The number is too large !n"); Tmp1 = 0; ans = 0;else Tmp1 = ans; Uart_Printf("Tmp1=%dn",Tmp1); Int2Unicode(Tmp1,string);/将整形数据转换为Unicode数据 SetTextCtrlText(pTextCtrl, string,TRUE);/

31、设置文本框内容elseans = Tmp2;ans *=10;ans+=sysnumber;if(ans>10000000) /溢出报错,清零重新输入 Uart_Printf("The number is too large !n"); Tmp2 = 0; ans = 0;elseTmp2= ans; Uart_Printf("Tmp2=%dn",Tmp2); Int2Unicode(Tmp2,string);/将整形数据转换为Unicode数据 SetTextCtrlText(pTextCtrl, string,TRUE);/设置文本框内容 if(sysnumber = 15) /清零键ans = 0;Tmp2 = 0; Tmp1 = 0; Int2Unicode(ans,string);/将整形数据转换为Unicode数据SetTextCtrlText(pTextCtrl, string,TRUE);/设置文本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论