您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 嵌入式--计算器--实验报告
计算器设计实验报告一、实验设计主要分工04009320文斌:算法设计,LCD显示。04**张希:界面(按钮控件)设计,文件内容读取。共同调试、完善设计。二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。程序任务开始后,等待键盘或触摸屏的输入。输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。当输入'del'键时,屏幕显示去掉最后一位字符。当输入'='号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“SyntaxError!!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入'clear'键时,情况显示区域。当输入'read'键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。LCD显示界面如下:输入显示:结果输出:del123+clear456-read789*enter(0)/三、程序算法实现1、计算算法首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中,表达为中缀表达式。用voidstr2repol()函数,将输入字符串cal[number]转换成逆波兰表达式并存于全局数组charrepol[maxs]中。str2repol()函数中缀表达式转成逆波兰后缀表达式算法如下:(1)首先构造一个运算符栈stack[maxs],此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个中缀表示算术表达式str[maxs](注:str[i]=cal[i])。(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出到repol[maxs]中。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。步骤如下:若为左括号‘(’则压入运算符栈顶;若为其他运算符,则将该字符与运算符栈顶的运算符的优先关系相比较。若该字符优先关系高于此时运算符栈顶的运算符,则将该运算符入栈。若该字符优先关系不高于此时运算符栈顶的运算符,则将栈顶的运算符从栈中弹出到repol[maxs],直到栈顶运算符的优先级低于当前运算符,将该字符入栈。若为有括号‘(’,则弹出运算符栈顶的运算符至到repol[maxs],直到遇到左括号‘(’。弹出并作废此开括号。(5)重复上述操作。中缀表达式转成逆波兰后缀表达式后,calculate()函数计算后缀表达式的值算法如下:用局部数组stack[top]存放运算结果,top初值为0.(1)依次读入后缀表达式repol[maxs]的字符ch,循环判断ch。(2)若ch为运算符,则stack[top-1]与stack[top]做相应运算。若运算只需单操作数则stack[top]做相应运算。运算结果存于stack[top-1]。然后top--。否则ch为数字或小数点‘.'’,为数字则d=10.0*d+ch-'0';(d初始值为0,用于存放连续数字字符的数学值)。遇小数点,d保持原值。小数点后的数字符与小数点前的数字符一样处理,i记录小数点后的数字符个数。最后d=d/(10^i),top++;stack[top]=d。注:若str2repol()函数遇非法字符时,LCD输出相应提示,不调用calculate()。若calculate()函数遇除零,则不做运算,LCD输出“/0ERROR!”。2、按键控件3、LCD输出显示将字符串转为Unicode编码,在指定坐标处用文本模式显示字符串。实现函数如下:voidlcddisplay(char*str,intxx,intyy){PDCpdc;//创建绘图设备上下文结构U16chx[100];pdc=CreateDC();//创建绘图设备上下文strChar2Unicode(chx,str);TextOut(pdc,xx,yy,chx,TRUE,FONTSIZE_MIDDLE);//文本模式下显示文字DestoryDC(pdc);//删除绘图设备上下文}注:由于计算器计算结果为double型数据,需将double型数据转为字符串。实现函数如下:char*doub2str(doubled,char*str){charstr2[40];//double型数据d转为字符串存于str[]doublef=-1.0;intj=0,k,i,st,t;if(d==0.0){str[0]='0';str[1]='\0';}//判断d为0else{if(d0.0){d=-d;st=1;str[0]='-';}//判断为负数elsest=0;i=(int)d;//正浮点数的整数部分while(i!=0){str2[j++]=i%10+'0';i/=10;}for(k=0;kj;k++)str[k+st]=str2[j-1-k];if(st==1){j=j+st;st=0;}str[j++]='.';d-=(int)d;//正浮点数的小数部分for(i=0;i10;i++){d*=10;str[j++]=(int)d+'0';d-=(int)d;}while(str[--j]=='0');//去掉末尾的0str[++j]='\0';}returnstr;}4、文本读取四、程序设计流程图等待输入开始N键盘消息触摸屏消息YYonKey(pMsg-WParam,pMsg-LParam);myontouch(pMsgWParam&0xffff,pMsgWParam16);存输入字符cal[i]Str2repol();Calculate();非’=’,非读非读,非’=’创建按钮myButtonall();结果显示readfile()readfile()‘=’‘=’读文件读文件五、程序实现主要函数功能说明(1)voidMain_Task(void*Id):主任务函数;功能:创建消息结构;清除屏幕;调用创建按钮控件函数;等待消息;判断消息;调用消息处理函数;(2)voidmyButtonall():创建按钮控件函数功能:调用相关函数;SetRect();CreateButton();DrawButton(b19);创建按钮;(3)voidonKey(unsignedintnkey,intfnkey):键盘消息响应函数功能:判断按键;调用相关按键响应函数;(4)voidmyontouch(intxxx,intyyy):触摸屏消息响应函数功能:识别触摸区域;调用响应触摸键响应函数;(5)voidstr2repol():字符表达式转逆波兰表达式函数功能:判别首位字符是否为'-'号,是则将字符串后移一位,首位置0;判别有无非法字符.有则标志位err=1;将输入字符串转成逆波兰表达式;(6)voidcalculate():计算函数功能:判别标志位err。为1则输出“SyntaxError!!”并退出,否则继续-判别逆波兰表达式内容;判别小数点-对数字做相应加权判别运算符-做相应运算调用double型转字符串函数;调用字符串结果显示函数。(7)char*doub2str(doubled,char*str):double型转字符串函数功能:判别d是否为负数。是则字符串首位置'-';d取反,继续-判别d小数部分是否为零。是则整数转字符串,否则再继续—小数转字符串将double型数字转换成字符串类型;存储字符串并返回。(8)voidlcddisplay(char*str,intxx,intyy):字符串显示函数功能:将字符串str[]显示在LCD的指定坐标(xx,yy)。(9)voidredraw(charkey):重画按钮函数功能:响应相应函数;重画相应按钮;延时100ms后恢复原按钮。(10)charzb2key(intx,inty):坐标转按键函数功能:将触摸点坐标(x,y)转换成相应按键字符。(11)voiddcr(charkey):退格、清屏、读文件函数功能:响应退格键,屏幕显示去除最后一位字符,当前输入后前一次输入置'\0';响应清屏键,清楚显示区域内容;响应读文件,调用读文件函数。(12)voidreadfile():读文件函数功能:读取指定目录文本文件;显示文本内容;计算内容(表达式)并显示。(13)voidclc():清屏函数功能:清除显示区域内容。六、完整【main.c】程序#include../ucos-ii/includes.h/*uC/OSinterface*/#include../ucos-ii/add/osaddition.h#include../ucos-ii/add/ustring.h#include../inc/drivers.h#includemath.h#include../inc/sys/lib.h#include../src/gui/gui.h#includestring.h#includestdio.hcharTextFilename[]=/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;#definemaxs200#definereact100#definexz130#defineyz100charcal[maxs];charread[maxs];intnumber=1,clear=1;doubleresult;U16str1[20];charrepol[maxs];/*存储后缀表达式*/voidMain_Task(void*Id);//Main_Test_Taskvoidcalculate();voidstr2repol();voidreadfile();voidclc();voidsend();voidlcddisplay(char*str,intxx,intyy);voidrezdisplay(doubleres);voidonKey(unsignedintnkey,intfnkey);voidmyontouch(intxxx,intyyy);voidmyButtonall();voidredraw(charkey);voidsend(PButtonCtrlb);charzb2key(intx,inty);voiddcr(charkey);char*doub2str(doubled,char*str);///******************任务定义***************///OS_STKMain_Stack[STACKSIZE]={0,};//Main_Test_Task堆栈#defineMain_Task_Prio12voidontouch(unsignedintx,inty);OS_STKtest_Stack[STACKSIZE]={0,};//test_Test_Task堆栈voidtest_Task(void*Id);//test_Test_Task#definetest_Task_Prio15PButtonCtrlb0;PButtonCtrlb1;PButtonCtrlb2;PButtonCtrlb3;PButtonCtrlb4;PButtonCtrlb5;PButtonCtrlb6;PButtonCtrlb7;PButtonCtrlb8;
本文标题:嵌入式--计算器--实验报告
链接地址:https://www.777doc.com/doc-5183979 .html