ARM多行文本框设计.doc_第1页
ARM多行文本框设计.doc_第2页
ARM多行文本框设计.doc_第3页
ARM多行文本框设计.doc_第4页
ARM多行文本框设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

此文档收集于网络,如有侵权,请联系网站删除嵌入式系统课程设计题目: ARM多行文本框设计学生姓名: XXX 学 号: XXXXXXXXX指导教师: XXXXXXX同组成员: XXXXXXXX起止时间: 20XX年 12月 10 日目 录1 设计任务与要求62 引言7 3 硬件设计84 软件设计85 调试过程及问题分析 126 结论 14参考文献 15附录 15一 设计任务及要求1.设计任务:ARM多行文本框设计2.设计要求:(1)利用文本框编程实现多行文本的文本框输入的计算器。(2)并在超级终端上显示的相应的文本。扩展要求监视每路 AD转换,每一路 AD的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。通过文本框给3路AD设置警戒值,某路输入超出警戒线之后lcd条形图中超出的部分会以闪动的方式显示。二 引言当今世界嵌入式的发展可谓是日新月异突飞猛进!嵌入式系统在各个领域内都有相当广泛的应用,如交通管理、工业控制、信息家电、家庭智能管理系统、POS网络及电子商务、机器人等!本设计基于博创科技UP-NETARM2410-CL开发平台,绘制多行文本框并利用文本框编程实现一个计算器并在超级终端上显示计算的结果。把一个二进制文件中的数据在文本框中显示出来,并利用键盘消息,并处理输入的数据,既进行加减乘除运算,并在超级终端上显示结果。其目的是掌握如何利用多行文本框的编辑来实现简单运算。在嵌入式系统中,数据和命令通过网络接口或串行口经过ARM程序处理后,便显示在LCD上或者传输到远端PC上。而触摸屏,由于其轻便、占用空间少、方便灵活等优点,特别是对于现在的图形化的嵌入式界面操作来说更加方便快捷。本设计即将展示这种组合的方便性。嵌入式系统的相应程序应该完成的任务便是:将自己的启动信息、过程信息主动发到运行有超级终端的主机;将接收到的字符返回到主机,同时发送需要显示的字符(如命令的响应等)到主机。 三 硬件设计3.1 硬件开发平台与软件开发平台介绍 硬件:ARM 嵌入式开发平台、PC 机Pentium100 以上、用于ARM920T 的JTAG 仿真器、串口线。 软件:PC 机操作系统Win2000 或WinXP、ARM ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序。3.2 硬件使用 通过ARM 嵌入式开发平台的按键输入数据(0至9按键),再按enter键,在上下两个文本框中分别显示计算过程与计算结果,并且在超级终端中显示计算式与结果。四 软件设计4.1 总体方案设计:1、用多个现有文本框设计成多行文本框,设计它们的位置坐标,让它们看起来紧挨2、在响应enter按键时,下一个文本框的可见状态从不可见变成可见,焦点移动到下一文本框3、判断输入有没有进入到文本框末尾位置,如果是,则移动到下一文本框创建两个文本框计算数据并分别显示到文本框和超级终端上扫面按键enter判断按键执行相应的程序4.2 数据的计算判断if(c0=+) num=num1+num2;Uart_Printf(0,%3.3f %c %3.3f = n,num1,c0,num2);Uart_Printf(0,%3.3f,num);Uart_Printf(0,n);a0=0;b0=0;c0=0;num1=num2=0;/把num设进第二个文本框,保留三位小数/fint=num*1000;while(fint!=0)str1k=fint%10;fint=fint/10;/Uart_Printf(0,%d,str1k);k+;while(k2)str2p=str1k+0;/Uart_Printf(0,%c,str2p);p+;k-;str2p=.;p+;str2p=str12+0;p+;str2p=str11+0;p+;str2p=str10+0;p+;k=0;p=0;fint=0;SetTextCtrlText(pTextCtrl1, str2,TRUE);/设置文本框内容DrawTextCtrl(pTextCtrl1);/重绘文本框/*/ else if(c0=-) if(num1=num2)/相减得到正数 num=num1-num2;Uart_Printf(0,%3.3f %c %3.3f = n,num1,c0,num2);Uart_Printf(0,%3.3f,num);Uart_Printf(0,n);a0=0;b0=0;c0=0;num1=num2=0;/把num设进第二个文本框,保留三位小数/fint=num*1000;while(fint!=0)str1k=fint%10;fint=fint/10;/Uart_Printf(0,%d,str1k);k+;while(k2)str2p=str1k+0;/Uart_Printf(0,%c,str2p);p+;k-;str2p=.;p+;str2p=str12+0;p+;str2p=str11+0;p+;str2p=str10+0;p+;k=0;p=0;fint=0;SetTextCtrlText(pTextCtrl1, str2,TRUE);/设置文本框内容DrawTextCtrl(pTextCtrl1);/重绘文本框/else /相减得到负数numtemp=num2-num1;/numtemp为正num=0-numtemp;Uart_Printf(0,%3.3f %c %3.3f = n,num1,c0,num2);Uart_Printf(0,%3.3f,num);Uart_Printf(0,n);a0=0;b0=0;c0=0;num1=num2=0;/把num设进第二个文本框/fint=numtemp*1000;while(fint!=0)str1k=fint%10;fint=fint/10;/Uart_Printf(0,%3d,str1k);k+;/将-设进str2的的0位/p=0;str2p=-;p=1;while(k2)str2p=str1k+0;/Uart_Printf(0,%c,str2p);p+;k-;str2p=.;p+;str2p=str12+0;p+;str2p=str11+0;p+;str2p=str10+0;p+;k=0;p=0;fint=0;SetTextCtrlText(pTextCtrl1, str2,TRUE);/设置文本框内容DrawTextCtrl(pTextCtrl1);/重绘文本框/*/ else if(c0=*) num=num1*num2;Uart_Printf(0,%3.3f %c %3.3f = n,num1,c0,num2);Uart_Printf(0,%3.3f,num);Uart_Printf(0,n);a0=0;b0=0;c0=0;num1=num2=0;/把num设进第二个文本框/fint=num*1000;while(fint!=0)str1k=fint%10;fint=fint/10;/Uart_Printf(0,%3d,str1k);k+;while(k2)str2p=str1k+0;/Uart_Printf(0,%c,str2p);p+;k-;str2p=.;p+;str2p=str12+0;p+;str2p=str11+0;p+;str2p=str10+0;p+;k=0;p=0;SetTextCtrlText(pTextCtrl1, str2,TRUE);/设置文本框内容DrawTextCtrl(pTextCtrl1);/重绘文本框/*/ else if(c0=/) if(num2=0) Uart_Printf(0,data error.n); else num=num1/num2;Uart_Printf(0,%3.3f %c %3.3f = n,num1,c0,num2);Uart_Printf(0,%3.3f,num);Uart_Printf(0,n);a0=0;b0=0;c0=0;num1=num2=0;五 调试过程及问题分析 调试过程中遇到的问题主要集中在下面几个地方:从文本框中读取字符并转换成数字运算,将运算得到的结果转变成字符送给结果显示框,符号位的表示问题。在从文本框中读取字符时,首先得判断读取到的字符是否为正确的,即第一位字符只能为数字字符,在遇到算术操作符时,如+,即判断第一个数输入结束,并将其减去0再做适当的转换得到与字符表示一致的数字,但该过程中遇到的符点型数据输入是一个难题,在整个过程中,小数点.所代表的位在实验台的键盘上实现的是清空文本框功能,最后采用的措施是以键盘是的Num键表示小数点位,当按下Num键时,出现在文本框里面的是小数点,即在Num键按下时传递给文本框的是小数点的ASCII值46,而在符点型输入过程中的转换相对来说也更复杂,整数部分与整数转换相同,而小数部分的转换,则定义了一个数组ffloat4=10,100,1000,10000,以小数点位为基准判断到达小数点第几位,则该数字字符转换成数字后分别除以该数组里面的相应数字,得到的是一个保留四位小数的浮点数字。在得到的数值结果换成字符数字的过程中,整数的操作比较简单,而若得到的数是负数则需要把结果文本框里面的第一个字符置为-,其它和正整数操作相同,即把该数不断对10取模将该数拆分成单个数字存入数组,再把该数组里面的数加上字符0,即得到了相应的数字字符。同样,浮点型数字的表示过程中,整数部分与整数数字一样,小数点被设置在整数位结束的紧接着的一位,小数位先乘以10000,再得到一个四位整数,若有哪一位整数位为空则用字符0代替。调试过程还有一个相当容易出现的错误就是用来接收输入的字符的数组长度设置,若要得到一个比较理想的状态,则需要将该数组设置得较大,若过小,如4个长度的数组,则在敲入第五个字符时就会出现“死机”,而另一方面,整数表示的范围有限,若输入的整数位数超过了整数范围,则也会出现溢出。六 结论通过过去两个星期的课程设计,不但使我复习了前面学嵌入式的知识的同时也学到了新的知识,在这次课程设计由五位小组成员组成了我们的设计组,在设计过程中遇到了许多疑点和难点,在组员的探讨中,和老师的帮助下,我们逐一解决了这些问题,但在这其中我们也走了不少弯路使我们知道自己的不足之处。有时虽然感觉理论知识已经掌握了,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名信号处理专业的学生,应用类的课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于专业知识懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是通过这两个礼拜的学习与实践,在小组同学的帮助和讲解下在老师的耐心辅导下,渐渐对所涉及到的专业知识产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它们。我认为这个收获应该说是相当大的。课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合相处,以及自身的动脑和努力,都是以后工作中需要的。 参考文献:【1】 孙纪坤,张小全.嵌入式LINUX 系统开发技术祥解基于ARM.北京: 人民邮电出版社2006.【2】李亚锋,欧文盛等.ARM嵌入式LINUX 系统开发从入门到精通.北京: 清华大学出版社2007.【3】杜春雷. ARM体系结构与编程.北京:清华大学出版社2003年.【4】亚荷毛尔等.构建嵌入式LINUX系统.中国电力出版社2011年附件*/#include./ucos-ii/includes.h /* uC/OS interface */#include ./ucos-ii/add/osaddition.h#include ./inc/drivers.h#include ./inc/sys/lib.h#include ./src/gui/gui.h#include #include #pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting /*任务定义*/OS_STK Main_StackSTACKSIZE=0, ; /Main_Test_Task堆栈void Main_Task(void *Id); /Main_Test_Task#define Main_Task_Prio 12OS_STK test_StackSTACKSIZE=0, ; /test_Test_Task堆栈void test_Task(void *Id); /test_Test_Task#define test_Task_Prio 15/*已经定义的OS任务*#define SYS_Task_Prio1#define Touch_Screen_Task_Prio9#define Main_Task_Prio 12#define Key_Scan_Task_Prio 58#define Lcd_Fresh_prio 59#define Led_Flash_Prio 60*/*事件定义*/ Main function. /int main(void)ARMTargetInit(); / do target (uHAL based ARM system) initialisation /OSInit(); / needed by uC/OS-II /OSInitUart();initOSFile();#if USE_MINIGUI=0initOSMessage();initOSList();initOSDC();initOSCtrl();LoadFont();#endifloadsystemParam();/ create the tasks in uC/OS and assign increasing / priorities to them so that Task3 at the end of / the pipeline has the highest priority. /LCD_printf(Create task on uCOS-II.n);OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_StackSTACKSIZE-1, Main_Task_Prio);/OSTaskCreate(test_Task, (void *)0, (OS_STK *)&test_StackSTACKSIZE-1, test_Task_Prio);OSAddTask_Init(1);LCD_printf(Starting uCOS-II.n);LCD_printf(Entering graph mode.n);LCD_ChangeMode(DspGraMode);OSStart(); / start the OS / never reached /return 0;/main/PTextCtrl pTextCtrl2;/文本框结构控件指针,两个文本框structRECT rect2;/定义矩形框结构int ID_MainTextCtrl2=101,102;/文本框控件IDint leftText=100,rightText=320;/文本框的左右对齐int topText2=30,50,bottomText2=50,70;/文本框的上下位置紧挨/int static instru=0;/文本框的指示变量/*int sysnumber=0;char sysfilename =/sys/ucos/fj/sys.dat;/打开的文件名void LoadSysNumber()/打开文件读文件数据FILE *pfile;/定义文件结构指针pfile=fopen(sysfilename,r);/打开文件if(pfile=NULL)/打开文件失败sysnumber=0;return;fread(&sysnumber,sizeof(int),1,pfile);/读文件fclose(pfile);/关闭文件void SaveSysNumber() /打开文件写数据保存FILE *pfile;pfile=fopen(sysfilename,w);if(pfile=NULL)return;fwrite(&sysnumber,sizeof(int),1, pfile);/写文件fclose(pfile);*/*void CreateText()/创建文本框U16 str20;/LoadSysNumber();SetRect(&rect, leftText,topTextinstru,rightText,bottomTextinstru);/设置PID参数轴1P的文本框pTextCtrlinstru=CreateTextCtrl(ID_MainTextCtrlinstru, &rectinstru,FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);/创建文本框/Int2Unicode(sysnumber,str);/将整形数据转换为Unicode数据SetWndCtrlFocus(NULL, ID_MainTextCtrlinstru);/将焦点移到文本框中SetTextCtrlText(0, str,TRUE);/设置文本框内容*/ /变量定义/S8 a10,b10,c1;S8 at10,bt10;S8 dota,dotb;/num1和num2的小数点标记位int count1,count2,i,j, m,n,k;float num,num1,num2,num3;int numtemp;/当相减得到的是负数时的临时量 /int fint;/把fnum得到的值乘以100得到的整数float fnum;/用在做除法运算时保存所得的商值/float fnum2;/把fint除以100得到的浮点数,也就是要输出到第二个文本框里面的值/ void Main_Task(void *Id) /Main_Test_TaskU16 str110=0;U16 str210=0;int l=0;int p=0;int t=0;int f=0;/小数点后面数标志int ffloat4=10,100,1000,10000;/最多四位有效小数POSMSG pMsg=0;/定义消息结构a0=0;b0=0;c0=0;num=num1=num2=num3=0; i=0; j=0; count1=count2=0;ClearScreen();/清屏Uart_Printf(0,-多行文本框计算器实验-n);/CreateText(); /创建文本框/创建两个文本框/创建第一个文本框/SetRect(&rect0, leftText,topText0,rightText,bottomText0);/设置PID参数轴1P的文本框pTextCtrl0=CreateTextCtrl(ID_MainTextCtrl0, &rect0,FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);/创建文本框/Int2Unicode(sysnumber,str);/将整形数据转换为Unicode数据SetWndCtrlFocus(NULL, ID_MainTextCtrl0);/将焦点移到第一个文本框中/SetTextCtrlText(pTextCtrl0, str,TRUE);/设置文本框内容/创建第二个文本框/SetRect(&rect1, leftText,topText1,rightText,bottomText1);/设置PID参数轴1P的文本框pTextCtrl1=CreateTextCtrl(ID_MainTextCtrl1, &rect1,FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);/创建文本框/Int2Unicode(sysnumber,str);/将整形数据转换为Unicode数据/SetWndCtrlFocus(NULL, ID_MainTextCtrl1);/第二个文本框不需要得到焦点/SetTextCtrlText(pTextCtrl1, str,TRUE);/设置文本框内容/pTextCtrl0-text0=0; /清空第一个文本框SetTextCtrlEdit(pTextCtrl0, TRUE);/使第一个文本框处于编辑状态DrawTextCtrl(pTextCtrl0);/重绘文本框/pTextCtrl1-text0=0; /清空第一个文本框SetTextCtrlEdit(pTextCtrl1, TRUE);/使第一个文本框处于编辑状态SetTextCtrlText(pTextCtrl1, str2,TRUE);/设置文本框内容DrawTextCtrl(pTextCtrl1);/重绘文本框/消息循环for(;)POS_Ctrl pCtrl;/定义消息结构pMsg=WaitMessage(0);/等待消息switch(pMsg-Message)case OSM_KEY:/键盘消息 if(pMsg-WParam=+) c0=+; else if(pMsg-WParam=-) c0=-; else if(pMsg-WParam=*) c0=*; else if(pMsg-WParam=/) c0=/; else if(c0=0)&(pMsg-WParam=0&pMsg-WParamWParam=N)ai=pMsg-WParam;if(pMsg-WParam=48)dota=i;/dota标志着小数点在第一个数里面的位置+i;count1=i; else if(c0!=0&(pMsg-WParam=0&pMsg-WParamWParam=N)bj=pMsg-WParam;if(pMsg-WParam=48)dotb=j;/dotb标志着小数点在第二个数里面的位置+j;count2=j;DeleteMessage(pMsg);/删除消息/*pCtrl=GetCtrlfromID(NULL, GetWndCtrlFocus(NULL);/得到由焦点控件的结构指针if(pCtrl-CtrlType=CTRLTYPE_WINDOW)if(PWnd)pCtrl)-style&WND_STYLE_MODE)=WND_STYLE_MODE&c0!=0&(pMsg-WParam!=+|pMsg-WParam!=-|pMsg-WParam!=*|pMsg-WParam!=/)/焦点是有模式窗口,消息直接传递过去OSOnSysMessage(pMsg); */ break; if(pMsg-WParam=.)/ 清空键/还需要把a,c,b数组及所有标量清空/ count1=0;count2=0;i=0;j=0; m=0;n=0;k=0; num=0;num1=0;num2=0;num3=0; fint=0;fnum=0;for(t=0;ttext0=0; /清空第一个文本框DrawTextCtrl(pTextCtrl0);/重绘文本框pTextCtrl1-text0=0; /清空第二个文本框DrawTextCtrl(pTextCtrl1);/重绘文本框for(t=0;tWParam=r)/发送键 i=j=0; / Uart_Printf(0,%d%d,count1,count2); / pTextCtrl0-text0=0; /清空文本框SetTextCtrlEdit(pTextCtrl0, TRUE);/使文本框处于编辑状态DrawTextCtrl(pTextCtrl0);/重绘文本框 /Uart_Printf(0,%c,c0); Uart_Printf(0,%d,count1); for(m=0;mdota;m+) atl=am; l+; /小数点位跳过 m=m+1; while(mcount1) atl=am; m+; l+; m=0; for( l=0;ldota;l+)/小数点前的数 if(l=0) num1=atl-0; else num1=num1*10+atl-0; while(lcount1) num1=num1+(float)(atl-0)/ffloatf; f=f+1;l=l+1; l=0;f=0;a0=0; at0=0;count1=0; for(n=0;ndotb;n+) btl=bn; l+; n=n+1; /小数点位跳过 while(ncount1) btl=bn; n+; l+; n=0; for(l=0;ldotb;l+)/小数点前的数 if(l=0) num1=btl-0; else num1=num1*10+btl-0; while(l2)str2p=str1k+0;/Uart_Printf(0,%c,str2p);p+;k-;str2p=.;p+;str2p=str12+0;p+;str2p=str11+0;p+;str2p=str10+0;

温馨提示

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

评论

0/150

提交评论