嵌入式计算器实验报告_第1页
嵌入式计算器实验报告_第2页
嵌入式计算器实验报告_第3页
嵌入式计算器实验报告_第4页
嵌入式计算器实验报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算器设计实验报告一、实验设计主要分工04009320文斌:算法设计,LCD显示。04*张希:界面(按钮控件)设计,文件内容读取。共同调试、完善设计。二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。程序任务开始后,等待键盘或触摸屏的输入。输入键有09数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter=键、.小数点键。每当有字符

2、输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。当输入del键时,屏幕显示去掉最后一位字符。当输入=号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“SyntaxError!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入clear键时,情况显示区域。当输入read键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。LCD显示界面如下:输入显示:结果输

3、出:del123+clear456read789*enter(0)/三、程序算法实现1、计算算法首先将输入的09数字、+-*/()运算符的内容存储于一个全局变量calnumber中,表达为中缀表达式。用voidstr2repol()函数,将输入字符串calnumber转换成逆波兰表达式并存于全局数组charrepolmaxs中。str2repol()函数中缀表达式转成逆波兰后缀表达式算法如下:(1)首先构造一个运算符栈stackmaxs,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个中缀表示算术表达式strmaxs(注:stri=cali)。从左至右扫描该算术表达式,从第一个字符开

4、始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出到repolmaxs中。如果不是数字,该字符则是运算符,此时需比较优先关系。步骤如下:若为左括号(则压入运算符栈顶;若为其他运算符,则将该字符与运算符栈顶的运算符的优先关系相比较。若该字符优先关系高于此时运算符栈顶的运算符,则将该运算符入栈。若该字符优先关系不高于此时运算符栈顶的运算符,则将栈顶的运算符从栈中弹出到repolmaxs,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。若为有括号(则弹出运算符栈顶的运算符至到repolmaxs,直到遇到左括号(弹出并作废此开括号。重复上述操作。中缀表达式转成逆波兰后缀表达式后,

5、calculate()函数计算后缀表达式的值算法如下:用局部数组stacktop存放运算结果,top初值为0.依次读入后缀表达式repolmaxs啲字符ch,循环判断ch。若ch为运算符,则stacktop-1与stacktop做相应运算。若运算只需单操作数则stacktop做相应运算。运算结果存于stacktop-1。然后top。否则ch为数字或小数点为数字则d=10.0*d+ch-0;(d初始值为0,用于存放连续数字字符的数学值)。遇小数点,d保持原值。小数点后的数字符与小数点前的数字符一样处理,i记录小数点后的数字符个数。最后d=d/(10i),top+;stacktop=d。注:若st

6、r2repol()函数遇非法字符时,LCD输出相应提示,不调用calculate()。若calculate()函数遇除零,则不做运算,LCD输出“/OERROR!”。2、按键控件3、LCD输出显示将字符串转为Unicode编码,在指定坐标处用文本模式显示字符串。实现函数如下:voidlcddisplay(char*str,intxx,intyy)PDCpdc;/创建绘图设备上下文结构U16chx100;pdc=CreateDC();/创建绘图设备上下文strChar2Unicode(chx,str);TextOut(pdc,xx,yy,chx,TRUE,FONTSIZE_MIDDLE);/文本

7、模式下显示文字DestoryDC(pdc);/删除绘图设备上下文注:由于计算器计算结果为double型数据,需将double型数据转为字符串。实现函数如下:char*doub2str(doubled,char*str)charstr240;/double型数据d转为字符串存于strdoublef=-1.0;intj=0,k,i,st,t;if(d=0.0)str0=0;strl=0;/判断d为0elseif(d0.0)d=-d;st=1;str0=-;/判断为负数elsest=0;i=(int)d;/正浮点数的整数部分while(i!=0)str2j+=i%10+0;i/=10;for(k=0

8、;kj;k+)strk+st=str2j-1-k;if(st=1)j=j+st;st=0;strj+=.;d-=(int)d;/正浮点数的小数部分for(i=0;i10;i+)d*=10;strj+=(int)d+0;d-=(int)d;while(strj=0);/去掉末尾的0str+j=0;returnstr;4、文本读取四、程序设计流程图等待输入NYYonKey(pMsg-WParam,pMsg-LParam);myontouch(pMsgWParam&0 xffff,pMsgWParam16)非读.非开始J非读,非读文件读文件Str2repol();Calculate();结果显示创建

9、按钮myButtonall();存输入字符cali键盘消息触摸屏消息readfile()readfile()五、程序实现主要函数功能说明(1)voidMain_Task(void*Id):主任务函数;功能:创建消息结构;清除屏幕;调用创建按钮控件函数;等待消息;判断消息;调用消息处理函数;(2)voidmyButtonall():创建按钮控件函数功能:调用相关函数;SetRect();CreateButton();DrawButton(b19);创建按钮;voidonKey(unsignedintnkey,intfnkey):键盘消息响应函数功能:判断按键;调用相关按键响应函数;voidmyo

10、ntouch(intxxx,intyyy):触摸屏消息响应函数功能:识别触摸区域;调用响应触摸键响应函数;voidstr2repol():字符表达式转逆波兰表达式函数功能:判别首位字符是否为-号,是则将字符串后移一位,首位置0;判别有无非法字符有则标志位err=1;将输入字符串转成逆波兰表达式;voidcalculate():计算函数功能:判别标志位err。为1则输出“SyntaxError!!并退出,否则继续-判别逆波兰表达式内容;判别小数点-对数字做相应加权判别运算符-做相应运算调用double型转字符串函数;调用字符串结果显示函数。char*doub2str(doubled,char*s

11、tr):double型转字符串函数功能:判别d是否为负数。是则字符串首位置-;d取反,继续-判别d小数部分是否为零。是则整数转字符串,否则再继续一小数转字符串将double型数字转换成字符串类型;存储字符串并返回。voidlcddisplay(char*str,intxx,intyy):字符串显示函数功能:将字符串str显示在LCD的指定坐标(xx,yy)。voidredraw(charkey):重画按钮函数功能:响应相应函数;重画相应按钮;延时100ms后恢复原按钮。charzb2key(intx,inty):坐标转按键函数功能:将触摸点坐标(x,y)转换成相应按键字符。voiddcr(ch

12、arkey):退格、清屏、读文件函数功能:响应退格键,屏幕显示去除最后一位字符,当前输入后前一次输入置0;响应清屏键,清楚显示区域内容;响应读文件,调用读文件函数。voidreadfile():读文件函数功能:读取指定目录文本文件;显示文本内容;计算内容(表达式)并显示。voidclc():清屏函数功能:清除显示区域内容。六、完整【main.c】程序#include./ucos-ii/includes.h/*uC/OSinterface*/#include./ucos-ii/add/osaddition.h#include./ucos-ii/add/ustring.h#include./inc

13、/drivers.h#include#include./inc/sys/lib.h#include./src/gui/gui.h#include#includecharTextFilename=/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#defineyz100charcalmaxs;charreadmaxs;intnumber=1,

14、clear=1;doubleresult;U16str120;charrepolmaxs;/*存储后缀表达式*/voidMain_Task(void*Id);/Main_Test_Taskvoidcalculate();voidstr2repol();voidreadfile();voidclc();voidsend();voidlcddisplay(char*str,intxx,intyy);voidrezdisplay(doubleres);voidonKey(unsignedintnkey,intfnkey);voidmyontouch(intxxx,intyyy);voidmyButt

15、onall();voidredraw(charkey);voidsend(PButtonCtrlb);charzb2key(intx,inty);voiddcr(charkey);char*doub2str(doubled,char*str);/*任务定义*/Main_Test_Task堆栈/test_Test_Task堆栈/test_Test_TaskOS_STKMain_StackSTACKSIZE=0,;#defineMain_Task_Prio12voidontouch(unsignedintx,inty);OS_STKtest_StackSTACKSIZE=0,;voidtest_T

16、ask(void*Id);#definetest_Task_Prio15PButtonCtrlb0;PButtonCtrlb1;PButtonCtrlb2;PButtonCtrlb3;PButtonCtrlb4;PButtonCtrlb5;PButtonCtrlb6;PButtonCtrlb7;PButtonCtrlb8;PButtonCtrlb9;PButtonCtrlb10;PButtonCtrlb11;PButtonCtrlb12;PButtonCtrlb13;PButtonCtrlb14;PButtonCtrlb15;PButtonCtrlb16;PButtonCtrlb17;PBut

17、tonCtrlb18;PButtonCtrlb19;/PTextCtrlb20;U32CtrlID0=200;U32CtrlID1=201;U32CtrlID2=202;U32CtrlID3=303;U32CtrlID4=204;U32CtrlID5=205;U32CtrlID6=306;U32CtrlID7=207;U32CtrlID8=208;U32CtrlID9=209;U32CtrlID10=210;U32CtrlID11=211;U32CtrlID12=212;U32CtrlID13=213;U32CtrlID14=214;U32CtrlID15=215;U32CtrlID16=21

18、6;U32CtrlID17=217;U32CtrlID18=218;U32CtrlID19=219;U32CtrlID20=220;struetRECTrectO;/定义矩形框结构structRECTrect1;structRECTrect2;structRECTrect3;structRECTrect4;structRECTrect5;structRECTrect6;structRECTrect7;structRECTrect8;structRECTrect9;structRECTrect1O;structRECTrect11;structRECTrect12;structRECTrect1

19、3;structRECTrect14;structRECTrect15;structRECTrect16;structRECTrect17;structRECTrect18;structRECTrect19;structRECTrect2O;U16CaptionO16;/定义按键功能U16Caption116;U16Caption216;U16Caption316;U16Caption416;U16Caption516;U16Caption616;U16Caption716;U16Caption816;U16Caption916;U16Caption1O16;U16Caption1116;U1

20、6Caption1216;U16Caption1316;U16Caption1416;U16Caption1516;U16Caption1616;U16Caption1716;U16Caption1816;U16Caption1916;U16Caption_Actived16;U32ButtonStyle=5;U32ButtonStyle_Actived=3;U32ButtonFontSize=2;U32TextStyle=4;U32TextFontSize=2;/*主函数*/intmain(void)ARMTargetInit();OSInit();OSInitUart();initOSFi

21、le();#ifUSE_MINIGUI=0initOSMessage();initOSList();initOSDC();initOSCtrl();LoadFont();#endifloadsystemParam();LCD_printf(CreatetaskonuCOS-II.n);OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_StackSTACKSIZE-1,Main_Task_Prio);OSAddTask_Init(1);LCD_printf(StartinguCOS-II.n);LCD_printf(Enteringgraphmode.

22、n);LCD_ChangeMode(DspGraMode);OSStart();return0;/主任务/voidMain_Task(void*Id)PButtonCtrlb;POSMSGpMsg=0;/创建消息结构U32tou;intx=0;inty=0;ClearScreen();myButtonall();for(;)pMsg=WaitMessage(0);/等待消息switch(pMsg-Message)caseOSM_KEY:/键盘消息onKey(pMsg-WParam,pMsg-LParam);break;caseOSM_TOUCH_SCREEN:x=pMsg-WParam&0 x

23、ffff;y=pMsg-WParam16;myontouch(x,y);break;DeleteMessage(pMsg);/删除消息,释放资源voidonKey(unsignedintnkey,intfnkey)intret;char*str,skey16;cal0=0;if(clear=l)clear=O;clc();/清屏lcddisplay(cal+1,xz,yz);if(nkey&KEY_DOWN)=0)return;switch(nkey&0 xff)caseN:str=NumLock;clc();readfile();break;caser:str=Enter;calnumber

24、=;redraw(calnumber);printf(表达式:sn,cal+l);lcddisplay(cal+1,xz,yz);strlnumber=calnumber;str2repol();calculate();for(ret=l;ret=number;ret+)calret=0;if(ret=number)number=l;ret=2;clear=2;break;default:skey0=nkey;skeyl=0;str=skey;calnumber=nkey;redraw(calnumber);lcddisplay(cal+l,xz,yz);strlnumber=calnumbe

25、r;number+=l;if(clear=2)clear=l;printf(%sr,cal+l);voidmyontouch(intxxx,intyyy)intret;if(clear=1)clear=0;clc();/清屏calnumber=zb2key(xxx,yyy);redraw(calnumber);switch(calnumber)cased:printf(ndelren);dcr(calnumber);break;casec:dcr(calnumber);break;caser:dcr(calnumber);break;case=:printf(表达式:%sn,cal+1);lc

26、ddisplay(cal+1,xz,yz);str1number=calnumber;str2repol();calculate();clear=2;for(ret=1;ret=number;ret+)calret=0;if(ret=number)number=1;ret=2;break;default:if(clear=2)clear=1;str1number=calnumber;lcddisplay(cal+1,xz,yz);number+;break;printf(%sr,cal+1);voidstr2repol()/*将算术表达式转化为后缀表达式*/charstrmaxs,strtem

27、maxs;/*存储原算术表达式*/charstackmaxs;/*作为栈使用*/charch,*er;inti,t,top=0,j,sum,st;i=0;/*获取用户输入的表达式*/doi+;stri=cali;while(cali!=&i!=maxs);sum二i;/sum中记录了str表达式中的字符的个数t=1;i=1;if(str1=-)for(st=1;stsum;st+)strtemst=strst+1;str1=0;str2=-;for(st=3;st=0&ch=9|ch=.)/*判定为数字*/repolt=ch;t+;ch=stri;i+;i-;repolt=;t+;/*if(c

28、h9&ch!=.)Ier=error!;lcddisplay(er,xz,yz+20);ch=;*/ch=stri;i+;while(top!=0)repolt=stacktop;t+;top-;repolt=;voidcalculate()/*计算后缀表达式的值*/doublestackmaxs,d0,d1,dd;/*作为栈使用*/unsignedintre;charch,*restr,*rez;intt=l,top=0,counter,i;/*t为ex下标,top为stack下标*/staticintzh=1;ch=repolt;t+;while(ch!=)switch(ch)Icase+

29、:stacktop-l=stacktop-l+stacktop;top-;break;case-:stacktop-l=stacktop-l-stacktop;top-;break;case*:stacktop-l=stacktop-l*stacktop;top-;break;5/5case/:if(stacktop!=0)stacktop-l=stacktop-l/stacktop;elseprintf(nt除零错误!n);lcddisplay(ERROR!,xz,yz);/exit(0);/*异常退出*/top-;break;default:/*将数字字符转化为对应的数值*/dl=0;d0

30、=0;counter=0;while(ch=0&ch=9|ch=.)if(ch!=.&zh=l)d1=10.0*d1+ch-0;if(ch=.)zh=0;if(ch!=.&zh=0)d0=10.0*d0+ch-0;counter+;ch=repolt;t+;/计算zh=1;for(i=0;icounter;i+)d0=d0/10.0;dd=d1+d0;top+;stacktop=dd;ch=repolt;t+;/转换运算result=stacktop;printf(n计算结果:fnn,stacktop);rez=doub2str(result,restr);lcddisplay(rez,xz,

31、yz+20);voidlcddisplay(char*str,intxx,intyy)PDCpdc;/创建绘图设备上下文结构U16chx100;pdc=CreateDC();/创建绘图设备上下文fstrChar2Unicode(chx,str);TextOut(pdc,xx,yy,chx,TRUE,FONTSIZE_MIDDLE);/文本模式下显示文字DestoryDC(pdc);/删除绘图设备上下文voidmyButtonall()PDCpdc;/定义绘图设备上下文结构pdc=CreateDC();/创建绘图设备上下文/定义按键功能Int2Unicode(1,Caption0);Int2Un

32、icode(2,Caption1);Int2Unicode(3,Caption2);strChar2Unicode(Caption3,+);Int2Unicode(4,Caption4);Int2Unicode(5,Caption5);Int2Unicode(6,Caption6);strChar2Unicode(Caption7,-);Int2Unicode(7,Caption8);Int2Unicode(8,Caption9);Int2Unicode(9,Caption10);strChar2Unicode(Caption11,*);strChar2Unicode(Caption12,()

33、;Int2Unicode(0,Caption13);strChar2Unicode(Caption14,);strChar2Unicode(Caption15,/);strChar2Unicode(Caption16,del);strChar2Unicode(Caption17,read);strChar2Unicode(Caption18,clear);strChar2Unicode(Caption19,enter);strChar2Unicode(Caption_Actived,AAA);SetRect(&rect0,165,165,235,235);/第一行SetRect(&rect1,245,165,315,235);SetRect(&rect2,325,165,395,235);SetRect(&rect3,405,165,475,235);SetRect(&rect4,165,245,235,315);/第二行SetRect(&rect5,245,2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论