多行文本框设计.docx
《多行文本框设计.docx》由会员分享,可在线阅读,更多相关《多行文本框设计.docx(28页珍藏版)》请在冰豆网上搜索。
多行文本框设计
嵌入式系统课程设计
题目:
ARM多行文本框设计
学生姓名:
XXX
学号:
XXXXXXXXX
指导教师:
XXXXXXX
同组成员:
XXXXXXXX
起止时间:
20XX年12月10日
目录
1设计任务与要求6
2引言7
3硬件设计8
4软件设计8
5调试过程及问题分析12
6结论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、ARMADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
3.2硬件使用
通过ARM嵌入式开发平台的按键输入数据(0至9按键),再按enter键,在上下两个文本框中分别显示计算过程与计算结果,并且在超级终端中显示计算式与结果。
四软件设计
4.1总体方案设计:
1、用多个现有文本框设计成多行文本框,设计它们的位置坐标,让它们看起来紧挨
2、在响应enter按键时,下一个文本框的可见状态从不可见变成可见,焦点移动到下一文本框
3、判断输入有没有进入到文本框末尾位置,如果是,则移动到下一文本框
4.2数据的计算判断
if(c[0]=='+')
{
num=num1+num2;
Uart_Printf(0,"%3.3f%c%3.3f=\n",num1,c[0],num2);
Uart_Printf(0,"%3.3f",num);
Uart_Printf(0,"\n");
a[0]='\0';
b[0]='\0';
c[0]='\0';
num1=num2=0;
/////////////////把num设进第二个文本框,保留三位小数///////////////////
fint=num*1000;
while(fint!
=0)
{
str1[k]=fint%10;
fint=fint/10;
//Uart_Printf(0,"%d",str1[k]);
k++;
}
while(k>2)
{
str2[p]=str1[k]+'0';
//Uart_Printf(0,"%c",str2[p]);
p++;k--;
}
str2[p]='.';p++;
str2[p]=str1[2]+'0';p++;
str2[p]=str1[1]+'0';p++;
str2[p]=str1[0]+'0';p++;
k=0;
p=0;
fint=0;
SetTextCtrlText(pTextCtrl[1],str2,TRUE);//设置文本框内容
DrawTextCtrl(pTextCtrl[1]);//重绘文本框
////////////////////////////////////////////////////////////////////////
}
/************************************************************/
elseif(c[0]=='-')
{
if(num1>=num2)//相减得到正数
{
num=num1-num2;
Uart_Printf(0,"%3.3f%c%3.3f=\n",num1,c[0],num2);
Uart_Printf(0,"%3.3f",num);
Uart_Printf(0,"\n");
a[0]='\0';
b[0]='\0';
c[0]='\0';
num1=num2=0;
/////////////////把num设进第二个文本框,保留三位小数///////////////////
fint=num*1000;
while(fint!
=0)
{
str1[k]=fint%10;
fint=fint/10;
//Uart_Printf(0,"%d",str1[k]);
k++;
}
while(k>2)
{
str2[p]=str1[k]+'0';
//Uart_Printf(0,"%c",str2[p]);
p++;k--;
}
str2[p]='.';p++;
str2[p]=str1[2]+'0';p++;
str2[p]=str1[1]+'0';p++;
str2[p]=str1[0]+'0';p++;
k=0;
p=0;
fint=0;
SetTextCtrlText(pTextCtrl[1],str2,TRUE);//设置文本框内容
DrawTextCtrl(pTextCtrl[1]);//重绘文本框
////////////////////////////////////////////////////////////////////////
}
else//相减得到负数
{
numtemp=num2-num1;//numtemp为正
num=0-numtemp;
Uart_Printf(0,"%3.3f%c%3.3f=\n",num1,c[0],num2);
Uart_Printf(0,"%3.3f",num);
Uart_Printf(0,"\n");
a[0]='\0';
b[0]='\0';
c[0]='\0';
num1=num2=0;
/////////////////把num设进第二个文本框///////////////////
fint=numtemp*1000;
while(fint!
=0)
{
str1[k]=fint%10;
fint=fint/10;
//Uart_Printf(0,"%3d",str1[k]);
k++;
}
/////////将'-'设进str2的的0位///////////////////////////
p=0;
str2[p]='-';
p=1;
while(k>2)
{
str2[p]=str1[k]+'0';
//Uart_Printf(0,"%c",str2[p]);
p++;k--;
}
str2[p]='.';p++;
str2[p]=str1[2]+'0';p++;
str2[p]=str1[1]+'0';p++;
str2[p]=str1[0]+'0';p++;
k=0;
p=0;
fint=0;
SetTextCtrlText(pTextCtrl[1],str2,TRUE);//设置文本框内容
DrawTextCtrl(pTextCtrl[1]);//重绘文本框
////////////////////////////////////////////////////////////////
}
/************************************************************/
}
elseif(c[0]=='*')
{
num=num1*num2;
Uart_Printf(0,"%3.3f%c%3.3f=\n",num1,c[0],num2);
Uart_Printf(0,"%3.3f",num);
Uart_Printf(0,"\n");
a[0]='\0';
b[0]='\0';
c[0]='\0';
num1=num2=0;
/////////////////把num设进第二个文本框///////////////////
fint=num*1000;
while(fint!
=0)
{
str1[k]=fint%10;
fint=fint/10;
//Uart_Printf(0,"%3d",str1[k]);
k++;
}
while(k>2)
{
str2[p]=str1[k]+'0';
//Uart_Printf(0,"%c",str2[p]);
p++;k--;
}
str2[p]='.';p++;
str2[p]=str1[2]+'0';p++;
str2[p]=str1[1]+'0';p++;
str2[p]=str1[0]+'0';p++;
k=0;
p=0;
SetTextCtrlText(pTextCtrl[1],str2,TRUE);//设置文本框内容
DrawTextCtrl(pTextCtrl[1]);//重绘文本框
}
/************************************************************/
elseif(c[0]=='/')
{
if(num2==0)Uart_Printf(0,"dataerror...\n");
else
{
num=num1/num2;
Uart_Printf(0,"%3.3f%c%3.3f=\n",num1,c[0],num2);
Uart_Printf(0,"%3.3f",num);
Uart_Printf(0,"\n");
a[0]='\0';
b[0]='\0';
c[0]='\0';
num1=num2=0;
五调试过程及问题分析
调试过程中遇到的问题主要集中在下面几个地方:
从文本框中读取字符并转换成数字运算,将运算得到的结果转变成字符送给结果显示框,符号位的表示问题。
在从文本框中读取字符时,首先得判断读取到的字符是否为正确的,即第一位字符只能为数字字符,在遇到算术操作符时,如'+',即判断第一个数输入结束,并将其减去'0'再做适当的转换得到与字符表示一致的数字,但该过程中遇到的符点型数据输入是一个难题,在整个过程中,小数点'.'所代表的位在实验台的键盘上实现的是清空文本框功能,最后采用的措施是以键盘是的Num键表示小数点位,当按下Num键时,出现在文本框里面的是小数点,即在Num键按下时传递给文本框的是小数点的ASCII值46,而在符点型输入过程中的转换相对来说也更复杂,整数部分与整数转换相同,而小数部分的转换,则定义了一个数组ffloat[4]={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/OSinterface*/
#include"../ucos-ii/add/osaddition.h"
#include"../inc/drivers.h"
#include"../inc/sys/lib.h"
#include"../src/gui/gui.h"
#include
#include
#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting
///******************任务定义***************///
OS_STKMain_Stack[STACKSIZE]={0,};//Main_Test_Task堆栈
voidMain_Task(void*Id);//Main_Test_Task
#defineMain_Task_Prio12
OS_STKtest_Stack[STACKSIZE]={0,};//test_Test_Task堆栈
voidtest_Task(void*Id);//test_Test_Task
#definetest_Task_Prio15
/**************已经定义的OS任务*************
#defineSYS_Task_Prio1
#defineTouch_Screen_Task_Prio9
#defineMain_Task_Prio12
#defineKey_Scan_Task_Prio58
#defineLcd_Fresh_prio59
#defineLed_Flash_Prio60
***************************************/////////
///*****************事件定义*****************///
/////////////////////////////////////////////////////
//Mainfunction.//
////////////////////////////////////////////////////
intmain(void)
{
ARMTargetInit();//dotarget(uHALbasedARMsystem)initialisation//
OSInit();//neededbyuC/OS-II//
OSInitUart();
initOSFile();
#ifUSE_MINIGUI==0
initOSMessage();
initOSList();
initOSDC();
initOSCtrl();
LoadFont();
#endif
loadsystemParam();
//createthetasksinuC/OSandassignincreasing//
//prioritiestothemsothatTask3attheendof//
//thepipelinehasthehighestpriority.//
LCD_printf("CreatetaskonuCOS-II...\n");
OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE-1],Main_Task_Prio);
//OSTaskCreate(test_Task,(void*)0,(OS_STK*)&test_Stack[STACKSIZE-1],test_Task_Prio);
OSAddTask_Init
(1);
LCD_printf("StartinguCOS-II...\n");
LCD_printf("Enteringgraphmode...\n");
LCD_ChangeMode(DspGraMode);
OSStart();//starttheOS//
//neverreached//
return0;
}//main
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PTextCtrlpTextCtrl[2];//文本框结构控件指针,两个文本框
structRECTrect[2];//定义矩形框结构
intID_MainTextCtrl[2]={101,102};//文本框控件ID
intleftText=100,rightText=320;//文本框的左右对齐
inttopText[2]={30,50},bottomText[2]={50,70};//文本框的上下位置紧挨
//intstaticinstru=0;//文本框的指示变量
/*
intsysnumber=0;
charsysfilename[]="/sys/ucos/fj/sys.dat";//打开的文件名
voidLoadSysNumber()//打开文件读文件数据
{
FILE*pfile;//定义文件结构指针
pfile=fopen(sysfilename,"r");//打开文件
if(pfile==NULL){//打开文件失败
sysnumber=0;
return;
}
fread(&sysnumber,sizeof(int),1,pfile);//读文件
fclose(pfile);//关闭文件
}
voidSaveSysNumber()//打开文件写数据保存
{
FILE*pfile;
pfile=fopen(sysfilename,"w");
if(pfile==NULL){
return;
}
fwr