嵌入式计算器实验报告Word格式.docx
- 文档编号:15997722
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:8
- 大小:31.57KB
嵌入式计算器实验报告Word格式.docx
《嵌入式计算器实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《嵌入式计算器实验报告Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
clear'
键时,情况显示区域。
read'
键时,从指定目录文本文件中读取表达式并计算。
将表达式内容和计算结果显示在LCD上。
LCD显示界面如下:
输入显示:
结果输出:
del
1
2
3
+
clear
4
5
6
-
read
7
8
9
*
enter
(
)
/
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*/
../ucos-ii/add/"
../inc/"
#include<
>
../inc/sys/"
../src/gui/"
#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"
Enteringgraphmode...\n"
LCD_ChangeMode(DspGraMode);
OSStart();
return0;
}
{/*判定为数字*/
repol[t]=ch;
t++;
ch=str[i];
i++;
}
i--;
repol[t]='
t++;
/*if(ch<
'
&
ch>
9'
ch!
.'
er="
error!
"
lcddisplay(er,xz,yz+20);
ch='
}*/
}
ch=str[i];
}
while(top!
=0){
repol[t]=stack[top];
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];
while(ch!
){
switch(ch){
case'
+'
:
stack[top-1]=stack[top-1]+stack[top];
top--;
break;
case'
stack[top-1]=stack[top-1]-stack[top];
*'
stack[top-1]=stack[top-1]*stack[top];
/'
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-'
if(ch=='
)zh=0;
zh==0)
d0=*d0+ch-'
counter++;
}
ch=repol[t];
};
for(i=0;
i<
10;
i++)
{
d*=10;
str[j++]=(int)d+'
d-=(int)d;
while(str[--j]=='
str[++j]='
returnstr;
intreadline(char*str,intn,FILE*pfile)
{
inti;
i<
=n;
i++){
if(fread(str,1,1,pfile)!
=1)
return0;
if(*str=='
\n'
str++;
*str=0;
returni;
str++;
returni;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 计算器 实验 报告