1、嵌入式系统在各个领域内都有相当广泛的应用,如交通管理、工业控制、信息家电、家庭智能管理系统、POS网络及电子商务、机器人等!本设计基于博创科技UP-NETARM2410-CL开发平台,绘制多行文本框并利用文本框编程实现一个计算器并在超级终端上显示计算的结果。把一个二进制文件中的数据在文本框中显示出来,并利用键盘消息,并处理输入的数据,既进行加减乘除运算,并在超级终端上显示结果。其目的是掌握如何利用多行文本框的编辑来实现简单运算。在嵌入式系统中,数据和命令通过网络接口或串行口经过ARM程序处理后,便显示在LCD上或者传输到远端PC上。而触摸屏,由于其轻便、占用空间少、方便灵活等优点,特别是对于现
2、在的图形化的嵌入式界面操作来说更加方便快捷。本设计即将展示这种组合的方便性。嵌入式系统的相应程序应该完成的任务便是:将自己的启动信息、过程信息主动发到运行有超级终端的主机;将接收到的字符返回到主机,同时发送需要显示的字符(如命令的响应等)到主机。三硬件设计3.1 硬件开发平台与软件开发平台介绍 硬件:ARM 嵌入式开发平台、PC 机Pentium100 以上、用于ARM920T 的JTAG 仿真器、串口线。 软件:PC 机操作系统Win2000 或WinXP、ARM ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序。3.2 硬件使用 通过ARM 嵌入式开发平台的按键输入数据(0至9
3、按键),再按enter键,在上下两个文本框中分别显示计算过程与计算结果,并且在超级终端中显示计算式与结果。四 软件设计4.1 总体方案设计:1、用多个现有文本框设计成多行文本框,设计它们的位置坐标,让它们看起来紧挨2、在响应enter按键时,下一个文本框的可见状态从不可见变成可见,焦点移动到下一文本框3、判断输入有没有进入到文本框末尾位置,如果是,则移动到下一文本框4.2 数据的计算判断if(c0=+) num=num1+num2; Uart_Printf(0,%3.3f %c %3.3f = n,num1,c0,num2);%3.3f,num);n); a0=0; b0= c0= num1=
4、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%c,str2p); p+;k-; str2p=.p+; str2p=str12+ str2p=str11+ str2p=str10+ k=0; p=0; fint=0; SetTextCtrlText(pTextCtrl1, str2,TRUE);/设置文本框内容 DrawTextCtrl(pTextCtrl1
5、);/重绘文本框 / /*/ else if(c0=- if(num1=num2) /相减得到正数 num=num1-num2; Uart_Printf(0, fint=num*1000; while(fint! str1k=fint%10; fint=fint/10; / Uart_Printf(0, k+; while(k str2p=str1k+ /Uart_Printf(0, p+; str2p= str2p=str12+ str2p=str11+ str2p=str10+ k=0; p=0; fint=0; SetTextCtrlText(pTextCtrl1, str2,TRUE)
6、; DrawTextCtrl(pTextCtrl1); else /相减得到负数 numtemp=num2-num1; /numtemp为正 num=0-numtemp; /把num设进第二个文本框/ fint=numtemp*1000;%3d/将设进str2的的0位/ p=1; / else if(c0=*) num=num1*num2; Uart_Printf(0, a0= b0= c0= num1=num2=0; fint=num*1000; while(fint! str1k=fint%10; fint=fint/10; /Uart_Printf(0, k+; while(k str2
7、p=str1k+ p+; str2p= str2p=str12+ str2p=str11+ str2p=str10+ k=0; p=0; SetTextCtrlText(pTextCtrl1, str2,TRUE); DrawTextCtrl(pTextCtrl1);/ if(num2=0) Uart_Printf(0,data error.n else num=num1/num2; Uart_Printf(0, a0= b0= c0= num1=num2=0;五 调试过程及问题分析调试过程中遇到的问题主要集中在下面几个地方:从文本框中读取字符并转换成数字运算,将运算得到的结果转变成字符送给结
8、果显示框,符号位的表示问题。在从文本框中读取字符时,首先得判断读取到的字符是否为正确的,即第一位字符只能为数字字符,在遇到算术操作符时,如,即判断第一个数输入结束,并将其减去再做适当的转换得到与字符表示一致的数字,但该过程中遇到的符点型数据输入是一个难题,在整个过程中,小数点所代表的位在实验台的键盘上实现的是清空文本框功能,最后采用的措施是以键盘是的Num键表示小数点位,当按下Num键时,出现在文本框里面的是小数点,即在Num键按下时传递给文本框的是小数点的ASCII值46,而在符点型输入过程中的转换相对来说也更复杂,整数部分与整数转换相同,而小数部分的转换,则定义了一个数组ffloat4=1
9、0,100,1000,10000,以小数点位为基准判断到达小数点第几位,则该数字字符转换成数字后分别除以该数组里面的相应数字,得到的是一个保留四位小数的浮点数字。在得到的数值结果换成字符数字的过程中,整数的操作比较简单,而若得到的数是负数则需要把结果文本框里面的第一个字符置为,其它和正整数操作相同,即把该数不断对10取模将该数拆分成单个数字存入数组,再把该数组里面的数加上字符,即得到了相应的数字字符。同样,浮点型数字的表示过程中,整数部分与整数数字一样,小数点被设置在整数位结束的紧接着的一位,小数位先乘以10000,再得到一个四位整数,若有哪一位整数位为空则用字符代替。调试过程还有一个相当容易
10、出现的错误就是用来接收输入的字符的数组长度设置,若要得到一个比较理想的状态,则需要将该数组设置得较大,若过小,如4个长度的数组,则在敲入第五个字符时就会出现“死机”,而另一方面,整数表示的范围有限,若输入的整数位数超过了整数范围,则也会出现溢出。六 结论通过过去两个星期的课程设计,不但使我复习了前面学嵌入式的知识的同时也学到了新的知识,在这次课程设计由五位小组成员组成了我们的设计组,在设计过程中遇到了许多疑点和难点,在组员的探讨中,和老师的帮助下,我们逐一解决了这些问题,但在这其中我们也走了不少弯路使我们知道自己的不足之处。有时虽然感觉理论知识已经掌握了,但在运用到实践的过程中仍有意想不到的困
11、惑,经过一番努力才得以解决。这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名信号处理专业的学生,应用类的课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于专业知识懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是通过这两个礼拜的学习与实践,在小组同学的帮助和讲解下在老师的耐心辅导下,渐渐对所涉及到的专业知识产生了些许的兴趣,自己开始主动学习并逐
12、步从基础慢慢开始弄懂它们。我认为这个收获应该说是相当大的。课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合相处,以及自身的动脑和努力,都是以后工作中需要的。 参考文献:【1】 孙纪坤,张小全.嵌入式LINUX 系统开发技术祥解基于ARM.北京: 人民邮电出版社2006.【2】李亚锋,欧文盛等.ARM嵌入式LINUX 系统开发从入门到精通.北京: 清华大学出版社2007.【3】杜春雷.ARM体系结构与编程.北京:清华大学出版社2003年.【4】亚荷毛尔等.构建嵌入式LINUX系统.中国电力出版社2011年附件*/#incl
13、ude./ucos-ii/includes.h /* uC/OS interface */#include ./ucos-ii/add/osaddition.h./inc/drivers.h./inc/sys/lib.h./src/gui/gui.h#include stdio.h#pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting /*任务定义*/OS_STK Main_StackSTACKSIZE=0, ; /Main_Test_Task堆栈void Main_Task(void
14、 *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_Prio 1#define Touch_Screen_Task_Prio 9#define Key_Scan_Task_Prio 58#define Lcd_Fresh_prio 59#define Led_Flash
15、_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=0 initOSMessage(); initOSList(); initOSDC(); initOSCtrl(); LoadFont();#endif loadsystemParam(); / create
16、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_S
17、TK *)&test_StackSTACKSIZE-1, test_Task_Prio); OSAddTask_Init(1);Starting uCOS-II.nEntering 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 left
18、Text=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() /打开文件写数据保存w if(pfile=NULL) fwr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1