任永哲061409嵌入式系统课程设计报告.docx
《任永哲061409嵌入式系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《任永哲061409嵌入式系统课程设计报告.docx(15页珍藏版)》请在冰点文库上搜索。
任永哲061409嵌入式系统课程设计报告
课程设计报告
基于触摸屏的电子计算器
班级:
20090614
学号:
2009061409
姓名:
任永哲
教师评语:
教师签名:
2012年10月
课程设计题目
基于触摸屏的电子计算器
主要内容
通过键盘与LED实现多位数字的连续四则运算以及平方运算,通过键盘输入数字与运算符号,按回车之后显示LED运算结果。
图形界面设计,支持触摸屏实现加减乘除平方等简单功能。
采用的工具方法
以博创UP-NETARM3000实验台和ADS1.2软件为实验环境,仿真器驱动程序,超级终端通讯程序。
ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机、串口线,超级终端。
进度安排
1.讨论写出核心计算算法。
2.实现通过键盘输入数字与运算符号,按回车之后在超级终端上显示运算结果。
3.通过LED与键盘实现多位数字的连续四则运算以及平方运算
4.研究触摸屏支持的计算器界面,与实现算法。
5.对功能进行简单的测试并修改bug,优化代码,使系统的功能更为完善。
参考资料
《基于ARM的嵌入式系统设计实验与实践教程》
《嵌入式系统开发原理与实践》
《基于ARM的嵌入式系统开发与实例》
《ARM3000实验指导书》
1.题目
基于触摸屏的电子计算器
2.系统简介
嵌入式系统的计算器已经受广大人民的欢迎,他越来越多的人提供了便利。
本系统使用ADS1.2的开发环境,在UP-net3000实验平台实现其具体功能。
嵌入式系统具有便利灵活、性能价格比高、嵌入性强等特点,可以嵌入到现有任何信息家电和工业控制系统中。
从软件角度来看,嵌入式系统具有不可修改性、系统所需配置要求较低、系统专业性和实时性较强等特点。
很显然本计算器也有如上的几个重要特点。
本系统的界面由图形来设计的,是一个基于触摸屏的电子计算器,不仅能实现计算器的简单的加法、减法、除法、乘法、平方法,还能通过触摸屏以及键盘的输入对计算器进行控制。
根据基本的功能可以分为三个重要模块:
核心计算模块,输入模块,输出模块。
输入模块可以分为两种类型,小键盘输入和触摸屏输入信息(包括符号和数字)。
核心计算模块主要负责对输进来的数字的计算,根据小键盘和触摸屏上的符号获得值,再根据这个参数值不同做相应的处理,最终可以实现所述的基本计算功能。
输出模块主要由LED数码管和触摸屏LCD来输出结果。
不管选择输入模块哪一个方式,在输出模块的两个主要显示方式都会运行,也就是说不仅能在屏幕上显示结果,也能通过LED数码管来显示其结果。
3.系统设计
一、系统核心算法
本系统是支持小键盘,LED和触摸屏的简单计算器,我做的是小键盘和LED显示的模块。
不管是什么模块都要用到核心计算算法,算法的思想为如下:
(1)写数字函数。
设置一个m_second的参数,每当按下按键或触摸某个数字时会用一个m_second的参数来存值,值到出现符号键为止他会反复做m_second=m_second*10+数字这个操作,最后的结果也当然存到m_second这个参数里。
(2)写小数点运算函数:
跟数字函数类同,不一样的是多了个小数点运算。
用m_coff参数来设定小数点参数。
也就是说当点击“.”或小数点触摸屏的时候做如下操作,直到出现符号键为止反复做m_second=m_second+数字*m_coff和m_coff*=0.1等操作。
(3)把
(1)
(2)功能用if语句来合并。
如果想要输入整数型的数字则做
(1)操作,若果要输入浮点型的数字则做
(2)操作。
(4)写符号函数。
设定m_first,m_coff参数,他在一个运算里面始终是加数,相反m_second始终是被加数。
每次完成一次运算后默认把最终结果赋值给m_first,这样系统就可以满足有记忆功能的特点。
当每次按下符号键或触摸屏上的符号时就会根据不同的符号功能来处理计算:
m_first符号=m_second。
加法,减法,乘法,平方法类似。
由于除法的特殊性除法要考虑的因素就多了点,如果要被除的数字小于等于0.000001的时候他就显示错误,其余情况正常计算。
(5)本系统默认有记忆功能,也就是说计算完一次运算后他还保留原先的值。
设m_first值为0,m_second是被计算的值。
每次算完一次运算后最终计算得出来的值存到m_first里,并把m_second和m_coff值复位,分别写成初始值0.0和1.0,这样他们才能改变为要写入的数字。
(6)当把所述的函数写完后为了方便用switch语句来分辨符号,设置一个m_operator参数,他是switch语句里的表达式,常量表达式当然分为“+”,“-”,“*”,“∕”,“s”。
根据不同的符号进入case,完成具体的计算。
voidCalculate()
{switch(m_operator){
case'+':
m_first+=m_second;break;
case'-':
m_first-=m_second;break;
case'*':
m_first*=m_second;break;
case'/':
if(fabs(m_second)<=0.000001)
{m_display="除数不能为零";return;
}
m_first/=m_second;break;
case's':
m_first*=m_first;break;
}m_second=0.0;m_coff=1.0;
UpdateDisplay(m_first);}
根据思想可以设计出如下几个核心函数:
计算函数Calculate(),OnButton0()到OnButton9()的数字函数,平方函数OnButtonSqrt(),反函数OnButtonSign(),乘法OnButtonMutiply(),减法函数OnButtonMinus(),加法函数OnButtonAdd(),除法函数OnButtonDiv(),清零函数OnButtonClear(),小数点函数OnButtonPoint()。
二、小键盘模块设计
Zlg7289芯片驱动17键的键盘,进入keyboard.c可以设置数字按键0到9的值为11,2,10,18,1,9,17,0,8,16。
符号键可以设置成“小数点”为19,“+”为24,“-”为21,“*”为20,“%”为12,“=”为26,“清零”为4。
首先设一个key值,定义为键盘输入进去的值,key=Zlg7289_ReadKey(),进行判断,大体分为两种情况。
第一种在小键盘上按下数字键后根据如上设置的数字,不同的值对应不同的显示。
伪代码为if(key==值)
{
Buffer='数字';
Uart_Printf("%c\n",Buffer);
OnButton数字();
}
第二种根据不同的符号按键的出来的key值来进行判断,对应的值对应不同运算结果。
伪代码为if(key==值)
{
Buffer='符号';
Uart_Printf("%c\n",Buffer);
OnButton符号函数();
}
三、LED模块设计
利用键盘驱动函数来实现LED模块设计。
从ZLG7298ZLG7289读取键值的方法为如下:
开启zlg7298,用zlg7298.h里的zlg7298—ENABLE()控制。
接下来要发送读取键值命令,运用WriteSDIO(data)函数。
向同步串口发送完数据后读取按键值,由ReadSDIO()函数来实践。
从同步串口读取数据后要关闭zlg7298,由zlg7298—DISABLE()函数来完成。
当判断有键按下后从zlg7298读取键值,按键值有效后通过键盘映射表得到按键值
用GetKey()函数实现基本数字输入,得到按键值。
驱动共阴极LED,LED数码管有八位的显示管,使zlg7289占有同步串口后然后从个位数到千万位依次在0到7的数码管上显示。
写到每个数码管的读取数字应当为sum/位数%10。
当判断有键按下后从zlg7298读取键值,按键值有效后通过键盘映射表得到按键值根据如上思想可以写出函数,为UpdateDisplay(intsum)。
四、触摸屏的理解
完成以上的三个主要模块后对触摸屏进行研究,由于分工明确,这部分的内容只是后来两个大模块加在一起后对系统进行优化和修改的时候所理解的。
该系统是在基于ucos-ii系统内核的基础上完成电子计算器的开发,因此首先要编写一个电子计算器的任务,定义获取触摸位置的结构体和结构体指针,接着用strChar2Unicode(Num_Button_0_Caption_16,Num_Button_0_Caption_8)函数来将字符型转换为unicode型的字符,定义按钮的坐标位置,CreateButton函数来创建一个按钮控件并用DrawButton函数来在LCD屏幕上画出按钮。
当发生触摸动作时,系统首先进行获取坐标值的操作,接下来通过函数IsInRect2()判断触摸的坐标在哪一个按钮区域内。
调用函数OnButton0()来响应这次操作。
4.系统实现
一、核心算法的实现:
通过各种符号来实现对应的计算,计算函数实现完后开始写实现数字的函数:
数字项:
voidOnButton数字()
{
If(m_coff==1.0)
m_second=m_second*10+数字;
else
{m_second=m_second+数字*m_coff;
m_coff*=0.1;}
UpdateDisplay(m_second);
}
平方函数voidOnButtonSqrt()
{
m_second=sqrt(m_second);
}
加法函数voidOnButtonAdd()
{Calculate();
m_operator='+';
}
减法,乘法,除法的实现方法类似于加法的函数,把m_operator='符号'代码行的符号改成对应的减法,乘法,除法就可以实现。
清空函数voidOnButtonClear()
{m_first=0.0;
m_second=0.0;
m_operator='+';
m_coff=1.0;}
运算浮点运算voidOnButtonPoint()
{
m_coff=0.1;
}
完成系统设计后根据思想写代码,系统小键盘和LED模块的设计流程图具体为如下:
图1系统流程图
二、LED模块实现
根据上面所设计到的思想,写出函数。
由于数码管上显示的是字符型,必须得把得出来的值强行转换成字符型。
每次写入一个数据后要有一定时间的延时。
具体的代码如下:
voidUpdateDisplay(intsum)//LED数字显示
{
ZLG7289_ENABLE();
Delay(5);
WriteSDIO(ZLG7289_CMD_DATA0|0);//数码管以方式0译码,第一个数码管亮
WriteSDIO(sum%10);//显示个位
Delay
(1);//延时
//键值大于9显示10位
WriteSDIO(ZLG7289_CMD_DATA0|1);//发送十位数据
WriteSDIO((unsignedchar)(sum/10%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_DATA0|2);//发送百位数据
WriteSDIO((unsignedchar)(sum/100%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_DATA0|3);//发送千位数据
WriteSDIO((unsignedchar)(sum/1000%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_DATA0|4);//发送万位数据
WriteSDIO((unsignedchar)(sum/10000%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_DATA0|5);//发送十万位数据
WriteSDIO((unsignedchar)(sum/100000%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_DATA0|6);//发送百万位数据
WriteSDIO((unsignedchar)(sum/1000000%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_DATA0|7);//发送千万位数据
WriteSDIO((unsignedchar)(sum/10000000%10));
Delay
(1);
WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示
ZLG7289_DISABLE();//zlg7289放弃同步串口控制权
Delay(5000);}
三、小键盘模块实现
小键盘输入:
定义一个pMsg并赋值WaitMessage(0),pMsg->Message可以分为触摸屏的OSM_TOUCH_SCREEN参数和小键盘的OSM_KEY参数。
根据上面的设计可以写出死循环的由switch语句来判断所选方式并实现小键盘的函数。
第一种在小键盘上按下数字键后根据如上设置的数字,不同的值对应不同的显示。
例如我选的数字为“0”的时候,他会进入OnButton0()函数来获取并在电脑上显示0这个数字;
第二种根据不同的符号按键的出来的key值来进行判断,对应的值对应不同运算结果。
例如选一个符号“+”的时候,进入OnButtonAdd()函数来做加法计算,当完成被计算的数字键被按操作后按下“=”符号就会完成加法计算并显示在超级终端上。
根据以上分析可以写代码,具体代码为如下:
Zlg7289_Reset();
for(;;)
{charBuffer;
pMsg=WaitMessage(0);
switch(pMsg->Message)
{
caseOSM_KEY:
{
key=Zlg7289_ReadKey();
key=11的时候按下的数字键是0
if(key==11)
{Buffer='0';
Uart_Printf("%c\n",Buffer);
OnButton0();
}
如同上述,根据key值可以判断1到9的数字键。
elseif(key==2)
{Buffer='1';
Uart_Printf("%c\n",Buffer);
OnButton1();
}
elseif(key==10)
{Buffer='2';
Uart_Printf("%c\n",Buffer);
OnButton2();
}
elseif(key==18)
{Buffer='3';
Uart_Printf("%c\n",Buffer);
OnButton3();
}
elseif(key==1)
{Buffer='4';
Uart_Printf("%c\n",Buffer);
OnButton4();
}
elseif(key==9)
{Buffer='5';
Uart_Printf("%c\n",Buffer);
OnButton5();
}
elseif(key==0)
{Buffer='7';
Uart_Printf("%c\n",Buffer);
OnButton7();
}
elseif(key==8)
{Buffer='8';
Uart_Printf("%c\n",Buffer);
OnButton8();
}
elseif(key==16)
{Buffer='9';
Uart_Printf("%c\n",Buffer);
OnButton9();
}
key=19的时候按下的符号键是“.”
elseif(key==19)
{Buffer='.';
Uart_Printf("%c\n",Buffer);
OnButtonPoint();
}
key=24的时候按下的符号键是“+”
elseif(key==24)
{Buffer='+';
Uart_Printf("%c\n",Buffer);
OnButtonAdd();
}
key=21的时候按下的符号键是“—”
elseif(key==21)
{Buffer='-';
Uart_Printf("%c\n",Buffer);
OnButtonMinus();
}
key=20的时候按下的符号键是“*”
elseif(key==20)
{Buffer='*';
Uart_Printf("%c\n",Buffer);
OnButtonMutiply();
}
key=12的时候按下的符号键是“\”
elseif(key==12)
{Buffer='/';
Uart_Printf("%c\n",Buffer);
OnButtonDiv();
}
key=26的时候按下的符号键是“=”
elseif(key==26)
{Buffer='=';
Uart_Printf("%c\n",Buffer);
OnButtonEqual();
}
key=4时符号键是“numberlock”,清零键在本系统默认为“numberlock”
elseif(key==4)
{Buffer='C';
Uart_Printf("%c\n",Buffer);
OnButtonClear();
}
}
}DeleteMessage(pMsg);
OSTimeDly(100);
}
}
结果及分析:
实验结果,小键盘输入:
2sqr*6∕3+4-1等运算。
LED依次显示:
2,4,24,8,12,11
由实验结果可以看出,本系统可以完成通过键盘与LED实现多位数字的连续四则运算以及平方运算的简单计算器功能。
5.总结
本次的嵌入式课程设计我们做出来的基于触摸屏的电子计算器,系统主要分为显示模块,LED模块,小键盘。
我们两个人首先讨论编写出计算器的核心计算算法,并分工各自的任务,我主要做的是LED模块和小键盘模块。
通过键盘与LED实现多位数字的连续四则运算以及平方运算,通过键盘输入数字与运算符号,按回车之后显示LED运算结果,支持触摸屏实现加减乘除平方等简单功能。
我们完成了题目的所有要求,由于开发难度以及时间不足等因素,系统性能方面存在一点不足之处。
十次的实验时间里,我们一直共同进退,一起分析问题。
虽然分工,但都彼此互相交流自己的想法,选取更为好的方法,遇到实在不会的地方时查阅资料一一解决。
在完成自己所负责的模块后继续研究触摸屏模块,最终弄出系统来。
完成本次课程设计,感受很大。
基本掌握了嵌入式系统及其应用系统的设计方法和基本开发流程,并通过实践再一次培养系统设计能力和团队协作能力。
6.参考文献
[1]武俊鹏,张国印,姚红爱,赵国冬.基于ARM的嵌入式系统设计实验与实践教程[M],北京:
清华大学出版社,2011.
[2]陈艳华,侯安华,刘盼盼.基于ARM的嵌入式系统开发与实例[M],电子工业出版社,2008.
[3]陈文智.嵌入式系统开发原理与实践[M],北京:
清华大学出版社,2005.
[4]刘岚,尹勇,李京蔚.基于ARM的嵌入式系统开发[M],北京:
清华大学出版社,2005.