嵌入式--计算器--实验报告
嵌入式实验报告-简易计算器

一目的及要求1实验目的根据计算器的原理设计一个具有加减乘除功能的简易计算器。
2实验要求(1)数字和结果用数码管显示。
(2)数字、+-*/、=、C用4X4键盘实现。
(3)计算结果正确,有出错提示。
二实验原理框图基本工作原理:本设计利用数码管和4*4矩阵式键盘实现了简易计算器的功能。
接通电源,数码管显示全0。
计算时,通过键盘输入需要计算的数字,该数字显示在数码管上,当键入等号时,计算结果显示在数码管上。
进行第二次运算时,按C键清除键盘结果。
当计算出现错误时,LED灯亮报警。
当计算结果超出数码管显示出现溢出时,报警电路也会报警。
报警输出为--。
四系统软件设计1.数据输入模块原理:通过4*4矩阵模块输入数字,在数码管上显示出来。
2.运算模块原理:四种运算同步运行,通过按键加、减、乘、除选择输出对应的计算结果,当按键等号时,将所得结果反馈给运算模块输入端。
3.输出模块原理:通过按键等号来控制显示运算对象还是运算结果,当等号按下时,输出计算结果,否则显示当前输入的数据。
当输出结果溢出是LED亮四次,同时数码管显示都为--。
五实验调试首先按清零键清零。
然后进行调试。
输入数据2,再按乘法键,输入第二个数字6,按等号键,数码管显示12;再按除法键,输入第二个数据3,按等号键,数码管显示4;再按加法键,输入第三个数据7,依次按等号键,数码管显示11;按减法键,输入第四个数据99,依次按等号键,数码管显示-88。
若输入超出显示管的最大值或者超出数码管的位数,结果溢出,LED亮报警,同时数码管显示都为--。
如输入999999加上2 ,结果就溢出,LED灯亮四次报警。
六程序#include "LPC2468.h" /* LPC24xx definitions */ #include "type.h"#include "irq.h"#include "target.h"#include "timer.h"#include "fio.h"#include "keyboard.h"#include "SPI.h"extern BYTE seg_buf[50]; // LPC2468开发板使用此数组的0~5显示六个数码管;LPC2478板使用1~6BYTE seg_copy1[7];BYTE seg_copy2[7];unsigned long Num1 =0;/*第一个输入的数字*/unsigned long Num2 =0;/*第二个输入的数字*/unsigned long Num3 =0;/*第二个输入的数字*/extern BYTE KEY; // LPC2468开发板使用此数组的0~5显示六个数码管;LPC2478板使用1~6enum {Add =1,Dec,Mut,Div,nofuntion}funtion;/******************************************************************** *********** Main Function main()********************************************************************* *********/int main (void){unsigned char counter = 0; /*计算输入的数字的个数,超过6个则报警,运算结果超过6位数也报警*/unsigned char cal_allow = 1; /*允许输入数字标志*/unsigned char input_allow = 1;/*允许输入数字标志*/unsigned char funtion_type = 0;/*运算功能*/unsigned char Ne_num = 0;/*负数标志*/DWORD value=0,i=0;TargetResetInit();enable_timer(1);SPI_Init(8); // SPI总线速率为28.8/8 = 3.6 MHz Seg_Init(); // 数码管初始化LedsInit();for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=0;}counter = 0;cal_allow = 1;input_allow = 1;funtion_type = nofuntion;while ( 1 ){value = KEY;/*输入数字*/if(value>0 && value<11){if(counter < 6&&input_allow==1){if(counter == 0) seg_buf[1] = value-1;else{for(i=0;i<counter;i++){seg_buf[counter+1-i] = seg_buf[counter-i]; }seg_buf[1] = value-1;}counter++;}if(counter == 6){input_allow = 0;LedOn(1);LedOn(2);LedOn(3);LedOn(4);}}/*如果是“C”键,则清除显示,清除计算标志*/if(value == 11){for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=0;}counter = 0;Num1 = 0;Num2 = 0;Num3 = 0;cal_allow = 1;input_allow = 1;Ne_num = 0;/*负数标志*/funtion_type = nofuntion;}/*如果是“+”键,则显示结果*/if(value == 13 ){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Add;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/}/*如果是“-”键,则显示结果*/if(value == 14&& cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Dec;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“X”键,则显示结果*/if(value == 15 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++)seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Mut;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“/”键,则显示结果*/if(value == 16 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Div;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“=”键,则清除显示,清除计算标志*/if(value == 12){for(i=0;i<7;i++){seg_copy2[i] = seg_buf[i];/*拷贝第二次输入的数字*/}/*把输入的数字串1合成运算数字*/Num1 = seg_copy1[6]*100000+seg_copy1[5]*10000+seg_copy1[4]*1000 +seg_copy1[3]*100+seg_copy1[2]*10 +seg_copy1[1];/*把输入的数字串2合成运算数字*/Num2 = seg_copy2[6]*100000+seg_copy2[5]*10000+seg_copy2[4]*1000 +seg_copy2[3]*100+seg_copy2[2]*10 +seg_copy2[1];switch(funtion_type){case Add:{Num1 = Num1+Num2;/*计算结果存在Num1中*/break;}case Dec:{if(Num1==Num2) Num1 = 0;else if(Num1>Num2){Num3 = Num1-Num2;/*计算结果存在Num1中*/ Num1 = Num3;}else if(Num2 > Num1){Num3 = Num2-Num1;Ne_num =1;Num1 = Num3;}break;}case Mut:{Num3 = Num1*Num2;/*计算结果存在Num1中*/ Num1 = Num3;break;}case Div:{if(Num1>=Num2&&Num2!=0){Num3 = Num1/Num2;/*计算结果存在Num1中*/}Num1 = Num3;break;}default:break;}/*显示结果*/if(Num1>999999||(Ne_num ==1&&Num1>99999)||Num2 ==0) {for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=10;/*显示横杠表示计算溢出错误!*/}for(i=0;i<5;i++){LedOn(1);LedOn(2);LedOn(3);LedOn(4);delayMs(1,200);LedOff(1);LedOff(2);LedOff(3);LedOff(4);delayMs(1,200);}}else{seg_buf[1] = Num1%10;seg_buf[2] = (Num1%100)/10;seg_buf[3] = (Num1%1000)/100;seg_buf[4] = (Num1%10000)/1000;seg_buf[5] = (Num1%100000)/10000;seg_buf[6] = Num1/100000;if(Ne_num ==1){seg_buf[6] = 10;/*显示负号*/}}}delayMs(1,200);}}/******************************************************************** *********** End Of File********************************************************************* ********/七实验现象(1)运行成功以后的计算机界面如图一:图一(2)正确输入6+6=12的现象如图二和图三:图二图三(3)当进行除操作且除数为0时的现象如图四:图四七实验小结在设计计算机的过程中,我们遇到了很多问题,但是都通过查资料和请教同学得到了解决。
嵌入式系统实验报告

嵌入式系统实验报告引言嵌入式系统作为一种广泛应用于各行各业的计算机系统,其本身具有一定的难度与挑战。
本实验报告将围绕嵌入式系统的设计、开发以及应用展开讨论,旨在总结并分享在实验中所获得的经验与知识。
一. 实验背景嵌入式系统是指以特定功能为目标的计算机系统,其设计与开发过程相较于传统的计算机系统更为复杂和精细。
本次实验的主要目标是通过设计一个基于嵌入式系统的智能家居控制器,来探索嵌入式系统的应用与实践。
二. 实验内容2.1 硬件设计嵌入式系统的硬件设计是整个实验的基础,其合理性与稳定性直接影响系统的性能和可靠性。
在本次实验中,我们选择了一块主频为xx的处理器作为核心,配备了丰富的外设接口,如GPIO、串口等。
我们还为系统增加了一块液晶显示屏和一组按键,以实现简单的用户交互。
2.2 软件开发在硬件设计完成后,我们开始进行软件开发。
首先,我们需要选择一个合适的操作系统作为嵌入式系统的基础。
针对本次实验,我们选择了xx操作系统,其具备较强的实时性和稳定性,能够满足我们对系统性能的要求。
接着,我们进行了嵌入式系统的驱动程序开发。
通过编写各个外设的驱动程序,我们实现了与液晶显示屏和按键的交互,并将其与处理器进行了适当的接口配置。
另外,我们还开发了嵌入式系统的应用程序。
通过编写智能家居控制器的代码,我们成功实现了对家居设备的远程控制和监测。
用户可以通过液晶显示屏和按键进行交互,实现对家居设备的开关、调节和状态查看等操作。
三. 实验结果与分析经过实验测试,我们发现嵌入式系统在智能家居领域的应用具有较高的可行性与实用性。
通过嵌入式系统的控制,用户可以方便地实现对家居设备的远程操控,提升了家居智能化的程度。
同时,嵌入式系统的实时性和稳定性使得智能家居控制器具备了较高的安全性和可靠性。
然而,在实验过程中我们也遇到了一些挑战。
其中,系统的驱动程序开发是较为复杂的一环,需要仔细理解硬件接口和协议,并进行合理的配置。
此外,系统的稳定性和功耗管理也是需要重点关注的问题。
ram嵌入式计算器报告

[加减乘除计算器]设计说明书12205235栗晋鹏[二零一五年六月二十六日]加减乘除计算器目录1. .............................................................................................................................. 需求分析 ..................................................................2..1.1编写目的 ........................................................2. 1.2冃^景1.3要求 ..1.4工作原理2. 概要设计 ............................................................3..2.1功能模块图 ......................................................3.2.2计算器功能流程图 ............................................... 4.2.3设计效果图 ...................................................... 6.3. 详细设计 ............................................................ 6..3.1界面布置及“清零” ............................................. 7.3.2捕获键值 ........................................................ 9.3.5结果运算 ....................................................... 1.34. ............................................................................................................................ 调试总结 (18)4.1问题调试 ....................................................... 1.84.2心得体会 (20)5. ................................................................................................................................ 系统实现 (20)1.需求分析1.1编写目的1) 掌握ARM9嵌入式系统的程序设计方法;2) 理论联系实际,进一步提高软件开发技术;3) 培养自己分析问题解决问题的能力;4) 提高实践论文撰写能力。
嵌入式实训报告范文2篇

嵌入式实训报告范文嵌入式实训报告范文精选2篇(一)嵌入式实训报告一、实训目的和背景嵌入式实训的目的是通过设计和实现一个嵌入式系统,培养学生的嵌入式系统开发才能和团队协作才能。
本次实训的背景是为了满足社会对嵌入式系统开发人才的需求,进步学生的实际动手才能。
二、实训内容1. 硬件平台的选择和搭建:选择了一款ARM开发板作为硬件平台,并搭建了相应的开发环境。
2. 系统设计和分析:根据实训要求,我们团队设计了一个智能门锁系统,包括用户认证、门锁控制和远程监控功能。
3. 软件开发:使用C语言和嵌入式开发工具进展软件开发,实现了用户认证、门锁控制和远程监控等功能。
4. 硬件连接和调试:将开发板和相关传感器、执行器等硬件设备进展连接和调试,确保系统可以正常运行。
5. 功能测试和调优:对系统进展全面测试,发现并修复了一些问题,并对系统进展了性能优化。
三、实训心得和体会通过本次实训,我深入认识到嵌入式系统开发的复杂性和挑战性。
在实训过程中,我们团队遇到了许多问题,比方硬件和软件的兼容性、性能优化等方面。
但是通过团队的努力和合作,我们成功解决了这些问题,并完成了一个功能完善的嵌入式系统。
此外,我还学到了许多软件开发和硬件调试的技巧,进步了自己的实际动手才能。
在团队协作方面,我们团队成员之间互相配合,共同解决问题,形成了良好的协作机制。
总结起来,本次嵌入式实训让我受益匪浅,学会了许多实际应用的技能和知识,并进步了自身的综合才能。
四、实训成果展示在实训完毕后,我们团队成功完成了一个智能门锁系统,具备用户认证、门锁控制和远程监控等功能。
系统的稳定性和可靠性得到了验证,并且在实际使用中得到了积极的反应。
附图:〔展示系统界面、硬件设备连接示意图等〕五、实训改良意见尽管本次实训获得了良好的成果,但仍有一些方面需要改良。
首先,实训的时间安排可以更合理一些,以便更充分地利用时间进展理论操作。
其次,可以增加一些真实场景的案例分析和解决方案的设计,以提升学生的实际应用才能。
嵌入式实验报告总结

嵌入式实验报告总结本次嵌入式实验主要涉及到嵌入式系统的设计与开发,通过对实验过程的总结和分析,可以得出以下结论和认识。
在实验过程中,我们深入了解了嵌入式系统的基本原理和设计方法。
嵌入式系统是一种针对特定应用领域设计的计算机系统,具有体积小、功耗低、功能强大等特点。
在实验中,我们通过学习相关理论知识,了解了嵌入式系统的硬件结构和软件开发流程,并且亲自动手进行了系统设计和开发,加深了对嵌入式系统的理解和掌握。
实验中我们学习了嵌入式系统的硬件设计。
嵌入式系统的硬件设计是整个系统的基础,包括选择合适的处理器、外设接口设计、电源电路设计等。
在实验中,我们根据实际需求选择了合适的处理器和外设,进行了相关接口的设计和连接,确保硬件系统的稳定性和可靠性。
然后,实验中我们进行了嵌入式系统的软件开发。
嵌入式系统的软件开发是整个系统的核心,需要编写各种驱动程序和应用程序,实现系统的各种功能。
在实验中,我们学习了嵌入式系统的软件开发工具和方法,使用C语言编写了驱动程序和应用程序,并进行了调试和测试,确保软件系统的正确性和稳定性。
实验中我们还学习了嵌入式系统的调试和测试方法。
嵌入式系统的调试和测试是确保系统正常运行的重要环节,需要使用专业的工具和方法进行。
在实验中,我们学习了嵌入式系统的调试和测试工具,通过对系统的性能和功能进行评估,发现并解决了一些潜在的问题,确保系统的稳定性和可靠性。
通过本次实验,我们对嵌入式系统的设计与开发有了更深入的了解和认识。
嵌入式系统作为一种特殊的计算机系统,具有广泛的应用前景和市场需求。
通过学习和实践,我们不仅提高了自己的技术水平,也为将来的工作和研究打下了坚实的基础。
希望今后能够继续深入学习和研究嵌入式系统,为推动科技进步和社会发展做出更大的贡献。
本次嵌入式实验通过对硬件设计、软件开发、调试测试等方面的学习和实践,使我们对嵌入式系统的设计与开发有了更深入的了解和认识。
通过实验的过程,我们不仅提高了自己的技术水平,也增强了对嵌入式系统的兴趣和热情。
嵌入式--计算器--实验报告

嵌入式--计算器--实验报告本页仅作为文档页封面,使用时可以删除This document is for reference only-rar21year.March计算器设计实验报告一、实验设计主要分工04009320 文斌:算法设计,LCD显示。
04** 张希:界面(按钮控件)设计,文件内容读取。
共同调试、完善设计。
二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。
优先级由高到低一次为括号运算、乘除运算、加减运算。
(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。
程序任务开始后,等待键盘或触摸屏的输入。
输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。
每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。
当输入'del'键时,屏幕显示去掉最后一位字符。
当输入'='号后,得出计算结果,结果显示于表达式的下一行。
若是除零错误,则结果显示为“/0ERROR!”。
若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。
若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。
当输入'clear'键时,情况显示区域。
当输入'read'键时,从指定目录文本文件中读取表达式并计算。
将表达式内容和计算结果显示在LCD上。
LCD显示界面如下:三、程序算法实现1、计算算法首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中,表达为中缀表达式。
用void str2repol()函数,将输入字符串cal[number]转换成逆波兰表达式并存于全局数组char repol[maxs]中。
嵌入式运算器实验报告

实验二运算器组成实验1.算术逻辑运算实验一.实验目的1.了解简单运算器的数据传输通路。
2.验证运算功能发生器的组合功能。
3.掌握算术逻辑运算加、减、与的工作原理。
4.验证实验台运算的8位加、减、与、直通功能。
5.按给定数据,完成几种指定的算术和逻辑运算。
二.实验内容1.实验原理算术逻辑单元ALU的数据通路如图2-1所示。
其中运算器ALU181根据74LS181的功能用VHDL硬件描述语言编辑而成,构成8位字长的ALU。
参加运算的两个8位数据分别为A[7..0]和B[7..0],运算模式由S[3..0]的16种组合决定,而S[3..0]的值由4位2进制计数器LPM_COUNTER产生,计数时钟是Sclk(图2-1);此外,设M=0,选择算术运算,M=1为逻辑运算,C N为低位的进位位;F[7..0]为输出结果,C O为运算后的输出进位位。
两个8位数据由总线IN[7..0]分别通过两个电平锁存器74373锁入,ALU功能如表2-1所示。
表2-1 ALU181的运算功能注1、* 表示每一位都移至下一更高有效位, “+”是逻辑或,“加”是算术加注2、在借位减法表达上,表2-1与标准的74181的真值表略有不同。
三.实验步骤(1)设计ALU元件在Quartus II 环境下,用文本输入编辑器Text Editor输入ALU181.VHD算术逻辑单元文件,编译VHDL文件,并将ALU181.VHD文件制作成一个可调用的原理图元件。
(2)以原理图方式建立顶层文件工程选择图形方式。
根据图2-1输入实验电路图,从Quartus II的基本元件库中将各元件调入图形编辑窗口、连线,添加输入输出引脚。
将所设计的图形文件ALU.bdf保存到原先建立的文件夹中,将当前文件设置成工程文件,以后的操作就都是对当前工程文件进行的。
根据表2-1,从键盘输入数据A[7..0]和B[7..0],并设置S[3..0]、M、Cy,验证ALU运算器的算术运算和逻辑运算功能,记录实验数据。
嵌入式课程设计报告--电子计算器

重庆科技学院《嵌入式体系结构与接口技术》课程设计报告学院:_电气与信息工程学院_ 专业班级:计科2012-04学生姓名:杜江龙学号: 2012442090设计地点(单位):电气与信息工程学院I302实验室设计题目:_________________ 电子计算器_____ ___ __完成日期: 2014 年 7 月 4 日指导教师评语: ______________________ _________________ ___________________________________________________________________________________ ___________________________________________________________________________________ ___________________________________________________________________________________成绩(五级记分制):指导教师(签字):课程设计任务书设计题目:电子计算器教研室主任:指导教师:冯骊骁2014年6月30日摘要嵌入式系统是后PC时代被广泛使用的计算机平台,它通常都具有低功耗、体积小、功能强、集成度高等优点。
此设计一个具有加减乘除功能的计算器,硬件采用TQ2440板子LCD触摸屏,此计算器能够实现整数和小数的加减乘除的计算功能,并且动态显示,操作简单、实用。
通过此课程设计,对TQ2440板子操作更加熟悉,对ADS1.2的编程和调试更加灵活。
较好的熟悉并掌握了对LCD的操作显示原理和编程,对以后学习有一定的帮助。
关键词:TQ2440 ADS1.2 LCD目录课程设计任务书 (I)摘要 (I)目录 (II)1 系统需求分析 (1)1.1 设计内容与要求 (1)1.2 设计参数 (1)2 概要设计 (2)3 详细设计 (3)3.1 键盘部分和显示部分 (3)3.2 流程图 (4)3.3 功能函数 (5)4 测试 (13)5 总结致谢 (14)6 参考文献 (15)1 系统需求分析1.1 设计内容与要求设计一个具有能进行加减乘除运算,操作数可为整数、小数,可进行连续运算,比如按键输入“1+2*3”,按下“*”后应该显示1+2的运算结果,系统无明显bug的简易计算器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算器设计实验报告一、实验设计主要分工04009320文斌:算法设计,LCD显示。
04** 张希:界而(按钮控件)设计,文件内容读取。
共同调试、完善设计。
二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别讣算。
优先级由高到低一次为括号运算、乘除运算、加减运算。
(3)支持键盘输入和触摸屏输入;(4)能读取指左目录下文本内容(内容为汁算表达式)并计算得出结果,将内容和结果显示在LCD上。
程序任务开始后,等待键盘或触摸屏的输入。
输入键有0~9数字键、+-*/()运算符、del 退格键、clear清屏键、read读指定目录文本内容并计算键、enter* =键、'小数点键。
每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD 屏幕上显示相应字符。
当输入'del'键时,屏幕显示去掉最后一位字符。
当输入'二'号后,得出计算结果,结果显示于表达式的下一行。
若是除零错误,则结果显示为"/0ERR0R!”。
若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。
若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。
当输入* clear键时,情况显示区域。
当输入'read'键时,从指龙目录文本文件中读取表达式并计算。
将表达式内容和汁算结果显示在LCD上。
LCD显示界而如下:三、程序算法实现1、计算算法首先将输入的0为数字、+-*/ ()运算符的内容存储于一个全局变M cal [number]中,表达为中缀表达式。
用void str2repol ()函数,将输入字符串cal [number]转换成逆波兰表达式并存于全局数组char repol [maxs]中。
str2repol ()函数中缀表达式转成逆波兰后缀表达式算法如下:(1)首先构造一个运算符栈stack[maxs],此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个中缀表示算术表达式str[maxs](注:str [i]=cal [i])<>(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出到repol[maxs]中。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
步骤如下:若为左括号'(‘则压入运算符栈顶:若为其他运算符,则将该字符与运算符栈顶的运算符的优先关系相比较。
若该字符优先关系高于此时运算符栈顶的运算符,则将该运算符入栈。
若该字符优先关系不高于此时运算符栈顶的运算符,则将栈顶的运算符从栈中弹岀到repol[maxs],直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
若为有括号'(',则弹出运算符栈顶的运算符至到repol[maxs],直到遇到左括号惮出并作废此开括号。
(5)重复上述操作。
中缀表达式转成逆波兰后缀表达式后,calculate ()函数计算后缀表达式的值算法如下: 用局部数组stackEtop]存放运算结果,top初值为0.(1)依次读入后缀表达式repolEmaxs]的字符ch,循环判断ch。
(2)若ch为运算符,则stack [top-1]与stack [top]做相应运算。
若运算只需单操作数则stack [top]做相应运算。
运算结果存F 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输出“/0ERR0R!”。
2、按键控件3、LCD输岀显示将字符串转为Unicode编码,在指定坐标处用文本模式显示字符串。
实现函数如下:void lcddisplay (char *str, int xx, int yy)PDC pdc;;err=l :将输入字符串转成逆波兰表达式:(6) void calculate():计算函数 功能:判别标志位err 。
为1则输出"Syntax Error ! ! M 并退出,否则继续-〉 判别逆波兰表达式内容;判别小数点-〉对数字做相应加权判别运算符-〉做相应运算调用double 型转字符串函数;调用字符串结果显示函数。
(7) char *doub2str(double d, char *str): double 型转字符串函数功能:判别d 是否为负数。
是则字符串首位置'-';d 取反,继续->判别d 小数部分是否为零。
是则整数转字符串,否则再继续一〉小数转字符串 将double 型数字转换成字符串类型:存储字符串并返回。
(8) void lcddi splay (char *str, int xx, in t yy):字符串显示函数功能:将字符串str[]显示在LCD 的指定坐标(xx, yy)o (int)d; 则标志位d(9)void redraw (char key):重画按钮函数功能:响应相应函数:重画相应按钮;延时100ms后恢复原按钮。
(10)char zb2key (int x, int y):坐标转按键函数功能:将触摸点坐标(X, y)转换成相应按键字符。
(11)void dcr (char key):退格、清屏、读文件函数功能:响应退格键,屏幕显示去除最后一位字符,当前输入后前一次输入置'\0':响应清屏键,清楚显示区域内容:响应读文件,调用读文件函数。
(12)void readfileO :读文件函数功能:读取指定目录文本文件:显示文本内容;计算内容(表达式)并显示。
(13)void clc 0 :清屏函数功能:清除显示区域内容。
六、完整【】程序itinclude "・・ /ucos-ii/" /* uC/OS interface */^include "・• /ucos~ii/add/,z^include "・・ /ucos"ii/add/,z^include "・・/inc/"#include<>#include "・・/inc/sys/"#include "・・/src/gui/"^include <>^include <>char TextFilename[]=7sys/ucos/f j/"; ・ \n〃);OSTaskCreate (Main.Task, (void *)0, (OS.STK *)&血in_Stack[STACKSIZET],Main_Task_Prio);OSAddTask_Init (1);LCD^printf(^Starting uCOS一II.・・\n");LCD_printf ('"Entering graph mode・・・ \n");LCD_ChangeMode (DspGraNIode);OSStart 0;return 0;}{ /*判定为数字*/repol[t]=ch:t++;ch二str[i];i++;}i—;repo 1 [t]二'二’;t++;/*if(ch<* O' &&ch>' 9' &&ch!='.'){er= error!;lcddisplay(er, xz, yz+20); ch=,二';}ch二str[i];i++;}while(top!=0) {repolLt]=stack[top];t++;top—;}repo 1 [t]二'二’;}void calculate 0{ /*计算后缀表达式的值*/double stack[maxs], dO, dl, dd; /*作为栈使用*/ unsigned int re;char ch, *restr, *rez;int t=l, top=0, counter, i ; /*t 为ex下标,top为stackT标*/ static int zh=l:ch=repol[t];t++;while(ch!=,二'){switch(ch){case ' +':stackCtop-l]=stack [top-1] +stack[top];top-一;break;,>case 一 :stack[top-1]=stack[top-1]-stack[top];top—;break;case ' *':stack Ltop-l]=stack [top-1] * stack [top];top—;break;case ' I' :if (stack[top] !=0)stackEtop~l]=stack[top-l]/stack[top:;else {printf C\n\t除零错误! \n"); lcddisplay("ERROR!", xz, yz);{if(ch!='・'&&zh=l){dl二*dl+ch」O';}if (ch==,・’)zh=O;if(ch!='・'&&zh=O){dO=*dO+ch-' O'; counter++;}ch=repolZt];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';}return str;}int readline(char* str, int n, FILE *pfile){int i;for (i=0; i<=n; i++){if (fread(str, 1, 1, pfile) !=1) return 0;if(*str==*\n ){str++;*str=0; return i;}str++;return i; }。