




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 计算器设计实验报告1、 实验设计主要分工 文斌:算法设计,LCD显示。04* 张希:界面(按钮控件)设计,文件内容读取。共同调试、完善设计。2、 程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。程序任务开始后,等待键盘或触摸屏的输入。输入键有09数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'
2、;='键、.小数点键。每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。当输入'del'键时,屏幕显示去掉最后一位字符。当输入'='号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入'clear'键时,情况显示区域。当输入'read
3、9;键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。LCD显示界面如下:输入显示:结果输出:del123+clear456-read789*enter(0)/3、 程序算法实现 1、计算算法 首先将输入的09数字、+-*/()运算符的内容存储于一个全局变量calnumber中,表达为中缀表达式。用void str2repol()函数,将输入字符串calnumber转换成逆波兰表达式并存于全局数组char repolmaxs中。str2repol()函数中缀表达式转成逆波兰后缀表达式算法如下:(1)首先构造一个运算符栈stackmaxs,此运算符在栈内遵循越往栈
4、顶优先级越高的原则。(2)读入一个中缀表示算术表达式strmaxs(注:stri=cali)。(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出到repolmaxs中。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。步骤如下:若为左括号(则压入运算符栈顶;若为其他运算符,则将该字符与运算符栈顶的运算符的优先关系相比较。若该字符优先关系高于此时运算符栈顶的运算符,则将该运算符入栈。若该字符优先关系不高于此时运算符栈顶的运算符,则将栈顶的运算符从栈中弹出到repolmaxs,直到栈顶运算符的优先级低于当前运算符,将该字符入栈
5、。若为有括号(,则弹出运算符栈顶的运算符至到repolmaxs,直到遇到左括号(。弹出并作废此开括号。(5) 重复上述操作。中缀表达式转成逆波兰后缀表达式后,calculate()函数计算后缀表达式的值算法如下: 用局部数组stacktop存放运算结果,top初值为0.(1) 依次读入后缀表达式repolmaxs的字符ch,循环判断ch。(2) 若ch为运算符,则stacktop-1与stacktop做相应运算。若运算只需单操 作数则stacktop做相应运算。运算结果存于stacktop-1。然后top- -。 否则ch为数字或小数点.',为数字则 d=10.0*d+ch-'
6、0' (d初始值为0,用 于存放连续数字字符的数学值)。遇小数点,d保持原值。小数点后的数字符与 小数点前的数字符一样处理,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
7、pdc;/创建绘图设备上下文结构 U16 chx100; pdc=CreateDC();/创建绘图设备上下文 strChar2Unicode(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
8、;int j=0,k,i,st,t; if(d=0.0)str0='0'str1='0'/判断d为0 else if(d<0.0)d=-d;st=1;str0='-'/判断为负数 else st=0; i=(int)d; /正浮点数的整数部分 while(i!=0) str2j+=i%10+'0'i /= 10; for(k=0;k<j;k+) strk+st = str2j-1-k; if(st=1)j=j+st;st=0; strj+='.' d -= (int)d; /正浮点数的小数部分 for(
9、i=0;i<10;i+) d *= 10;strj+ = (int)d+'0'd -= (int)d; while(str-j='0');/去掉末尾的0 str+j = '0' return str; 4、文本读取 四、程序设计流程图五、程序实现主要函数功能说明(1) void Main_Task(void *Id):主任务函数;功能:创建消息结构; 清除屏幕; 调用创建按钮控件函数; 等待消息; 判断消息; 调用消息处理函数;(2) void myButtonall():创建按钮控件函数 功能:调用相关函数; SetRect(); Cre
10、ateButton(); DrawButton(b19); 创建按钮;(3)void onKey(unsigned int nkey, int fnkey):键盘消息响应函数功能:判断按键; 调用相关按键响应函数;(4)void myontouch(int xxx,int yyy):触摸屏消息响应函数功能:识别触摸区域; 调用响应触摸键响应函数;(5)void str2repol():字符表达式转逆波兰表达式函数功能:判别首位字符是否为'-'号,是则将字符串后移一位,首位置0; 判别有无非法字符.有则标志位err=1; 将输入字符串转成逆波兰表达式;(6)void calcul
11、ate():计算函数功能:判别标志位err。为1则输出“Syntax Error!”并退出,否则继续-> 判别逆波兰表达式内容; 判别小数点->对数字做相应加权 判别运算符->做相应运算 调用double型转字符串函数; 调用字符串结果显示函数。(7)char *doub2str(double d, char *str):double型转字符串函数功能:判别d是否为负数。是则字符串首位置'-';d取反,继续-> 判别d小数部分是否为零。是则整数转字符串,否则再继续>小数转字符串 将double型数字转换成字符串类型; 存储字符串并返回。(8)voi
12、d 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)转换成相应按键字符。(11) void dcr(char key):退格、清屏、读文件函数功能:响应退格键,屏幕显示去除最后一位字符,当前输入后前一次输入置'0'; 响应清屏键,清楚显示区域内容; 响应读
13、文件,调用读文件函数。(12) void readfile():读文件函数功能:读取指定目录文本文件; 显示文本内容; 计算内容(表达式)并显示。(13) void clc():清屏函数功能:清除显示区域内容。 六、完整【main.c】程序#include "./ucos-ii/includes.h" /* uC/OS interface */#include "./ucos-ii/add/osaddition.h"#include "./ucos-ii/add/ustring.h"#include "./inc/drive
14、rs.h"#include<math.h>#include "./inc/sys/lib.h"#include "./src/gui/gui.h"#include <string.h>#include <stdio.h>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
15、;#define maxs 200#define react 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 *st
16、r,int xx,int yy);void rezdisplay(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
17、, ; /Main_Test_Task堆栈#define Main_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 b
18、6;PButtonCtrl b7;PButtonCtrl b8;PButtonCtrl b9;PButtonCtrl b10;PButtonCtrl b11;PButtonCtrl b12;PButtonCtrl b13;PButtonCtrl b14;PButtonCtrl b15;PButtonCtrl b16;PButtonCtrl b17;PButtonCtrl b18;PButtonCtrl b19;/PTextCtrl b20;U32 CtrlID0=200;U32 CtrlID1=201;U32 CtrlID2=202;U32 CtrlID3=303;U32 CtrlID4=20
19、4;U32 CtrlID5=205;U32 CtrlID6=306;U32 CtrlID7=207;U32 CtrlID8=208;U32 CtrlID9=209;U32 CtrlID10=210;U32 CtrlID11=211;U32 CtrlID12=212;U32 CtrlID13=213;U32 CtrlID14=214;U32 CtrlID15=215;U32 CtrlID16=216;U32 CtrlID17=217;U32 CtrlID18=218;U32 CtrlID19=219;U32 CtrlID20=220; structRECT rect0;/定义矩形框结构struc
20、tRECT rect1;structRECT rect2;structRECT rect3;structRECT rect4;structRECT rect5;structRECT rect6;structRECT rect7;structRECT rect8;structRECT rect9;structRECT rect10;structRECT rect11;structRECT rect12;structRECT rect13;structRECT rect14;structRECT rect15;structRECT rect16;structRECT rect17;structRE
21、CT rect18;structRECT rect19;structRECT rect20; U16 Caption016; /定义按键功能 U16 Caption116;U16 Caption216;U16 Caption316;U16 Caption416;U16 Caption516;U16 Caption616;U16 Caption716;U16 Caption816;U16 Caption916;U16 Caption1016;U16 Caption1116;U16 Caption1216;U16 Caption1316;U16 Caption1416;U16 Caption151
22、6;U16 Caption1616;U16 Caption1716;U16 Caption1816;U16 Caption1916; U16 Caption_Actived16; U32 ButtonStyle=5;U32 ButtonStyle_Actived=3;U32 ButtonFontSize= 2;U32 TextStyle=4;U32 TextFontSize= 2;/*主函数*/int main(void)ARMTargetInit(); OSInit(); OSInitUart();initOSFile();#if USE_MINIGUI=0initOSMessage();i
23、nitOSList();initOSDC();initOSCtrl();LoadFont();#endifloadsystemParam();LCD_printf("Create task on uCOS-II.n");OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_StackSTACKSIZE-1, Main_Task_Prio);OSAddTask_Init(1); LCD_printf("Starting uCOS-II.n");LCD_printf("Entering gra
24、ph mode.n");LCD_ChangeMode(DspGraMode);OSStart(); return 0;/主任务/void Main_Task(void *Id) PButtonCtrl b;POSMSG pMsg=0;/创建消息结构 U32 tou; int x=0; int y=0; ClearScreen(); myButtonall(); for(;) pMsg=WaitMessage(0); /等待消息switch(pMsg->Message)case OSM_KEY:/键盘消息 onKey(pMsg->WParam,pMsg->LParam
25、); break; case OSM_TOUCH_SCREEN: x=pMsg->WParam&0xffff; y=pMsg->WParam>>16; myontouch(x,y); break; DeleteMessage(pMsg);/删除消息,释放资源 void onKey(unsigned int nkey, int fnkey) int ret; char *str, skey16;cal0='0' if(clear=1)clear=0;clc();/清屏 lcddisplay(cal+1,xz,yz); if(nkey&KEY
26、_DOWN)=0)return; switch(nkey&0xff)case 'N':str="NumLock" clc(); readfile(); break;case 'r':str="Enter" calnumber='=' redraw(calnumber); printf("表达式:%sn",cal+1); lcddisplay(cal+1,xz,yz); str1number=calnumber; str2repol();calculate(); for(ret=1
27、;ret<=number;ret+) calret='0' if(ret=number)number=1;ret=2; clear=2;break;default:skey0=nkey;skey1=0;str=skey; calnumber=nkey; redraw(calnumber); lcddisplay(cal+1,xz,yz); str1number=calnumber; number+=1; if(clear=2) clear=1; printf("%sr",cal+1); void myontouch(int xxx,int yyy) i
28、nt ret; if(clear=1)clear=0;clc();/清屏 calnumber=zb2key(xxx,yyy); redraw(calnumber); switch(calnumber) case 'd': printf("ndelren"); dcr(calnumber);break; case 'c': dcr(calnumber);break; case 'r': dcr(calnumber);break; case '=': printf("表达式:%sn",cal+1
29、); lcddisplay(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); void
30、 str2repol() /*将算术表达式转化为后缀表达式*/char strmaxs,strtemmaxs; /*存储原算术表达式*/char stackmaxs; /*作为栈使用*/char ch,*er;int i,t,top=0,j,sum,st;i=0; /*获取用户输入的表达式*/do i+; stri=cali; while(cali!='=' && i!=maxs); sum=i; /sum中记录了str表达式中的字符的个数t=1;i=1; if(str1='-') for(st=1;st<sum;st+) strtemst
31、=strst+1; str1='0' str2='-' for(st=3;st<=sum+1;st+) strst=strtemst-2; sum+;ch=stri;i+;/ch为表达式中第一个字符while(ch!='=')switch(ch)case '(': /*判定为左括号*/top+;stacktop=ch; break; case ')': /*判定为右括号*/while(stacktop!='(') repolt=stacktop;top-;t+;top-;break; case
32、 '+': /*判定为加减号*/case '-': while(top!=0&&stacktop!='(')repolt=stacktop;top-;t+;top+;stacktop=ch;break;case '*': /*判定为乘除号*/ case '/':while(stacktop='*'|stacktop='/')repolt=stacktop;top-;t+;top+;stacktop=ch;break;case ' ':break;def
33、ault:while(ch>='0'&&ch<='9'|ch='.') /*判定为数字*/repolt=ch;t+;ch=stri;i+;i-;repolt='=' t+; /*if(ch<'0'&&ch>'9'&&ch!='.') er="error!" lcddisplay(er,xz,yz+20); ch='=' */ch=stri;i+;while(top!=0)rep
34、olt=stacktop;t+;top-;repolt='='void calculate() /*计算后缀表达式的值*/double stackmaxs,d0,d1,dd; /*作为栈使用*/ unsigned int re;char ch,*restr,*rez;int t=1,top=0,counter,i; /*t为ex下标,top为stack下标*/static int zh=1; ch=repolt;t+; while(ch!='=')switch(ch) case '+': stacktop-1=stacktop-1+stackto
35、p; top-; break; case '-': stacktop-1=stacktop-1-stacktop; top-; break; case '*': stacktop-1=stacktop-1*stacktop; top-; break; case '/': if(stacktop!=0) stacktop-1=stacktop-1/stacktop; else printf("nt除零错误!n"); lcddisplay("ERROR!",xz,yz); / exit(0); /*异常退出*/
36、 top-; break; default: /*将数字字符转化为对应的数值*/ d1=0; d0=0; counter=0; while(ch>='0'&&ch<='9'|ch='.') if(ch!='.'&&zh=1) d1=10.0*d1+ch-'0' if(ch='.')zh=0; if(ch!='.'&&zh=0) d0=10.0*d0+ch-'0' counter+; ch=repolt;t+;
37、 /计算 zh=1; for(i=0;i<counter;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,yz+20); void lcddisplay(char *str,int xx,int yy) PDC pdc;/创建绘图设备上下文结构U16 chx100;pdc=CreateDC();/创建绘图
38、设备上下文f strChar2Unicode(chx, str); TextOut(pdc, xx, yy, chx, TRUE, FONTSIZE_MIDDLE);/文本模式下显示文字DestoryDC(pdc);/删除绘图设备上下文void myButtonall() PDC pdc;/定义绘图设备上下文结构 pdc=CreateDC();/创建绘图设备上下文 /定义按键功能Int2Unicode(1,Caption0); Int2Unicode(2,Caption1); Int2Unicode(3,Caption2); strChar2Unicode(Caption3,"+&q
39、uot;); Int2Unicode(4,Caption4); Int2Unicode(5,Caption5); Int2Unicode(6,Caption6); strChar2Unicode(Caption7,"-"); Int2Unicode(7,Caption8); Int2Unicode(8,Caption9); Int2Unicode(9,Caption10); strChar2Unicode(Caption11,"*"); strChar2Unicode(Caption12,"("); Int2Unicode(0,Cap
40、tion13); strChar2Unicode(Caption14,")"); strChar2Unicode(Caption15,"/"); strChar2Unicode(Caption16,"del"); strChar2Unicode(Caption17,"read"); strChar2Unicode(Caption18,"clear"); strChar2Unicode(Caption19,"enter" ); strChar2Unicode(Caption_A
41、ctived,"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,245,315,315);SetRect(&rect6, 325,245,395,315);SetRect
42、(&rect7, 405,245,475,315);SetRect(&rect8, 165,325,235,395);/第三行SetRect(&rect9, 245,325,315,395);SetRect(&rect10, 325,325,395,395);SetRect(&rect11, 405,325,475,395);SetRect(&rect12, 165,405,235,475);/第四行SetRect(&rect13, 245,405,315,475);SetRect(&rect14, 325,405,395,475
43、);SetRect(&rect15, 405,405,475,475);SetRect(&rect16, 5,165,155,315);/左1SetRect(&rect17, 5,325,155,475);/左2SetRect(&rect18, 485,165,635,315);/右1SetRect(&rect19, 485,325,635,475);/右2SetRect(&rect20, 165,5,475,155);/顶栏 /设置间距10后坐标:b0=CreateButton(CtrlID0, &rect0, ButtonFontSi
44、ze, ButtonStyle,Caption0, NULL);b1=CreateButton(CtrlID1, &rect1, ButtonFontSize, ButtonStyle, Caption1, NULL);b2=CreateButton(CtrlID2, &rect2, ButtonFontSize, ButtonStyle_Actived, Caption2, NULL);b3=CreateButton(CtrlID3, &rect3, ButtonFontSize, ButtonStyle, Caption3, NULL);b4=CreateButto
45、n(CtrlID4, &rect4, ButtonFontSize, ButtonStyle, Caption4, NULL);b5=CreateButton(CtrlID5, &rect5, ButtonFontSize, ButtonStyle, Caption5, NULL);b6=CreateButton(CtrlID6, &rect6, ButtonFontSize, ButtonStyle, Caption6, NULL);b7=CreateButton(CtrlID7, &rect7, ButtonFontSize, ButtonStyle, Ca
46、ption7, NULL);b8=CreateButton(CtrlID8, &rect8, ButtonFontSize, ButtonStyle, Caption8, NULL);b9=CreateButton(CtrlID9, &rect9, ButtonFontSize, ButtonStyle, Caption9, NULL);b10=CreateButton(CtrlID10, &rect10, ButtonFontSize, ButtonStyle, Caption10, NULL);b11=CreateButton(CtrlID11, &rect11, ButtonFontSize, ButtonStyle, Caption11, NULL);b12=CreateButton(CtrlID12, &rect12, ButtonFontSize, ButtonStyle, Caption12, NULL);b13=CreateButton(CtrlID13, &rect13, ButtonFontSize, ButtonStyle, Caption13, NULL);b14=CreateButton(CtrlID14, &rect14
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业科技成果推广应用合作协议
- 房产经纪人合作协议标准模板与要点
- 中铁六局集团呼和浩特铁路建设有限公司招聘16人考试参考题库及答案解析
- 2025榆林职业技术学院林学院招聘(11人)备考考试题库附答案解析
- 2025建阳区童游中心小学招聘临聘教师3人考试模拟试题及答案解析
- 2025年西安济仁医院招聘备考考试题库附答案解析
- 2025浙江温州市人才资源开发有限公司招聘劳务外包人员(派驻至温州新奥体育文化培训有限公司)备考考试题库附答案解析
- 2025年智慧化乡村生态康养旅游度假区市场前景预测报告
- 2025年甘肃省平凉市崇信县考核招聘农村订单定向医学生备考模拟试题及答案解析
- 2025年甘肃省兰州市城关区云麓山学校秋季学期教师招聘考试模拟试题及答案解析
- 百师联盟2025-2026学年高三上学期开学摸底联考化学试卷
- 2025贵阳市菜篮子集团有限公司招聘11人笔试备考题库及答案解析
- 2025-2026学年人教版(2024)初中数学七年级上册教学计划及进度表
- 2025-2026学年冀教版(2024)小学数学三年级上册教学计划及进度表
- 2022年妇科三基考试题库(导出版)
- 病媒生物防制技术指导手册(20130703)
- 钢筋加工机械技术状况常检查记录表
- 《全国建筑设计行业收费标准》(2022年编制)的通知
- 卵巢过度刺激综合征
- 小学三年级综合实践课ppt课件
- DIN1725-1-5 铝合金化学成分_图文
评论
0/150
提交评论