嵌入式--计算器--实验报告(共27页).doc
《嵌入式--计算器--实验报告(共27页).doc》由会员分享,可在线阅读,更多相关《嵌入式--计算器--实验报告(共27页).doc(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上 计算器设计实验报告一、 实验设计主要分工 文斌:算法设计,LCD显示。04* 张希:界面(按钮控件)设计,文件内容读取。共同调试、完善设计。二、 程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。程序任务开始后,等待键盘或触摸屏的输入。输入键有09数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter=键、.
2、小数点键。每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。当输入del键时,屏幕显示去掉最后一位字符。当输入=号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入clear键时,情况显示区域。当输入read键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。LCD显示界面
3、如下:输入显示:结果输出:del123+clear456-read789*enter(0)/三、 程序算法实现 1、计算算法 首先将输入的09数字、+-*/()运算符的内容存储于一个全局变量calnumber中,表达为中缀表达式。用void str2repol()函数,将输入字符串calnumber转换成逆波兰表达式并存于全局数组char repolmaxs中。str2repol()函数中缀表达式转成逆波兰后缀表达式算法如下:(1)首先构造一个运算符栈stackmaxs,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个中缀表示算术表达式strmaxs(注:stri=cali)。(3)
4、从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出到repolmaxs中。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。步骤如下:若为左括号(则压入运算符栈顶;若为其他运算符,则将该字符与运算符栈顶的运算符的优先关系相比较。若该字符优先关系高于此时运算符栈顶的运算符,则将该运算符入栈。若该字符优先关系不高于此时运算符栈顶的运算符,则将栈顶的运算符从栈中弹出到repolmaxs,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。若为有括号(,则弹出运算符栈顶的运算符至到repolmaxs,直到遇到左括号(。弹出并作废此开括号
5、。(5) 重复上述操作。中缀表达式转成逆波兰后缀表达式后,calculate()函数计算后缀表达式的值算法如下: 用局部数组stacktop存放运算结果,top初值为0.(1) 依次读入后缀表达式repolmaxs的字符ch,循环判断ch。(2) 若ch为运算符,则stacktop-1与stacktop做相应运算。若运算只需单操 作数则stacktop做相应运算。运算结果存于stacktop-1。然后top- -。 否则ch为数字或小数点.,为数字则 d=10.0*d+ch-0; (d初始值为0,用 于存放连续数字字符的数学值)。遇小数点,d保持原值。小数点后的数字符与 小数点前的数字符一样处
6、理,i记录小数点后的数字符个数。最后d=d/(10i), top+;stacktop=d。注:若str2repol()函数遇非法字符时,LCD输出相应提示,不调用calculate()。若calculate()函数遇除零,则不做运算,LCD输出“/0ERROR!”。2、 按键控件3、 LCD输出显示将字符串转为Unicode编码,在指定坐标处用文本模式显示字符串。实现函数如下: void lcddisplay(char *str,int xx,int yy) PDC pdc;/创建绘图设备上下文结构 U16 chx100; pdc=CreateDC();/创建绘图设备上下文 strChar2U
7、nicode(chx, str); TextOut(pdc, xx, yy, chx, TRUE, FONTSIZE_MIDDLE);/文本模式下显示文字 DestoryDC(pdc);/删除绘图设备上下文 注:由于计算器计算结果为double型数据,需将double型数据转为字符串。 实现函数如下: char *doub2str(double d, char *str) char str240; /double型数据d转为字符串存于str double f=-1.0;int j=0,k,i,st,t; if(d=0.0)str0=0;str1=0;/判断d为0 else if(d0.0)d=
8、-d;st=1;str0=-;/判断为负数 else st=0; i=(int)d; /正浮点数的整数部分 while(i!=0) str2j+=i%10+0;i /= 10; for(k=0;kj;k+) strk+st = str2j-1-k; if(st=1)j=j+st;st=0; strj+=.; d -= (int)d; /正浮点数的小数部分 for(i=0;i 判别逆波兰表达式内容; 判别小数点-对数字做相应加权 判别运算符-做相应运算 调用double型转字符串函数; 调用字符串结果显示函数。(7)char *doub2str(double d, char *str):doub
9、le型转字符串函数功能:判别d是否为负数。是则字符串首位置-;d取反,继续- 判别d小数部分是否为零。是则整数转字符串,否则再继续小数转字符串 将double型数字转换成字符串类型; 存储字符串并返回。(8)void lcddisplay(char *str,int xx,int yy):字符串显示函数功能:将字符串str显示在LCD的指定坐标(xx,yy)。(9) void redraw(char key):重画按钮函数功能:响应相应函数; 重画相应按钮; 延时100ms后恢复原按钮。(10) char zb2key(int x,int y):坐标转按键函数功能:将触摸点坐标(x,y)转换成
10、相应按键字符。(11) void dcr(char key):退格、清屏、读文件函数功能:响应退格键,屏幕显示去除最后一位字符,当前输入后前一次输入置0; 响应清屏键,清楚显示区域内容; 响应读文件,调用读文件函数。(12) void readfile():读文件函数功能:读取指定目录文本文件; 显示文本内容; 计算内容(表达式)并显示。(13) void clc():清屏函数功能:清除显示区域内容。 六、完整【main.c】程序#include ./ucos-ii/includes.h /* uC/OS interface */#include ./ucos-ii/add/osadditio
11、n.h#include ./ucos-ii/add/ustring.h#include ./inc/drivers.h#include#include ./inc/sys/lib.h#include ./src/gui/gui.h#include #include char TextFilename=/sys/ucos/fj/2.txt; /自定义声明/文件test: 1+2+3+4+5+6+7+8+9=/文件1: 1+2+3+4+5+6+7+8+9=/文件2: 0.7+5*(1+2)/(2+4)=/文件3: FILE* pfile;#define maxs 200#define react
12、100#define xz 130#define yz 100char calmaxs;char readmaxs;int number=1,clear=1;double result;U16 str120;char repolmaxs; /*存储后缀表达式*/void Main_Task(void *Id); /Main_Test_Taskvoid calculate();void str2repol();void readfile();void clc();void send();void lcddisplay(char *str,int xx,int yy);void rezdispla
13、y(double res);void onKey(unsigned int nkey, int fnkey);void myontouch(int xxx,int yyy);void myButtonall();void redraw(char key);void send(PButtonCtrl b);char zb2key(int x,int y);void dcr(char key);char *doub2str(double d, char *str);/*任务定义*/OS_STK Main_StackSTACKSIZE=0, ; /Main_Test_Task堆栈#define Ma
14、in_Task_Prio 12void ontouch(unsigned int x, int y);OS_STK test_StackSTACKSIZE=0, ; /test_Test_Task堆栈void test_Task(void *Id); /test_Test_Task#define test_Task_Prio 15PButtonCtrl b0;PButtonCtrl b1;PButtonCtrl b2;PButtonCtrl b3;PButtonCtrl b4;PButtonCtrl b5;PButtonCtrl b6;PButtonCtrl b7;PButtonCtrl b8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 计算器 实验 报告 27
限制150内