嵌入式实验之多功能计算器的实现
嵌入式_实验五_简单计算器的设计
嵌入式操作系统原理与应用实验报告实验题目:实验五、简单计算器设计院系:计算机科学与技术学院专业年级:学生姓名:学号2014 年10 月7日一、实验目标和重点使用MFC编写一个如下图所示的计算器程序可以直接从键盘输入两个数,然后按下运算按钮可以计算,可以计算三角函数二、实验内容思路:设计三个edit控件,作为被运算数和结果显示,添加加减乘除按钮,按下后进行运算;添加Check 按钮检测状态,因为三角函数都是单目运算符,故只有一个数,选择其中一个edit控件显示。
三、实验步骤及结果1)首先打开Microsoft Visual Studio,选择新建项目,基于对话框2)创建一个对话框程序,在Dialog中完成以下设计图,添加“+”、“‐”,“*”,“/”按钮button 控件并在属性里修改各个控件的caption属性、控件ID。
例如:“+”修改为ID_ADD,完成修改后,如图:3)对三个edit控件进行添加变量m_num1、m_num2、m_result,前面两个为操作数,后面一个为运算结果。
5)点击“闪电”,选择添加事件如下图6)在操作符按下的click事件下添加代码:操作符“+”添加代码:void CsimplecaculatorDlg::OnBnClickedAdd() {UpdateData();m_result=m_num1+m_num2;UpdateData(FALSE);}操作符“-”添加代码:void CsimplecaculatorDlg::OnBnClickedMinus() {UpdateData();m_result=m_num1*m_num2;UpdateData(FALSE);}操作符“-”添加代码:void CsimplecaculatorDlg::OnBnClickedPlus(){UpdateData();m_result=m_num1-m_num2;UpdateData(FALSE);}操作符“/”添加代码:void CsimplecaculatorDlg::OnBnClickedDiv(){UpdateData();if(m_num2)m_result=m_num1/m_num2;elseAfxMessageBox(_T("被除数不能为!"),0,0);UpdateData(FALSE);}7)以下为三角函数的添加代码:同时要在文件的开始添加pi的值,#define pi 3.1415926操作符“sin”按下的click事件下添加以下代码UpdateData();temp=m_num1;if(m_num1<180)m_result=sin(m_num1*pi/180.0); //Pi为圆周率,定义预处理命令else{while (temp>=180){temp-=180;}m_result=sin(temp*pi/180.0);UpdateData(FALSE);其他运算符(cos tan cot )同理添加如图:8)以下为选择简单计算器和三角函数的按钮的控件添加代码:9)在操作符“清除”按下的click事件下添加以下代码:10)完成以上操作后,为了实现三角函数的函数曲线,添加以下代码:CDC *pDC=GetDC();//CClientDC * pClientDC=myWindow.GetClientRect(&rc);//得到绘图环境CPen pen,*poldpen; //创建画笔,和用来保存旧画笔pen.CreatePen(PS_SOLID,2,RGB(m_red,0,0)); //创建一个新画笔的,特性,实线,线宽个像素poldpen=pDC->SelectObject(&pen); //选择新画笔,保存旧画笔//colorBrush.CreateSolidBrush(clRGB);//CDC*pDC=GetDC();pDC->MoveTo(110,180);pDC->LineTo(260,180);pDC->MoveTo(120,110);pDC->LineTo(120,250);pDC->MoveTo(120,200);double i,x,y;for (i=0;i<=200;i++){x=120+i;y=180-20*sin(i/20);pDC->LineTo(x,y);}pDC->SelectObject(&poldpen);// 恢复原画笔状态ReleaseDC(pDC); //释放画笔CBrush colorBrush; 11)实验结果截图:四、心得体会通过此次实验,完成了简单计算器的设计。
嵌入式实验报告-简易计算器
一目的及要求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.计算器的发展和分类 (2)计算器的发展 (2)计算器的分类 (3)2.设计方法 (4)3.硬件系统设计 (4)单片机 (4)4*4矩阵式键盘 (5)7段LED数码管 (6)程序下载接口 (6)数码管驱动芯片 (6)单片机时钟电路 (6)单片机复位电路 (7)4.软件设计 (10)汇编语言和C语言的特点及选择 (10)键扫程序设计 (11)算术运算程序设计 (11)显示原理 (12)5.硬件调试 (12)常见故障 (12)6.软件调试 (13)总结 (13)参考文献 (15)附录 (16)引言当今社会,计算器作为一种快速、通用的计算工具方便了用户的使用。
单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。
在工业生产中,单片微型计算机是微型计算机的一个重要分支,也是颇具生命里的机种。
单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心。
单片微型计算机简称单片机,特别使用于控制领域,故又称为微控制器。
本文是基于单片机控制的多功能计算器的设计。
设计以单片机为控制核心,运用C语言编写程序,采用矩阵键盘式输入数据、在液晶模块LCD1602上显示计算过程以及结果,该计算器能进行加、减、乘、除运算,此外该计算器还具有计时和倒计时的功能。
这样一个简易的计算器实现了多功能,相比当前一些计算器来说,在功能上增加了却没有增加产品的成本,采用的技术也更趋向于国产化。
1.计算器的发展和分类计算器的发展计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。
低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。
高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。
键盘是计算器的输入部件,一般采用接触式或传感式。
为减小计算器的尺寸,一键常常有多种功能。
嵌入式系统之基于QT的简单计算器
嵌入式系统之基于QT的简单计算器QT是一种跨平台的应用程序开发框架,它提供了一种编写图形用户界面(GUI)程序的简便方法。
在嵌入式系统中,使用QT可以快速开发出各种功能强大、界面友好的应用程序。
对于一个简单计算器来说,主要包括用户界面设计和计算逻辑两部分。
首先,我们需要设计一个界面来展示计算器的按钮和显示结果的区域。
在QT中,可以使用QGridLayout布局管理器来创建按钮布局,同时将其连接到对应的信号槽函数上,以实现按钮的点击响应。
```cpp//main.qmlimport QtQuick 2.12import QtQuick.Window 2.12import QtQuick.Controls 2.12Windowvisible: truewidth: 400height: 600title: "Simple Calculator"RowLayoutspacing: 10GridLayoutid: buttonGridrows: 4columns: 4anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Buttontext: "7"onClicked: calculator.append("7")}Buttontext: "8"onClicked: calculator.append("8")}// ... more buttons ...Buttontext: "="onClicked: calculator.calculate}// ... more buttons ...}TextFieldid: resultFieldwidth: 200height: 50placeholderText: "0"readOnly: true}}```在这个示例中,我们使用了QT的QML语言来创建用户界面。
嵌入式QT实验报告
嵌入式QT实验报告一、实验目的本次实验的目的是设计并实现一个简单的计算器应用程序,基于嵌入式QT进行开发。
通过这个实验,可以熟悉QT的控件使用、界面设计和信号与槽的连接等知识点。
二、实验原理计算器应用程序的主要功能是实现基本的数学运算,包括加、减、乘、除。
用户通过界面上的按钮输入数字和运算符,程序根据用户的输入进行相应的计算,并将结果显示在界面上。
三、系统设计1.界面设计计算器的界面主要分为两个部分,一个是数字输入框,用于用户输入数字;另一个是运算符按钮区域,用于用户选择运算符。
2.数字和运算符输入用户通过按钮选择数字和运算符,并将其显示在数字输入框中,需要使用QT的信号与槽机制来连接按钮和数字输入框。
3.计算功能根据用户选择的运算符,进行相应的数学运算,并将结果显示在数字输入框中。
需要使用switch语句来判断用户选择的运算符,并进行相应的计算。
四、实验步骤1.创建QT应用程序项目在QT Creator中创建一个新的QT Widget应用程序项目,命名为"Calculator",选择嵌入式QT版本。
2.设计界面使用QT Designer设计计算器的界面,添加一个数字输入框和若干个按钮,按钮包括数字按钮和运算符按钮。
需要注意布局和按钮的大小等细节。
3.连接信号与槽4.实现计算功能在mainwindow.cpp文件中实现计算器功能的代码。
首先声明一个私有变量operand用于保存上一次的操作数;然后根据用户选择的按钮,进行相应的计算。
五、实验结果(插入计算器界面截图)六、实验总结通过本次实验,我成功地设计并实现了一个简单的计算器应用程序。
在实验过程中,我学会了使用QT Designer设计界面,了解了QT的信号与槽机制,能够连接按钮和输入框等控件;同时,也巩固了基本的C++编程知识,熟悉了switch语句的使用。
在实验过程中,我遇到了一些问题,比如界面的布局和按钮的大小等细节问题,通过查阅文档和调试,最终解决了这些问题。
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) 提高实践论文撰写能力。
多功能的计算方法
多功能的计算方法
多功能计算器是一种可以进行多种复杂计算的电子设备。
它的按键布局和功能可能会因品牌和型号的不同而有所差异,但一般来说,多功能计算器可以执行以下操作:
1. 基本算术运算:如加、减、乘、除等。
2. 代数运算:如解方程、求导数等。
3. 三角函数运算:如正弦、余弦、正切等。
4. 指数和对数运算:如自然对数、常用对数等。
5. 统计运算:如求平均值、求和、求方差等。
6. 概率运算:如组合数、概率计算等。
7. 绘制函数图像:有些多功能计算器还可以绘制函数图像,方便用户直观地了解函数的性质和变化规律。
使用多功能计算器可以大大提高计算效率和精度,特别是对于需要进行复杂计算的领域,如科学、工程、金融等。
嵌入式计算器的程序设计
嵌入式计算器的程序设计
嵌入式计算器是一种常见且常用的电子计算机设备,其内部集成了数字电路和微处理器芯片,可以完成加减乘除、取模、开根号等基本运算,也可以进行科学计算、统计计算、矩阵计算等高级运算。
嵌入式计算器具有体积小、价格便宜、使用方便等特点,广泛应用于各种电子产品中,例如电子手表、计算器、智能手机等。
在嵌入式计算器的程序设计中,需要熟练掌握计算机编程语言,例如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]中。
[arm]嵌入式系统计算器设计
嵌入式系统设计报告题目:触摸式计算器设计姓名:姜涛学号:x05610117班级:05电子(11)班指导老师:沈军民一、课程任务本电子系统的功能是借助ARM 7教学实验箱,使用S3C44B0三星处理器能及触摸屏及LCD显示屏等硬件编写程序来实现计算器的设计。
实验要求:1、要用触摸屏来实现2、能够具有触摸按键选择功能,并且具有显示数字功能3、可以实现四则运算功能二、软件实现流程图三、主程序:#include "44b.h"#include"uhal.h"#include "option.h"#include"def.h"#include "tchScr.h"#include"myuart.h"#include "tchScr.h"#include "maro.h"#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihostingextern U32 LCDBuffer[240][320];U32 jcolor;int number =0;//记录数字int number1=0;char signal;int main(void){int i,j,k;int m,n;ARMTargetInit(); //开发版初始化LCD_Init(); //LCD初始化/* for (i=0;i<9;i++){ switch (i){ case 0: jcolor=0x00000000; //RGB均为0 黑色break;case 1: jcolor=0x000000e0; //R 红色break;case 2: jcolor=0x0000d0e0; //R and G 橙色break;case 3: jcolor=0x0000e0e0; //R and G 黄break;case 4: jcolor=0x0000e000; //G 绿色break;case 5: jcolor=0x00e0e000; //G B 青色break;case 6: jcolor=0x00e00000; //B 蓝色break;case 7: jcolor=0x00e000e0; //R and B 紫色break;case 8: jcolor=0x00e0e0e0; //RGB 白色break;}*/jsqInit();getNum(235,7,0);LCD_Refresh() ;while(1){TchScr_Test();Delay(1000);}return 0;}getNum(int x,int y,int num){int i,j;for(i=x;i<=x+8;i++)for(j=y;j<=y+14;j++){LCDBuffer[j][i]=0x00000000;switch(num){case 0:if(i==x||i==x+8) LCDBuffer[j][i]=0x0000e000;if(j==y||j==y+14) LCDBuffer[j][i]=0x0000e000;break;case 1:if(i==x+8) LCDBuffer[j][i]=0x0000e000;break;case 2:if(j==y||j==y+7||j==y+14) LCDBuffer[j][i]=0x0000e000;if((i==x&&j>=y+7)||(i==x+8&&j<=y+7))LCDBuffer[j][i]=0x0000e000;break;case 3:if(j==y||j==y+7||j==y+14) LCDBuffer[j][i]=0x0000e000;if(i==x+8) LCDBuffer[j][i]=0x0000e000;break;case 4: if(j==y+7) LCDBuffer[j][i]=0x0000e000;if(i==x&&j<=y+7) LCDBuffer[j][i]=0x0000e000;if(i==x+8) LCDBuffer[j][i]=0x0000e000;break;case 5:if(j==y||j==y+7||j==y+14) LCDBuffer[j][i]=0x0000e000;if((i==x&&j<=y+7)||(i==x+8&&j>=y+7))LCDBuffer[j][i]=0x0000e000;break;case 6:if(j==y||j==y+7||j==y+14)LCDBuffer[j][i]=0x0000e000;if(i==x||(i==x+8&&j>=y+7))LCDBuffer[j][i]=0x0000e000;break;case 7:if(i==x+8) LCDBuffer[j][i]=0x0000e000;if(j==y) LCDBuffer[j][i]=0x0000e000;break;case 8:if(j==y||j==y+7||j==y+14) LCDBuffer[j][i]=0x0000e000;if(i==x||i==x+8) LCDBuffer[j][i]=0x0000e000;break;case 9:if(j==y||j==y+7||j==y+14) LCDBuffer[j][i]=0x0000e000;if((i==x&&j<=y+7)||i==x+8)LCDBuffer[j][i]=0x0000e000;break;}}}getOp(){int i,j;for(i=235;i<=243;i++)for(j=7;j<21;j++){switch(signal){case '+':if(j==14||i==239) LCDBuffer[j][i]=0x00e00000;break;case '-':if(j==14) LCDBuffer[j][i]=0x00e00000;break;case'*':if(j+i==245||j-i==221)LCDBuffer[j][i]=0x00e00000;break;case '/':if(j-i==221)LCDBuffer[j][i]=0x00e00000;break;}}}jsqInit(){int k,i,j;for (k=0;k<260;k++)for (j=i*32;j<i*32+32;j++){LCDBuffer[2][k+10]= 0x00e00000;LCDBuffer[42][k+10]= 0x00e00000;LCDBuffer[215][105]= 0x00e00000;//'.'LCDBuffer[107][235]= 0x00e00000;//'/'LCDBuffer[117][235]= 0x00e00000;//'/'}for (k=0;k<10;k++)for (j=i*32;j<i*32+32;j++){LCDBuffer[57][k+100]= 0x00e00000;//‘2’的位置 LCDBuffer[67][k+100]= 0x00e00000;LCDBuffer[77][k+100]= 0x00e00000;LCDBuffer[57][k+165]= 0x00e00000;//‘3’的位置 LCDBuffer[67][k+165]= 0x00e00000;LCDBuffer[77][k+165]= 0x00e00000;LCDBuffer[112][k+35]= 0x00e00000;//‘4’的位置LCDBuffer[102][k+100]= 0x00e00000;//‘5’的位置 LCDBuffer[112][k+100]= 0x00e00000;LCDBuffer[122][k+100]= 0x00e00000;LCDBuffer[102][k+165]= 0x00e00000;//‘6’的位置 LCDBuffer[112][k+165]= 0x00e00000;LCDBuffer[122][k+165]= 0x00e00000;LCDBuffer[147][k+35]= 0x00e00000;//‘7’的位置LCDBuffer[147][k+100]= 0x00e00000;//‘8’的位置 LCDBuffer[157][k+100]= 0x00e00000;LCDBuffer[167][k+100]= 0x00e00000;LCDBuffer[147][k+165]= 0x00e00000;//‘9’的位置 LCDBuffer[157][k+165]= 0x00e00000;LCDBuffer[167][k+165]= 0x00e00000;LCDBuffer[192][k+35]= 0x00e00000;//‘0’的位置 LCDBuffer[212][k+35]= 0x00e00000;LCDBuffer[157][k+230]= 0x00e00000;//‘-’的位置LCDBuffer[202][k+165]= 0x00e00000;//‘+’的位置LCDBuffer[200][k+230]= 0x00e00000;//‘=’的位置 LCDBuffer[204][k+230]= 0x00e00000;LCDBuffer[112][k+230]= 0x00e00000;//'/'}for (k=0;k<60;k++)for (j=i*32;j<i*32+32;j++){LCDBuffer[47][k+10]= 0x00e00000;LCDBuffer[87][k+10]= 0x00e00000;LCDBuffer[47][k+75]= 0x00e00000;LCDBuffer[87][k+75]= 0x00e00000;LCDBuffer[47][k+140]= 0x00e00000;LCDBuffer[87][k+140]= 0x00e00000;LCDBuffer[47][k+205]= 0x00e00000;LCDBuffer[87][k+205]= 0x00e00000;LCDBuffer[92][k+10]= 0x00e00000; LCDBuffer[132][k+10]= 0x00e00000;LCDBuffer[92][k+75]= 0x00e00000; LCDBuffer[132][k+75]= 0x00e00000;LCDBuffer[92][k+140]= 0x00e00000; LCDBuffer[132][k+140]= 0x00e00000;LCDBuffer[92][k+205]= 0x00e00000; LCDBuffer[132][k+205]= 0x00e00000;LCDBuffer[137][k+10]= 0x00e00000; LCDBuffer[177][k+10]= 0x00e00000;LCDBuffer[137][k+75]= 0x00e00000; LCDBuffer[177][k+75]= 0x00e00000;LCDBuffer[137][k+140]= 0x00e00000; LCDBuffer[177][k+140]= 0x00e00000;LCDBuffer[137][k+205]= 0x00e00000; LCDBuffer[177][k+205]= 0x00e00000;LCDBuffer[182][k+10]= 0x00e00000; LCDBuffer[222][k+10]= 0x00e00000;LCDBuffer[182][k+75]= 0x00e00000; LCDBuffer[222][k+75]= 0x00e00000;LCDBuffer[182][k+140]= 0x00e00000; LCDBuffer[222][k+140]= 0x00e00000;LCDBuffer[182][k+205]= 0x00e00000; LCDBuffer[222][k+205]= 0x00e00000;}jcolor=0x00e00000;for (i=0;i<40;i++){if (i==80||i==160)jcolor<<=8;for (j=288;j<320;j++){LCDBuffer[i+2][10]=0x00e00000; LCDBuffer[i+2][270]=0x00e00000;LCDBuffer[i+47][10]=0x00e00000;LCDBuffer[i+47][70]=0x00e00000; LCDBuffer[i+47][75]=0x00e00000; LCDBuffer[i+47][135]=0x00e00000; LCDBuffer[i+47][140]=0x00e00000; LCDBuffer[i+47][200]=0x00e00000; LCDBuffer[i+47][205]=0x00e00000; LCDBuffer[i+47][265]=0x00e00000;LCDBuffer[i+92][10]=0x00e00000; LCDBuffer[i+92][70]=0x00e00000; LCDBuffer[i+92][75]=0x00e00000; LCDBuffer[i+92][135]=0x00e00000; LCDBuffer[i+92][140]=0x00e00000; LCDBuffer[i+92][200]=0x00e00000; LCDBuffer[i+92][205]=0x00e00000; LCDBuffer[i+92][265]=0x00e00000;LCDBuffer[i+137][10]=0x00e00000;LCDBuffer[i+137][70]=0x00e00000;LCDBuffer[i+137][75]=0x00e00000;LCDBuffer[i+137][135]=0x00e00000;LCDBuffer[i+137][140]=0x00e00000;LCDBuffer[i+137][200]=0x00e00000;LCDBuffer[i+137][205]=0x00e00000;LCDBuffer[i+137][265]=0x00e00000;LCDBuffer[i+182][10]=0x00e00000;LCDBuffer[i+182][70]=0x00e00000;LCDBuffer[i+182][75]=0x00e00000;LCDBuffer[i+182][135]=0x00e00000;LCDBuffer[i+182][140]=0x00e00000;LCDBuffer[i+182][200]=0x00e00000;LCDBuffer[i+182][205]=0x00e00000;LCDBuffer[i+182][265]=0x00e00000;}}jcolor=0x00e00000;for (i=0;i<10;i++){if (i==80||i==160)jcolor<<=8;for (j=288;j<320;j++){LCDBuffer[i+67][100]=0x00e00000;// ‘2’ LCDBuffer[i+57][110]=0x00e00000;LCDBuffer[i+102][35]=0x00e00000;// ‘4’LCDBuffer[i+102][100]=0x00e00000;// ‘5’LCDBuffer[i+112][110]=0x00e00000;LCDBuffer[i+112][175]=0x00e00000;// ‘6’LCDBuffer[i+147][165]=0x00e00000; // ‘9’LCDBuffer[i+197][170]=0x00e00000; // ‘+’}}jcolor=0x00e00000;for (i=0;i<20;i++){if (i==80||i==160)jcolor<<=8;for (j=288;j<320;j++){LCDBuffer[i+62][40]=0x00e00000;//‘1’LCDBuffer[i+57][175]=0x00e00000;//‘3’LCDBuffer[i+102][40]=0x00e00000;//‘4’LCDBuffer[i+102][165]=0x00e00000;//‘6’LCDBuffer[i+147][45]=0x00e00000;//‘7’LCDBuffer[i+147][100]=0x00e00000;//‘8’ LCDBuffer[i+147][110]=0x00e00000;LCDBuffer[i+147][175]=0x00e00000;//‘9’LCDBuffer[i+192][35]=0x00e00000;//‘0’ LCDBuffer[i+192][45]=0x00e00000;}}//return;// }}tchNum(int x,int y){int i;int x1,y1;x1=(x-5)/65;y1=(y-42)/45;if(number<99999999||(x1==1&&y1==3)||(x1==2&&y1==3)||x1==3){switch(x1){case 0:switch(y1){case 0:number=number*10+1;return;case 1:number=number*10+4;return;case 2:number=number*10+7;return;case 3:number=number*10;return;}case 1:switch(y1){case 0:number=number*10+2;return;case 1:number=number*10+5;return;case 2:number=number*10+8;return;case 3:signal='*';clear();getOp();number1=number;number=0;return;}case 2:switch(y1){case 0:number=number*10+3;return;case 1:number=number*10+6;return;case 2:number=number*10+9;return;case 3:signal='+';clear();getOp();number1=number;number=0;return;}case 3:switch(y1){case 0:number=0;number1=0;clear();getNum(235,7,0);return;case 1:signal='/';clear();getOp();number1=number;number=0;return;case 2:signal='-';clear();getOp(); number1=number;number=0;return;case 3:operation();return;}}}}showNum(){//tchNum();int ws=1;int n;n=number;Uart_Printf("$$$$$$$$number=%d",n);Uart_Printf("$$$$$$$$number=%d",number);if(number<0) {isFu();n=-n;}while(n!=0||n/10!=0){switch(ws){case 1:getNum(235,7,n%10);break;case 2:getNum(220,7,n%10);break;case 3:getNum(205,7,n%10);break;case 4:getNum(190,7,n%10);break;case 5:getNum(175,7,n%10);break;case 6:getNum(160,7,n%10);break;case 7:getNum(145,7,n%10);break;case 8:getNum(130,7,n%10);break;case 9:getNum(115,7,n%10);break;}ws++;n=n/10;}}clear(){int i,j;for(i=115;i<=235;i=i+15)getNum(i,7,10);for(i=100;i<=108;i++)for(j=7;j<21;j++){if(j==14) LCDBuffer[j][i]=0x00e0e0e0;break;}}operation(){switch(signal){case '+': number = number+number1;clear();break;case '-':number = number1-number;clear();break;case '*':number = number*number1;clear();break;case '/':number = number1/number;clear();break;}}isFu(){int i,j;for(i=100;i<=108;i++)for(j=7;j<21;j++){if(j==14) LCDBuffer[j][i]=0x00e0e0e0;break;}}四、实验结果显示五、实验心得1、在做计算器时,第一步关键是要将触摸屏校准,使用触摸屏实验程序,通过超级终端将坐标打印出来,从而去调整TchScr_Xmax, TchScr_Xmin, TchScr_Ymax, TchScr_Ymin四个坐标值,使得触摸屏与LCD显示屏能够正确的对应2、在坐标对应的过程中,首先要确定实际触摸屏的X、Y坐标方向,以及程序中的X、Y坐标方向是不是已经和实际坐标对应起来,否则容易出现后面按键时出现按键错位。
嵌入式运算器实验报告
实验二运算器组成实验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运算器的算术运算和逻辑运算功能,记录实验数据。
嵌入式课程设计实验报告-计算器
华南师范大学嵌入式综设实验报告选题:基于ARM和UCOS-II系统的小型计算器指导老师:王剑x组员(学号):(20122302xxx)(20122302xxx)一、实现功能实现五位整数的加减乘除带括号的运算,由于实验箱的键盘数量有限,于是我们将键盘设置为虚拟的两层结构,其使用方法如下:(1(2二、系统流程图计算原理计算原理定义一个操作数栈sym,一个操作符栈um 。
思想是:置操作数栈为空,操作符栈压入元素"#"(它具有最高优先级),依次读入表达式中的每个字符CH,如果CH是操作数,则CH压入操作数栈,如果CH是操作符,那么将CH和操作符栈顶元素进行优先级比较(如‘×’优先级高于‘+’)。
如果优先级大于当前栈顶元素,那么将其压栈,如果其优先级小于当前栈顶元素,那么执行op=sym.pop();(取当前栈顶操作符),a=um.pop()(取当前栈顶操作数存入临时变量a);b=sym.pop()(取当前栈顶操作数存入临时变量b);c=计算(a op b); sym.push(c);如果优先级相等,则当前操作符出栈。
重复上述操作直到表达式处理完毕。
最后操作数栈剩余的操作数就是计算的最终结果。
三、程序#include "Includes.h" /* uC/OS interface */#include "option.h"#include "2410lib.h"#include "uhal.h"/* 任务栈*/OS_STK StackLED[STACKSIZE]= {0, }; // 任务LED任务栈OS_STK StackSEG[STACKSIZE]= {0, }; // 任务SEG任务栈/* 任务ID */char IdLED = '1'; // 任务LED IDchar IdSEG = '2'; // 任务SEG ID/* 任务处理函数*/void TaskLED(void *Id); // 任务LED任务处理函数void TaskSEG(void *Id); // 任务SEG任务处理函数void TmrFunc1(INT8U arg);/* 定时器1*/OS_TMR *Tmr1;char ch,ch2;char print_1[1];char print_2 [6]; /*用于串口输出*/int Page=0; /* 键盘的页面标志*//*------------------------------------栈定义---------------------------------*/ #ifndef STACK_SIZE#define STACK_SIZE 64#endifint Num[STACK_SIZE];/*数字栈*/int NumTop=0;int Sym[STACK_SIZE];/*字符栈,用来储存操作符*/int SymTop=0;void Push_(int * stack,int * top,int val);int Pop_(int * stack,int * top);/*------------------------------------声明-------------------------------------*/#define DELAYTIME 1extern unsigned char seg7table[16];int Calculate(int right,int left,int symbol);#define DELAYTIME 1void product(void);int a,b,c;char number[255];char sign;int now=0;int num=0;int SymTmp;/*对操作符处理时的中间变量*/int ResTmp;/*得数的中间变量*/int Flag = 0;/*表示数字不为空的标识符*/int count=0;/** 跑马灯闪烁函数,调用一次,四个跑马灯由亮变灭或者由灭变亮*/void User_LED_Blink(void){static int led_status = 0;led_status += 1;if(led_status % 2 == 0)Led_Display(0x0f);elseLed_Display(0x00);}/** 数码管显示实验,由0到F依次显示*/void User_SEG_Blink(void){static unsigned char seg_value[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xc0,0xdf};static int seg_status = 0;count++;// seg_status += 1;// if(seg_status > 15)// seg_status = 0;}/** 定时器Tmr1、Tmr2、Tmr3处理函数* 1、根据arg参数确定定时器* 2、三个定时器同时只打开一个,即Tmr1、Tmr2、Tmr3,三个定时器总和闪烁一次跑马灯*/void TmrFunc1(INT8U arg){ch=Key_GetKey();ch2=ch;switch(ch){case 'C':ch2='(';break;case 'D':ch2=')';break;case 'F':ch2='=';break;case 'A':ch2='.';break;case 'E':Page=1;Led_Display(0xff);break;case 'B':Page=0;Led_Display(0x00);break;default:break;}if(Page==1)switch(ch){case '1':ch2='+';break;case '4':ch2='-';break;case '7':ch2='*';break;case '0':ch2='/';break;case '2':ch2='%';break;default:ch='\0';break;}if(ch2=='E'||ch2=='B'||ch2=='.') print_1[0]='\0';elseprint_1[0]=ch2;uHALr_printf(print_1); product();}/** 任务LED任务处理函数* 1、OSStart调用之前创建的最高优先级任务,在该函数重启动时钟节拍定时器* 2、创建三个定时器,定时时间都为2秒钟,它们使用同样的TmrFunc1定时器服务函数,但是使用不同的参数,定时器1的初始状态为开,其余为关*/void TaskLED(void *Id){char key_press;char led_status = 0x0;INT8U err;/* 启动时钟节拍定时器,开始多任务调度*/ARMTargetStart();/* 初始化定时器*/OSTmrInit();/* 创建定时器,定时时间为2秒钟,它使用TmrFunc1定时器服务函数,定时器1的初始状态为开*/err = OSCreateTimer( &Tmr1, TmrFunc1, 1, 10, OS_TMR_ENABLE);OSEnableTimer(Tmr1);uHALr_printf("\n欢迎使用计算器\n");/* 该任务到此完成,不断延时*/for (;;){OSTimeDly(10);}}/** 任务SEG任务处理函数* 1、每隔100 ticks即1000ms,闪烁数码管*/void TaskSEG(void *Id){//uHALr_printf("Task2() called\n");for (;;){OSSchedLock();OSSchedUnlock();OSTimeDly(1);}}/** Main函数.* 1、初始化目标系统,初始化硬件定时器等,与操作系统无关* 2、调用OSInit初始化uC/OS-II软件数据结构等,必须在打开时钟节拍中断之前调用* 3、创建两个任务,TaskLED和TaskSEG,TaskLED的优先级为5,TaskSEG的优先级为13,TaskLED的优先级高于TaskSEG* 4、调用OSStart启动uC/OS-II*/void Main(void){/** 目标系统初始化*/ARMTargetInit();/** uC/OS-II软件初始化*/OSInit();/** 创建两个任务,TaskLED和TaskSEG,TaskLED的优先级为5,TaskSEG的优先级为13,TaskLED 的优先级高于TaskSEG*/OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLED[STACKSIZE - 1], 5);OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEG[STACKSIZE - 1], 13);/** 启动多任务调度*/OSStart();/** 正常情况下,永远不会执行到这里*/return;}void product(void)if(ch2>='0'&&ch2<='9'){num = (num*10)+(ch2-'0');Flag = 1;}else if(ch2=='('||ch2==')'||ch2=='+'||ch2=='-'||ch2=='*'||ch2=='/'||ch2=='%'||ch2=='=') {if(Flag){Push_(Num,&NumTop,num);num = 0;Flag = 0;}switch(ch2){case '(': //对‘(’的处理(左括号)Push_(Sym,&SymTop,'(');break;case ')': //对‘)’的处理(右括号)while(SymTop!=0&&(SymTmp=Pop_(Sym,&SymTop))!='('){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),SymTmp);Push_(Num,&NumTop,ResTmp);}break;case '+': // 对‘+(加号)’的处理if(SymTop!=0 && Sym[SymTop-1]!='('){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym, &SymTop));Push_(Num,&NumTop,ResTmp);}Push_(Sym,&SymTop,'+');break;case '-': // 对‘-(减号)’的处理if(SymTop!=0 && Sym[SymTop-1]!='('){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym, &SymTop));Push_(Num,&NumTop,ResTmp);}Push_(Sym,&SymTop,'-');break;case '*': // 对‘*(乘号)’的处理if(SymTop!=0&&Sym[SymTop-1]!='('&&Sym[SymTop-1]!='+'){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym, &SymTop));Push_(Num,&NumTop,ResTmp);}Push_(Sym,&SymTop,'*');break;case '/': // 对‘/(除号)’的处理if(SymTop!=0&&Sym[SymTop-1]!='('&&Sym[SymTop-1]!='+'){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym, &SymTop));Push_(Num,&NumTop,ResTmp);}Push_(Sym,&SymTop,'/');break;case '%': // 对‘(取余)’的处理if(SymTop!=0&&Sym[SymTop-1]!='('&&Sym[SymTop-1]!='+'){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym, &SymTop));Push_(Num,&NumTop,ResTmp);}Push_(Sym,&SymTop,'%');break;case '=': // 对‘=’号处理if(SymTop!=0){while(SymTop!=0&&(SymTmp=Pop_(Sym,&SymTop))!='(' ){ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),SymTmp);Push_(Num,&NumTop,ResTmp);}}num = Pop_(Num,&NumTop);if(num<0){print_2[0]='-';num=-num;}elseprint_2[0]='+';print_2[1]=num/10000+'0';print_2[2]=num%10000/1000+'0';print_2[3]=num%1000/100+'0';print_2[4]=num%100/10+'0';print_2[5]=num%10+'0';uHALr_printf("\nResult= ");uHALr_printf(print_2);//uHALr_printf("Result= %d", num); sprintf(print_buf, "Task%c() turned\n", *(char *)Id);(void *)&IdLEDNumTop = 0;SymTop = 0;num = 0;uHALr_printf("\n");break;}}//display(num);}int Calculate(int right,int left,int symbol){int result = 0;switch(symbol){case '+':result = left+right;break;case '*':result = left*right;break;case '-':result =left-right;break;case '/':result = left/right;break;case '%':result = left%right;break;}return result;}/*-----------------------------------栈处理---------------------------------*/ void Push_(int * stack,int * top,int val){if(*top == STACK_SIZE) return;stack[(*top)++] = val; }int Pop_(int * stack,int * top){if(*top==0)return -1;return stack[--(*top)]; }。
嵌入式实验cortex-M3计算器
《嵌入式系统及应用》实验报告(2014— 2015学年第一学期)题目:简易科学计算器班级:电子科学与技术(1)班姓名:学号:指导教师:2015 年 1 月10 日目录1.设计内容 (3)2重点要解决的问题及创新性; (3)3.概要设计3.1中断控制部分 (3)3.2显示函数编写 (4)3.3运算符函数编写 (6)4.详细设计 (9)4.1驱动程序头文件 (9)4.2显示界面编写调试 (10)4.3控件程序 (21)4.3.1数字按钮对应函数 (21)4.3.2运算符号对应函数 (26)5.实验、调试及测试结果与分析。
………………………………………31.6.用户使用说明 (31)7.结论 (32)8.参考文献 (32)一、设计内容:本次设计主要以LM3S9B92开发板作为主要的开发平台,首先在这里对开发板的结构,和最重要的Cortex-M3微处理器,以及搭载的触摸屏液晶显示模块。
设计一个简易计算器,能够实现以触摸界面的形式给出简易计算器的操作界面,能实现简单的加、减、乘、除操作,并且将运算步骤都呈现在显示屏上。
二、重点要解决的问题及创新性:重点:1.设计计算器界面,将计算机控件布局到开发板上。
2.添加计算器控件的相应代码,使得计算器能够实现加减乘除基本功能。
3.创新性:1.界面的创新2.计算器实现的运算过程显示在结果输入框内,使得能够记录运算过程。
三、概要设计(说明设计系统的组成及主要实现方法,并采用流程图等图形方式形象化说明);软件设计基本包括了以下三个部分的内容:中断控制部分、显示部分和运算部分3.1中断控制部分中断控制功能的实现是在驱动程序当中,因为是与硬件功能连接十分紧密的一个能实现。
但在实际应用中又与操作紧密相关,是软件设计中十分重要的部分。
其根本编程原理是由Cortex-M3提供了一套中断控制器所提供的API。
中断控制器API 提供了一组函数,用来处理嵌套向量中断控制器(NVIC)。
这些函数执行以下功能:使能和禁止中断、注册中断处理程序和设置中断的优先级。
嵌入式qt实验报告简单计算器的设计
电子科技大学学生实验报告书课程名称实用嵌入式应用系统设计与实现任课老师实验名称简单功能计算器的设计学生姓名学生学号学生学院2015 — 2016 学年第 1 学期实验项目名称简单功能计算器的设计实验日期一、实验内容1、设计一个简单计算器并能完成简单的四则运算,实时更新运算结果;2、带界面计算器自带数字及功能按钮,能实现更多以及更灵活的的计算功能。
一、实验步骤设计(包括实验方案设计、实验步骤或算法描述等)实验设计方案如下:图1 简单计算器的设计方案流程图2 带显示界面计算器的设计方案流程实验步骤:一、简单计算器的设计:1、创建一个Qt GUI应用项目,项目名称为dialog_designer ,基类选择Qwidget。
项目建好后会自动生成一系列文件,双击界面文件widget.ui 进入Qt Designer 进行界面设计。
2、界面设计完成后修改控件的各属性,并修改Tab顺序,点击工具栏上的的“编辑Tab顺序”按钮,依次按顺序点击即可,完成后再按工具栏上的编辑控件按钮返回。
3、在头文件widget.h的Widget类添加共有槽函数;在源文件widget.cpp中添加新代码。
4、用模拟器调试运行。
二、带界面的计算器的设计:与简单计算器的设计步骤基本相同。
但是需要在项目文件(后缀为.pro)添加一段代码,使得程序中能使用Qt脚本,在原有代码的基础上添加。
在头文件widget.h的Widget类添加共有槽函数和全局变量,以及包含头文件QtScript,以使用Qt Script API。
在源文件widget.cpp中添加新代码,之后即可运行调试。
三、实验结果分析及代码(包括结果描述、综合分析及实现关键代码)实验结果如下:1、简单计算器:代码:(1)在widget.h文件中#ifndef WIDGET_H#define WIDGET_H#include<QWidget>namespace Ui{class Widget;}class Widget:public QWidget{Q_OBJECTpublic:explicit Widget(QWidget*parent=0);~Widget();private slots:void on_doubleSpinBox_1_valueChanged();void on_doubleSpinBox_2_valueChanged();void on_doubleSpinBox_3_valueChanged();void on_doubleSpinBox_4_valueChanged();void on_doubleSpinBox_5_valueChanged();void on_doubleSpinBox_6_valueChanged();void on_doubleSpinBox_7_valueChanged();void on_doubleSpinBox_8_valueChanged(); private:Ui::Widget*ui;};#endif//WIDGET_H(2)在widget.cpp源文件中#include"widget.h"#include"ui_widget.h"Widget::Widget(QWidget*parent):QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);}void Widget::on_doubleSpinBox_1_valueChanged(){ui->outout_plus->setText(QString::number(ui->doubleSpinBox_1->value() +ui->doubleSpinBox_2->value()));}void Widget::on_doubleSpinBox_2_valueChanged(){ui->outout_plus->setText(QString::number(ui->doubleSpinBox_1->value() +ui->doubleSpinBox_2->value()));}void Widget::on_doubleSpinBox_3_valueChanged(){ui->outout_minus->setText(QString::number(ui->doubleSpinBox_3->value( )-ui->doubleSpinBox_4->value()));}void Widget::on_doubleSpinBox_4_valueChanged(){ui->outout_minus->setText(QString::number(ui->doubleSpinBox_3->value()-ui->doubleSpinBox_4->value()));}void Widget::on_doubleSpinBox_5_valueChanged(){ui->outout_multi->setText(QString::number(ui->doubleSpinBox_5->value( )*ui->doubleSpinBox_6->value()));}void Widget::on_doubleSpinBox_6_valueChanged(){ui->outout_multi->setText(QString::number(ui->doubleSpinBox_5->value( )*ui->doubleSpinBox_6->value()));}void Widget::on_doubleSpinBox_7_valueChanged(){ui->outout_div->setText(QString::number(ui->doubleSpinBox_7->value() /ui->doubleSpinBox_8->value()));}void Widget::on_doubleSpinBox_8_valueChanged(){ui->outout_div->setText(QString::number(ui->doubleSpinBox_7->value() /ui->doubleSpinBox_8->value()));}Widget::~Widget(){delete ui;}2、带显示界面的计算器:代码:(1)在shiyanB.pro项目文件中QT+=core guiQT+=scriptgreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsTARGET=shiyanBTEMPLATE=appSOURCES+=main.cpp\widget.cppHEADERS+=widget.hFORMS+=widget.ui(2)在头文件widget.h中#ifndef WIDGET_H#define WIDGET_H#include<QtScript>#include"QWidget" namespace Ui{class Widget;}class Widget:public QWidget{Q_OBJECTpublic:QString sum;//全局变量。
多功能计算器的C语言实现 (1)
多功能计算器的C语言实现题目:设计一个多功能计算软件实现功能:具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。
按‘C’清屏,按‘R’返回菜单。
例如:输入:2+5输出:7C语言实现:#include<stdio.h>#include<string.h>#include<stdlib.h>#define MaxLength 50void Show_screen(){printf("####################################################\n");printf("#依次输入操作数1、运算符和操作数2,例如:2+5。
#\n");printf("#按回车键显示运算结果,其可作为下一个输入的操作数。
#\n");printf("#按键c清除屏幕,按键r返回菜单。
#\n");printf("####################################################\n");}double myadd(double x, double y){double sum;sum=x+y;if(sum-(int)sum==0)printf("%.0f",sum);elseprintf("%.6f",sum);return sum;}double mysub(double x, double y){double sub;sub=x-y;if(sub-(int)sub==0)printf("%.0f",sub);elseprintf("%.6f",sub);return sub;}double mymul(double x, double y){double mul;mul=x*y;if(mul-(int)mul==0)printf("%.0f",mul);elseprintf("%.6f",mul);return mul;}double mydiv(double x, double y){double div;div=x/y;if(div-(int)div==0)printf("%.0f",div);elseprintf("%.6f",div);return div;}int main(){int myoffset;int flag;//判断是否将上次计算结果作为下次运算操作数1的标志,是的话值为1。
单片机实训计算器报告
一、引言随着科技的飞速发展,单片机技术作为嵌入式系统的重要组成部分,已经在各个领域得到了广泛的应用。
为了提高学生对单片机技术的理解和实践能力,我们开展了单片机实训课程。
本次实训报告以设计一个简易计算器为例,详细介绍单片机在计算器中的应用及其设计过程。
二、实训目的1. 熟悉单片机的基本原理和编程方法。
2. 掌握单片机外围设备的接口技术。
3. 培养学生的实际动手能力和创新意识。
三、实训内容1. 设计要求本次实训要求设计一个基于单片机的简易计算器,能够实现以下功能:(1)加、减、乘、除四则运算;(2)结果显示在LCD1602显示屏上;(3)具有简单的错误处理功能。
2. 系统组成本计算器系统主要由以下几部分组成:(1)AT89C51单片机:作为系统的核心控制器,负责控制整个计算器的运行;(2)LCD1602显示屏:用于显示输入的数字、运算符和计算结果;(3)矩阵键盘:用于输入数字和运算符;(4)按键:用于控制计算器的开关、清零和退出等功能。
3. 硬件设计(1)AT89C51单片机:选用AT89C51单片机作为核心控制器,具有丰富的I/O端口和片内资源,可以满足计算器的需求。
(2)LCD1602显示屏:通过单片机的PORTD端口与LCD1602显示屏相连,实现数据显示功能。
(3)矩阵键盘:采用4x4矩阵键盘,将行线连接到单片机的PB0-PB3端口,列线连接到PB4-PB7端口。
(4)按键:设置三个按键,分别用于控制计算器的开关、清零和退出功能。
4. 软件设计(1)初始化:首先对单片机的I/O端口、LCD1602显示屏和矩阵键盘进行初始化。
(2)键盘扫描:通过扫描矩阵键盘,获取用户输入的数字和运算符。
(3)运算逻辑处理:根据用户输入的数字和运算符,进行相应的运算。
(4)结果显示:将计算结果显示在LCD1602显示屏上。
(5)错误处理:当输入错误或发生溢出时,显示错误信息。
四、实训过程1. 硬件电路搭建:根据设计要求,将AT89C51单片机、LCD1602显示屏、矩阵键盘和按键连接到一起,搭建计算器的硬件电路。
嵌入式实验-简易计算器
return value;
}
return -1;
}
void Lcd_Init(void)
{
rDITHMODE=0x1223a;
rDP1_2 =0x5a5a;
rDP4_7 =0x366cd9b;
rDP3_5 =0xda5a7;
rDP2_3 =0xad7;
{
if( (temp&0x1) == 0 )
value = '=';
else if( (temp&0x2) == 0 )
value = 6;
else if( (temp&0x4) == 0 )
value = 5;
else if( (temp&0x8) == 0 )
value = 4;
while(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK) // release
Lcd_Draw_VLine(usTop, usBottom, usRight, ucColor, 1);
}
void Lcd_DspAscII8x16(INT16U x0, INT16U y0, INT8U ForeColor, INT8U * s)
{
INT16 i,j,k,x,y,xx;
INT8U qm;
case '-' : z = x-y; break;
case '*' : z = x*y; break;
case '÷' : z = x÷y; break;
}
}
P = str;
基于嵌入式linux计算器的实现
沈阳航空航天大学课程设计报告课程设计名称:嵌入式系统综合课程设计课程设计题目:基于嵌入式linux计算器的实现院(系):专业:班级:学号:姓名:指导教师:完成日期:沈阳航空航天大学课程设计报告目录第1章系统分析 (1)1.1需求分析 (1)1.2硬件分析 (1)1.2.1 实验环境 (1)1.3软件分析 (2)1.3.1 操作系统简介 (2)1.3.2 开发技术简介 (2)第2章系统设计 (4)2.1操作系统移植 (4)2.2系统模块设计 (4)2.3函数设计 (4)2.4关键流程 (5)2.4.1 系统主流程 (5)2.4.2 功能按键流程图 (5)第3章QT程序移植 (7)3.1建立交叉编译环境 (7)3.2Q T源文件的编译 (8)3.3Q T应用的移植 (8)第4章系统调试及运行 (9)4.1调试分析 (9)4.2结果分析 (10)参考文献 (11)附录 (12)第1章系统分析1.1 需求分析课程设计内容和要求:设计一个简单的计算器,能够进行加、减、乘、除等数学操作。
(1)利用嵌入式linux和Qt,在ARM9上实现。
(2)界面尽可能友好、美观。
这是一个简单的计算器软件,功能为加、减、乘、除等,在嵌入式设备上实现,使用方便,性能可靠,基于ARM内核的微处理器在市场上绝对处于领导地位,因此该类项目拥有庞大的市场。
1.2 硬件分析将编写好的程序Makefile后,通过Vivi烧入到博创UP-Star2410开发板上,开机运行即可。
1.2.1 实验环境实验环境是:win7下安装虚拟机,在虚拟机上安装linux(ubuntu11.10)开发板是:博创UP-Star6410,开发板。
软件资源:(1)内核版本linux 2.6.21(2)BootLoader:U-boot(3)文件系统:Cramfs+Yaffs2硬件资源:(1)基于ARM1176JZF-S内核的SAMSUNG S3C6410处理器(2)系统工作频率为533/667MHz(3)256MB Nand Flash、8MB NorFlash(4)256MB Mobile DDR RAM(5)可外接3.5寸液晶屏或7寸液晶屏、可外接触摸屏(6)1个主USB口、一个USB OTG口(7)100M以太网口、一个USB串口接口(8)JTAG接口(9)总线和可复用资源扩展接口、多媒体支持AUDIO CODEC(10)JOYSTICK按键,1个中断键,5个LED灯1.3 软件分析这次课设我们用的是Linux下的Ubuntu系统。
嵌入式计算器的程序设计方法
嵌入式计算器的程序设计方法
嵌入式计算器的程序设计方法是一种将计算器功能集成在嵌入
式系统中的方法。
嵌入式系统是一种在特定领域中使用的计算机系统,通常用于控制、监测或处理数据。
嵌入式计算器可以嵌入在各种设备中,例如家用电器、医疗设备、汽车、机器人等。
程序设计方法包括硬件设计和软件编程两个方面。
硬件设计方面,需要考虑计算器的输入输出接口、键盘、显示屏、电源等。
同时需要根据计算器的使用场景和功能要求选择合适的处理器、存储器、时钟等硬件资源。
软件编程方面,需要根据硬件设计和需求分析进行程序设计。
常见的嵌入式计算器程序设计语言包括C语言、汇编语言等。
程序设计需要考虑计算器的算法设计、输入输出处理、用户界面设计等方面。
同时需要进行代码优化以提高程序的效率和响应速度。
总的来说,嵌入式计算器的程序设计需要综合考虑硬件和软件两个方面,同时需要根据实际需求进行相应的程序设计和优化。
- 1 -。
嵌入式计算器实训报告
一、实训目的随着科技的不断发展,嵌入式系统在各个领域得到了广泛应用。
为了提升自身在嵌入式领域的实践能力,我参加了嵌入式计算器实训课程。
本次实训旨在通过实际操作,掌握嵌入式计算器的硬件设计、软件编程和调试方法,提高动手能力和工程实践能力。
二、实训内容1. 硬件设计嵌入式计算器的硬件设计主要包括微控制器、按键输入、显示模块和存储模块等。
本次实训所使用的微控制器为STM32,按键输入采用矩阵键盘,显示模块为LCD液晶显示屏,存储模块采用EEPROM。
2. 软件编程嵌入式计算器的软件编程主要包括按键扫描、运算逻辑、显示控制和数据存储等。
本次实训采用C语言进行编程,主要使用了以下技术:(1)按键扫描:通过查询矩阵键盘的行列状态,实现按键的识别和去抖动。
(2)运算逻辑:实现基本的四则运算功能,包括加、减、乘、除等。
(3)显示控制:将运算结果在LCD液晶显示屏上显示,包括数值和符号。
(4)数据存储:将运算结果和重要数据存储在EEPROM中,以便后续读取。
3. 调试与优化在嵌入式计算器的开发过程中,调试和优化是至关重要的环节。
本次实训主要采用以下方法进行调试:(1)使用调试器观察程序运行状态,分析程序逻辑。
(2)使用逻辑分析仪观察信号波形,检查硬件电路连接。
(3)针对发现的问题,进行代码修改和优化。
三、实训过程1. 硬件搭建首先,根据设计方案,搭建嵌入式计算器的硬件电路。
主要包括微控制器、按键输入、显示模块和存储模块等。
在搭建过程中,注意电路连接的准确性和可靠性。
2. 软件编程在硬件搭建完成后,开始进行软件编程。
首先,编写按键扫描程序,实现按键的识别和去抖动。
然后,编写运算逻辑程序,实现基本的四则运算功能。
接着,编写显示控制程序,将运算结果在LCD液晶显示屏上显示。
最后,编写数据存储程序,将运算结果和重要数据存储在EEPROM中。
3. 调试与优化在编程过程中,不断进行调试和优化。
首先,使用调试器观察程序运行状态,分析程序逻辑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**************************************************************************** **** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).** All rights reserved.** Contact: Nokia Corporation (qt-info@)**** This file is part of the examples of the Qt Toolkit.**** $QT_BEGIN_LICENSE:LGPL$** Commercial Usage** Licensees holding valid Qt Commercial licenses may use this file in** accordance with the Qt Commercial License Agreement provided with the** Software or, alternatively, in accordance with the terms contained in** a written agreement between you and Nokia.**** GNU Lesser General Public License Usage** Alternatively, this file may be used under the terms of the GNU Lesser** General Public License version 2.1 as published by the Free Software** Foundation and appearing in the file LICENSE.LGPL included in the** packaging of this file. Please review the following information to** ensure the GNU Lesser General Public License version 2.1 requirements** will be met: /licenses/old-licenses/lgpl-2.1.html.**** In addition, as a special exception, Nokia gives you certain additional** rights. These rights are described in the Nokia Qt LGPL Exception** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.**** GNU General Public License Usage** Alternatively, this file may be used under the terms of the GNU** General Public License version 3.0 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file. Please review the following information to** ensure the GNU General Public License version 3.0 requirements will be** met: /copyleft/gpl.html.**** If you have questions regarding the use of this file, please contact** Nokia at qt-info@.** $QT_END_LICENSE$******************************************************************************/ #include <QtGui>#include <math.h>#include "button.h"#include "calculator.h"//! [0]Calculator::Calculator(QWidget *parent): QDialog(parent){sumInMemory = 0.0;sumSoFar = 0.0;factorSoFar = 0.0;waitingForOperand = true;waitingForE = false;//! [0]//! [1]display = new QLineEdit("0");//! [1] //! [2]display->setReadOnly(true);display->setAlignment(Qt::AlignRight);display->setMaxLength(15);QFont font = display->font();font.setPointSize(font.pointSize() + 8);display->setFont(font);//! [2]//! [4]for (int i = 0; i < NumDigitButtons; ++i) {digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));}Button *pointButton = createButton(tr("."), SLOT(pointClicked()));Button *changeSignButton = createButton(tr("\261"), SLOT(changeSignClicked()));Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked()));Button *clearButton = createButton(tr("Clear"), SLOT(clear()));Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll()));Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory()));Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory()));Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory()));Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory()));Button *divisionButton = createButton(tr("\367"), SLOT(multiplicativeOperatorClicked()));Button *timesButton = createButton(tr("\327"), SLOT(multiplicativeOperatorClicked()));Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked()));Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked()));Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));Button *powerButton = createButton(tr("x\262"), SLOT(unaryOperatorClicked()));Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked()));Button *sinhButton = createButton(tr("sinh"), SLOT(unaryOperatorClicked()));Button *coshButton = createButton(tr("cosh"), SLOT(unaryOperatorClicked()));Button *tanhButton = createButton(tr("tanh"), SLOT(unaryOperatorClicked()));Button *sinButton = createButton(tr("sin"), SLOT(unaryOperatorClicked()));Button *cosButton = createButton(tr("cos"), SLOT(unaryOperatorClicked()));Button *tanButton = createButton(tr("tan"), SLOT(unaryOperatorClicked()));Button *mi2Button = createButton(tr("x^2"), SLOT(unaryOperatorClicked()));Button *miyButton = createButton(tr("x^y"), SLOT(multiplicativeOperatorClicked()));Button *mi3Button = createButton(tr("x^3"), SLOT(unaryOperatorClicked()));Button *factorButton = createButton(tr("n!"), SLOT(unaryOperatorClicked()));Button *genyButton = createButton(tr("x^1/y"), SLOT(multiplicativeOperatorClicked()));Button *gen3Button = createButton(tr("x^1/3"), SLOT(unaryOperatorClicked()));Button *expButton = createButton(tr("Exp"), SLOT(expOperatorClicked()));Button *modButton = createButton(tr("Mod"), SLOT(multiplicativeOperatorClicked()));Button *logButton = createButton(tr("log"), SLOT(unaryOperatorClicked()));Button *mi10Button = createButton(tr("10^x"), SLOT(unaryOperatorClicked()));Button *equalButton = createButton(tr("="), SLOT(equalClicked()));//! [4]//! [5]QGridLayout *mainLayout = new QGridLayout;//! [5] //! [6]mainLayout->setSizeConstraint(QLayout::SetFixedSize);mainLayout->addWidget(display, 0, 0, 1, 10);mainLayout->addWidget(backspaceButton, 1, 0, 1, 4);mainLayout->addWidget(clearButton, 1, 4, 1, 3);mainLayout->addWidget(clearAllButton, 1, 7, 1, 3);mainLayout->addWidget(clearMemoryButton, 2, 0);mainLayout->addWidget(readMemoryButton, 3, 0);mainLayout->addWidget(setMemoryButton, 4, 0);mainLayout->addWidget(addToMemoryButton, 5, 0);for (int i = 1; i < NumDigitButtons; ++i) {int row = ((9 - i) / 3) + 2;int column = ((i - 1) % 3) + 1;mainLayout->addWidget(digitButtons[i], row, column);}mainLayout->addWidget(digitButtons[0], 5, 1);mainLayout->addWidget(pointButton, 5, 2);mainLayout->addWidget(changeSignButton, 5, 3);mainLayout->addWidget(divisionButton, 2, 4);mainLayout->addWidget(timesButton, 3, 4);mainLayout->addWidget(minusButton, 4, 4);mainLayout->addWidget(plusButton, 5, 4);mainLayout->addWidget(squareRootButton, 2, 5);mainLayout->addWidget(powerButton, 3, 5);mainLayout->addWidget(reciprocalButton, 4, 5);mainLayout->addWidget(equalButton, 5, 5);mainLayout->addWidget(sinhButton, 2, 6);mainLayout->addWidget(coshButton, 3, 6);mainLayout->addWidget(tanhButton, 4, 6);mainLayout->addWidget(expButton, 5, 6);mainLayout->addWidget(sinButton, 2, 7);mainLayout->addWidget(cosButton, 3, 7);mainLayout->addWidget(tanButton, 4, 7);mainLayout->addWidget(modButton, 5, 7);mainLayout->addWidget(mi2Button, 2, 8);mainLayout->addWidget(miyButton, 3, 8);mainLayout->addWidget(mi3Button, 4, 8);mainLayout->addWidget(logButton, 5, 8);mainLayout->addWidget(factorButton, 2, 9);mainLayout->addWidget(genyButton, 3, 9);mainLayout->addWidget(gen3Button, 4, 9);mainLayout->addWidget(mi10Button, 5, 9);setLayout(mainLayout);setWindowTitle(tr("Calculator"));}//! [6]//! [7]void Calculator::digitClicked(){Button *clickedButton = qobject_cast<Button *>(sender());int digitValue = clickedButton->text().toInt();if (display->text() == "0" && digitValue == 0.0)return;if (waitingForOperand) {display->clear();waitingForOperand = false;}display->setText(display->text() + QString::number(digitValue)); }//! [7]int factor(int n){int result = 1;while(n!=1){result=result*n;n--;}return result;}//! [8]void Calculator::unaryOperatorClicked()//! [8] //! [9]{Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();double result = 0.0;if (clickedOperator == tr("Sqrt")) {if (operand < 0.0) {abortOperation();return;}result = sqrt(operand);} else if (clickedOperator == tr("x\262")) {result = pow(operand, 2.0);} else if (clickedOperator == tr("1/x")) {if (operand == 0.0) {abortOperation();return;}result = 1.0 / operand;} else if (clickedOperator == tr("sin")) {result = sin(operand);} else if (clickedOperator == tr("cos")) {result = cos(operand);} else if (clickedOperator == tr("tan")) {result = tan(operand);} else if (clickedOperator == tr("sinh")) { result = sinh(operand);} else if (clickedOperator == tr("cosh")) { result = cosh(operand);} else if (clickedOperator == tr("tanh")) { result = tanh(operand);} else if (clickedOperator == tr("x^2")) { result = operand * operand;} else if (clickedOperator == tr("x^3")) { result = operand * operand * operand;} else if (clickedOperator == tr("n!")) {if (operand < 0.0){abortOperation();return;}result = factor(operand);} else if (clickedOperator == tr("log")) {if(operand <= 0.0) {abortOperation();return;}result = log(operand)/log(10);} else if (clickedOperator == tr("10^x")) { result = pow(10, operand);} else if (clickedOperator == tr("x^1/3")) { result = pow(operand, 1.0/3.0);}display->setText(QString::number(result));waitingForOperand = true;waitingForE = false;}//! [9]//! [10]void Calculator::additiveOperatorClicked()//! [10] //! [11]{Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();//! [11] //! [12]if (!pendingMultiplicativeOperator.isEmpty()) {//! [12] //! [13]if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}display->setText(QString::number(factorSoFar));operand = factorSoFar;factorSoFar = 0.0;pendingMultiplicativeOperator.clear();}//! [13] //! [14]if (!pendingAdditiveOperator.isEmpty()) {//! [14] //! [15]if (!calculate(operand, pendingAdditiveOperator)) {abortOperation();return;}display->setText(QString::number(sumSoFar));} else {sumSoFar = operand;}//! [15] //! [16]pendingAdditiveOperator = clickedOperator;//! [16] //! [17]waitingForOperand = true;waitingForE = false;}//! [17]//! [18]void Calculator::multiplicativeOperatorClicked(){Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();if (!pendingMultiplicativeOperator.isEmpty()) {if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}display->setText(QString::number(factorSoFar));} else {factorSoFar = operand;}pendingMultiplicativeOperator = clickedOperator;waitingForOperand = true;waitingForE = false;}//! [18]void Calculator::expOperatorClicked(){Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();if(!waitingForE){beforeE = operand;display->setText(QString::number(beforeE)+tr("e+0"));waitingForE = true;}}//! [20]void Calculator::equalClicked(){double operand = display->text().toDouble();if (!pendingMultiplicativeOperator.isEmpty()) {if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}operand = factorSoFar;factorSoFar = 0.0;pendingMultiplicativeOperator.clear();}if (!pendingAdditiveOperator.isEmpty()) {if (!calculate(operand, pendingAdditiveOperator)) { abortOperation();return;}pendingAdditiveOperator.clear();} else {sumSoFar = operand;}display->setText(QString::number(sumSoFar));sumSoFar = 0.0;waitingForOperand = true;}//! [20]//! [22]void Calculator::pointClicked(){if (waitingForOperand)display->setText("0");if (!display->text().contains("."))display->setText(display->text() + tr("."));waitingForOperand = false;}//! [22]//! [24]void Calculator::changeSignClicked(){QString text = display->text();double value = text.toDouble();if (value > 0.0) {text.prepend(tr("-"));} else if (value < 0.0) {text.remove(0, 1);}display->setText(text);}//! [24]//! [26]void Calculator::backspaceClicked(){if (waitingForOperand)return;QString text = display->text();text.chop(1);if (text.isEmpty()) {text = "0";waitingForOperand = true;}display->setText(text);}//! [26]//! [28]void Calculator::clear(){if (waitingForOperand)return;display->setText("0");waitingForOperand = true;}//! [28]//! [30]void Calculator::clearAll(){sumSoFar = 0.0;factorSoFar = 0.0;pendingAdditiveOperator.clear();pendingMultiplicativeOperator.clear();display->setText("0");waitingForOperand = true;}//! [30]//! [32]void Calculator::clearMemory(){sumInMemory = 0.0;}void Calculator::readMemory(){display->setText(QString::number(sumInMemory));waitingForOperand = true;}void Calculator::setMemory(){equalClicked();sumInMemory = display->text().toDouble();}void Calculator::addToMemory(){equalClicked();sumInMemory += display->text().toDouble();}//! [32]//! [34]Button *Calculator::createButton(const QString &text, const char *member){Button *button = new Button(text);connect(button, SIGNAL(clicked()), this, member);return button;}//! [34]//! [36]void Calculator::abortOperation(){clearAll();display->setText(tr("####"));}//! [36]//! [38]bool Calculator::calculate(double rightOperand, const QString &pendingOperator) {if (pendingOperator == tr("+")) {sumSoFar += rightOperand;} else if (pendingOperator == tr("-")) {sumSoFar -= rightOperand;} else if (pendingOperator == tr("\327")) {factorSoFar *= rightOperand;} else if (pendingOperator == tr("\367")) {if (rightOperand == 0.0)return false;factorSoFar /= rightOperand;} else if (pendingOperator == tr("x^y")) {factorSoFar = pow(factorSoFar, rightOperand);} else if (pendingOperator == tr("x^1/y")) {if (rightOperand == 0.0)return false;factorSoFar = pow(factorSoFar, 1.0/rightOperand);} else if (pendingOperator == tr("Mod")) {if (rightOperand == 0.0)return false;factorSoFar = (int)factorSoFar % (int)rightOperand;}return true;}//! [38]。