嵌入式计算器实验报告.docx

上传人:b****3 文档编号:3086782 上传时间:2022-11-17 格式:DOCX 页数:8 大小:31.57KB
下载 相关 举报
嵌入式计算器实验报告.docx_第1页
第1页 / 共8页
嵌入式计算器实验报告.docx_第2页
第2页 / 共8页
嵌入式计算器实验报告.docx_第3页
第3页 / 共8页
嵌入式计算器实验报告.docx_第4页
第4页 / 共8页
嵌入式计算器实验报告.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

嵌入式计算器实验报告.docx

《嵌入式计算器实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式计算器实验报告.docx(8页珍藏版)》请在冰豆网上搜索。

嵌入式计算器实验报告.docx

嵌入式计算器实验报告

计算器设计实验报告

1、实验设计主要分工

04009320文斌:

算法设计,LCD显示。

04**张希:

界面(按钮控件)设计,文件内容读取。

共同调试、完善设计。

2、程序设计实现功能效果

(1)支持整数、小数基本加减乘除运算;

(2)有优先级的判别计算。

优先级由高到低一次为括号运算、乘除运算、加减运算。

(3)支持键盘输入和触摸屏输入;

(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。

程序任务开始后,等待键盘或触摸屏的输入。

输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。

每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。

当输入'del'键时,屏幕显示去掉最后一位字符。

当输入'='号后,得出计算结果,结果显示于表达式的下一行。

若是除零错误,则结果显示为“/0ERROR!

”。

若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“SyntaxError!

!

”。

若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。

当输入'clear'键时,情况显示区域。

当输入'read'键时,从指定目录文本文件中读取表达式并计算。

将表达式内容和计算结果显示在LCD上。

LCD显示界面如下:

输入显示:

结果输出:

del

1

2

3

+

clear

4

5

6

-

read

7

8

9

*

enter

0

/

3、程序算法实现

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=*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;;

d-=(int)d;

则标志位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():

清屏函数

功能:

清除显示区域内容。

六、完整【】程序

#include"../ucos-ii/"/*uC/OSinterface*/

#include"../ucos-ii/add/"

#include"../ucos-ii/add/"

#include"../inc/"

#include<>

#include"../inc/sys/"

#include"../src/gui/"

#include<>

#include<>

charTextFilename[]="/sys/ucos/fj/";.\n");

OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE-1],Main_Task_Prio);

OSAddTask_Init

(1);

LCD_printf("StartinguCOS-II...\n");

LCD_printf("Enteringgraphmode...\n");

LCD_ChangeMode(DspGraMode);

OSStart();

return0;

}

{/*判定为数字*/

repol[t]=ch;t++;

ch=str[i];i++;

}

i--;

repol[t]='=';

t++;

/*if(ch<'0'&&ch>'9'&&ch!

='.')

{

er="error!

";

lcddisplay(er,xz,yz+20);

ch='=';

}*/

}

ch=str[i];i++;

}

while(top!

=0){

repol[t]=stack[top];t++;top--;

}

repol[t]='=';

}

voidcalculate()

{/*计算后缀表达式的值*/

doublestack[maxs],d0,d1,dd;/*作为栈使用*/

unsignedintre;

charch,*restr,*rez;

intt=1,top=0,counter,i;/*t为ex下标,top为stack下标*/

staticintzh=1;

ch=repol[t];t++;

while(ch!

='='){

switch(ch){

case'+':

stack[top-1]=stack[top-1]+stack[top];

top--;

break;

case'-':

stack[top-1]=stack[top-1]-stack[top];

top--;

break;

case'*':

stack[top-1]=stack[top-1]*stack[top];

top--;

break;

case'/':

if(stack[top]!

=0)

stack[top-1]=stack[top-1]/stack[top];

else{

printf("\n\t除零错误!

\n");

lcddisplay("ERROR!

",xz,yz);

{

if(ch!

='.'&&zh==1)

{

d1=*d1+ch-'0';

}

if(ch=='.')zh=0;

if(ch!

='.'&&zh==0)

{

d0=*d0+ch-'0';

counter++;

}

ch=repol[t];t++;

};

d-=(int)d;

for(i=0;i<10;i++)

{

d*=10;

str[j++]=(int)d+'0';

d-=(int)d;

}

while(str[--j]=='0');

str[++j]='\0';

}

returnstr;

}

intreadline(char*str,intn,FILE*pfile)

{

inti;

for(i=0;i<=n;i++){

if(fread(str,1,1,pfile)!

=1)

return0;

if(*str=='\n'){

str++;

*str=0;

returni;

}

str++;

}

returni;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1