嵌入式实验cortexM3计算器资料Word文件下载.docx
《嵌入式实验cortexM3计算器资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式实验cortexM3计算器资料Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
日
1.设计内容…………………………………………………………………3
2重点要解决的问题及创新性;
…………………………………………3
3.概要设计
3.1中断控制部分……………………………………………………3
3.2显示函数编写………………………………………………………4
3.3运算符函数编写……………………………………………………………6
4.详细设计…………………………………………………………………9
4.1驱动程序头文件……………………………………………………94.2显示界面编写调试……………………………………………………………..10
4.3控件程序………………………………………………………………21
4.3.1数字按钮对应函数………………………………………………21
4.3.2运算符号对应函数………………………………………………26
5.实验、调试及测试结果与分析。
………………………………………31.
6.用户使用说明…………………………………………………………31
7.结论…………………………………………………………………32
8.参考文献……………………………………………………………32
一、设计内容:
本次设计主要以LM3S9B92开发板作为主要的开发平台,首先在这里对开发板的结构,和最重要的Cortex-M3微处理器,以及搭载的触摸屏液晶显示模块。
设计一个简易计算器,能够实现以触摸界面的形式给出简易计算器的操作界面,能实现简单的加、减、乘、除操作,并且将运算步骤都呈现在显示屏上。
二、重点要解决的问题及创新性:
重点:
1.设计计算器界面,将计算机控件布局到开发板上。
2.添加计算器控件的相应代码,使得计算器能够实现加减乘除基本功能。
3.
创新性:
1.界面的创新
2.计算器实现的运算过程显示在结果输入框内,使得能够记录运算过程。
三、概要设计(说明设计系统的组成及主要实现方法,并采用流程图等图形方式形象化说明);
软件设计基本包括了以下三个部分的内容:
中断控制部分、显示部分和运算部分
3.1中断控制部分
中断控制功能的实现是在驱动程序当中,因为是与硬件功能连接十分紧密的一个能实现。
但在实际应用中又与操作紧密相关,是软件设计中十分重要的部分。
其根本编程原理是由Cortex-M3提供了一套中断控制器所提供的API。
中断控制器API提供了一组函数,用来处理嵌套向量中断控制器(NVIC)。
这些函数执行以下功能:
使能和禁止中断、注册中断处理程序和设置中断的优先级。
同时在驱动文件中,重写了一些关于中断控制的函数。
在操作中,对触屏操作时,会产生一个软件中断,然后对所进行操作后,例如触摸屏的触点X,Y值进行锁存。
然后对锁存的数据进行读取,通过LCD显示相关的API函数,将得到的数值进行转化成对应函数操作,或显示,或运算等等。
最后将相关操作的结果,反映到LCD显示屏。
其流程图如图4.1所示。
图4.1中断控制流程图
3.2显示函数编写
显示功能,显示功能实现流程是如图4.2所示,将按键结果显示在LCD上的。
图3.2LCD读/写操作流程
在具体的实现过程中,本实验平台搭载的触摸屏,在软件上是靠一个WIDGET队列处理系统来接受显示资源,即主界面上的功能按钮,边框和显示区域等。
在声明了类似canvas(…)等画图,画按钮等方法后,在main函数中调用该方法。
并调用函数WidgetAdd(…函数名,函数名…),添加到消息队列中。
最后用一个死循环,循环执调用WidgetMessageQueueProcess()这么一个函数,完成LCD上显示输出所需要的内容。
所以在完成显示输出时,要调用画图的方法,再在主函数中,将画图的方法添加到消息队列,然后循环输出即可。
而在完成运算功能后的显示输出理论上是一样的,只是改变了内存当中的变量。
调用Canvas(…)函数作为一个变量显示区域,将完成计算后的结果从内存中取出,利用sprintf(变量名,显示格式,变量名)这样一个函数将输出结果存入对应Canvas的变量名中。
调用CanvasTextSet(…)改变Canvas(…)内变量的值,重新放入消息队列WidgetPaint((tWidget*)&
g_Result),完成一个显示输出的功能。
另一方面,显示效果的更改,是利用更新好的Canvas进行对前一次的输出结果的覆盖。
为了保证不会有显示前次效果的问题,则对显示的长度进行有一定位数的预留,每次显示相同长度。
如果数字长度不足,则同样预留了长度,这样可以对前次的显示结果完成一个覆盖的效果,避免显示错误。
同时对输入的数字有位数长度的限定,即当位数达到一定时,则只显示当前输入的数字,而不能继续输入。
方便确定运算结果的位数,也可以使得最后输出结果时不会因长度不足而又被覆盖不完全的错误。
总结,显示输出软件编写上是在不断调用消息队列WidgetMessageQueueProcess()时候,更新消息中的内容,并且重写覆盖已经显示的内容,达到完成显示所需数字和运算结果这样的效果。
3.3运算符函数编写
除了显示部分,本次设计另一大块的设计部分是函数运算模块的设计。
作为一个计算器,除了显示输入数字外,更重要的是得到所需要的计算结果。
所以,在完成数字显示结果的同时,应该考虑的是将输入数字,按照对应的按钮进行计算,输出结果。
函数运算编写包含几个部分:
第一,在能显示输入的数字以后,我们要将不断输入的数字变成对应的数进行输出。
图3.3数字组合成数显示流程图
如图所示,输入数字转化成数,关键是要记录两个部分,一个是存储当前输入数字,和已经输出的数。
将已经输出的数乘10和当前数字相加则成为一个新的数输出。
有小数点的数一样,在按下小数点后,改变一个标记位,同时声明一个新的计数器,每输入一个数字后乘以10的负计数次方,再加上已输出的数后,成为一个新的数。
一个数输入完毕后,将数放入一个数组中,以便在之后运算过程中读取输入结果。
对数的显示输出完成后,是按下相应运算符后进行对应的运算。
基本运算输出流程图如图3.4
图3.4根据运算符号输出结果流程图
完成运算符结果运算和显示的有两个要点,其一要在运算函数中传入已输入数字,和已存在的之前的预算结果,这两个数利用两个变量进行保存。
为了方便对两个变量进行操作,所以两个变量定义成全局变量来保存两者的值,方便在整个循环过程中调用,能够更简单和直观的对变量进行读取,存放运算结果。
第二,要定义符号的标志位,再按下按钮后,利用switch–case-default语句来根据标志位对运算符号进行判断。
根据对应的运算符号,对之前的两组数字进行预算。
即根据符号,将传进来的前一次预算结果和当前输入的数进行对应的加减乘除预算,运算完毕后将运算结果输出显示在显示屏上,显示方法相同,不再详述。
最后,在实际操作过程中,在一次运算计算完毕后,或者对当前输入有错误,将要重新输入的时候,要有一个对已保存的数据进行擦出,或者当前输入的数字进行取消的操作。
结束一次运算,根本上就是将运算结果置零,显示在屏幕上,并且之前内存中保存的运算结果和输入数置零,计数器清零。
这样回收已经占用的数组空间,可以节约内存,提升一定的运算效率。
而清除一次输入结果,只要将当前输入的数清零,计数器自减,显示结果置零,输出即可。
四、详细设计(各模块的设计分析、程序流程图等内容)
4.1驱动程序头文件
我们在编写程序的时候,要写入相应的头文件,并且加载相应的驱动程序文件,然后才能调用相关的驱动程序中初始化函数,和中断控制函数等,实现相关功能。
图4.1相关头文件加载
4.2显示界面编写调试
显示界面部分,分为三大块,即计算器边框,算数结果输出区域,和计算器按钮三大部分。
每个部分使用了对应的API函数。
4.2.1算数结果输出区域
调用了Canvas函数,是一个算数结果输出区域设置区域的实现功能函数。
Canvas(
//Name//pParent//pNext//pChild
g_Result,0,0,0,
//pDisplay//lX//lY
&
g_sKitronix320x240x16_SSD2119,0,0,
//lWidth//lHeight//ulStyle
320,50,CANVAS_STYLE_OUTLINE|CANVAS_STYLE_TEXT|
CANVAS_STYLE_TEXT_RIGHT|CANVAS_STYLE_TEXT_OPAQUE,
//填充颜色//外边框颜色//文字颜色//字体
ClrBlack,ClrWhite,ClrWhite,&
g_sFontCm22b,
//pcText//pucImage//pfnOnPaint
"
0"
0,0
);
4.2.2计算机边框
使用Container()函数
Container(
g_NumberContainer,0,0,0,
g_sKitronix320x240x16_SSD2119,0,50,
320,189,CTR_STYLE_OUTLINE,
0,ClrWhite,0,0,
//pcText
0
4.2.3计算器按键
使用RectangularButton函数,共设置“0-9”,“+”,“—”,“*”,“/”,“=”,“c”,“CE”,“.”这17个按键。
相应代码:
RectangularButton(
g_Num1Button,0,0,0,
g_sKitronix320x240x16_SSD2119,50,55,
50,41,PB_STYLE_TEXT|PB_STYLE_OUTLINE|PB_STYLE_FILL,
//填充颜色//按键填充颜色//外框颜色//文字颜色
ClrGreen,ClrRed,ClrWhite,ClrWhite,
//字体//pcText//pucImage//pucPressImage
g_sFontCm22b,"
1"
0,0,
//usAutoRepeatDelay//usAutoRepeatRate//pfnOnClick
0,0,OnNumber
g_Num2Button,0,0,0,
g_sKitronix320x240x16_SSD2119,105,55,
2"
g_Num3Button,0,0,0,
g_sKitronix320x240x16_SSD2119,160,55,
3"
g_Num4Button,0,0,0,
g_sKitronix320x240x16_SSD2119,50,101,
4"
g_Num5Button,0,0,0,
g_sKitronix320x240x16_SSD2119,105,101,
5"
g_Num6Button,0,0,0,
g_sKitronix320x240x16_SSD2119,160,101,
6"
g_Num7Button,0,0,0,
g_sKitronix320x240x16_SSD2119,50,146,
7"
g_Num8Button,0,0,0,
g_sKitronix320x240x16_SSD2119,105,146,
8"
g_Num9Button,0,0,0,
g_sKitronix320x240x16_SSD2119,160,146,
9"
g_Num0Button,0,0,0,
g_sKitronix320x240x16_SSD2119,50,193,
100,41,PB_STYLE_TEXT|PB_STYLE_OUTLINE|PB_STYLE_FILL,
//usAutoRepeatDe