基于51单片机的简易计算器制作
- 格式:doc
- 大小:206.00 KB
- 文档页数:15
基于51单片机的计算器设计2015年5月1日目录摘要 (3)一、前言 (4)1)主要的问题及目标: (4)2)针对上述目标,做出以下的设计: (4)3)系统设计依据: (4)二、系统方案设计 (5)1.方案一 (5)2.方案二 (5)三、理论分析与计算 (6)四、系统电路设计 (7)1.显示模块 (7)2.输入模块 (7)3.控制模块 (8)4.元器件的选择 (9)5.特殊器件的简介 (9)6.各单元模块的连接 (9)五、系统软件设计 (10)1.设计原理 (10)2.程序结构框图 (10)3.程序流程框图 (11)六、系统测试 (14)1.测试方法 (14)2.计算器功能测试 (14)3.测试结果分析 (14)七、结束语 (15)1.心得感悟 (15)2.改进的设想 (15)八、附录 (15)1.系统设计图 (15)2.设计程序 (15)摘要电子计算器是日常生活中常用的电子计算仪器,他广泛应用于超市、大中型商场、大小企业与学校中。
具有精度高。
体积小、应用范围广泛、易于操作等优点。
本作品以MCS-51系列中的AT89C51单片机为核心,能够实现单步加、减、乘、除运算。
该系统通过检测矩阵键盘扫描,判断是否按键,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。
经数据转换把数值送入lcd1602液晶屏显示。
整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入lcd1602显示。
整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换为了数码管显示;功能模块三,lcd1602显示。
能实现6位或6位以内的精确运算,若输出数据超过6位则会以科学计数法显示。
关键词:AT89C51单片机;计算器;加减乘除;矩阵键盘;液晶屏一、前言本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除基本四则运算,并在LCD上显示相应的结果;设计电路采用STC89C51单片机为主要控制电路,显示采用1602LCD显示;软件方面使用C语言编程。
基于51单片机简易计算器设计引言计算器(Calculator)是微型电子计算机的一种特殊类型。
它与一般通用计算机的主要区别在于程序输入方式的不同。
计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。
而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。
简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。
现代电子计算器首次问世是1963年。
那时的计算器是台式的,在美国波士顿的电子博览会上展出过。
与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。
随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。
现在不在单一的在某一方面而是涉及到生活的方方面面.由于我对知识掌握的不够熟练,重点不够清楚,导致在重点与非重点处花费的时间不成比例,进度缓慢,这是设计没能全部完成的部分原因。
目前只做到按键与显示的结合(即在显示器上可以显示数字键还有命令键+-*/ =清零);加法子程序已经编写成功并严整无误,但在整体调试中未能圆满实现,本部分正在调试中。
等调试成功后,其它运算子程序的问题将迎刃而解。
1.简易计算器的设计方案1.1硬件部分设计方案1 单片机部分单片机以AT89C51来做为核心元器件。
2 按键部分设计思路:采用4*4行列式键盘,分别设定数字键和功能键,采用查询方式,每次有键按下时,先判断是实数字键还是功能键。
但是这种方式采用了大量的I/O口线。
基于51/52单片机的简易计算器制作11级自动化2班王栎斐宋为为闫巨东一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。
二、任务与要求要求计算器能实现加减乘除四种运算具体如下1. 加法:四位整数加法计算结果若超过八位则显示计算错误2. 减法:四位整数减法计算结果若超过八位则显示计算错误3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误4. 除法:整数除法5. 有清除功能三、课程设计简述总体设计思路简述1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。
主控芯片使用STC89C52单片机。
2.键盘电路采用4*4矩阵键盘电路。
3.显示模块采用共阳极数码管构成。
四、硬件电路五、软件编程部份#include<reg52.h>#define uchar unsigned char#define uint unsigned int//uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极// 0 1 2 3 4 5 6 7 8 9 熄灭-//uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7};//uchar code ero[]={0x79,0x50,0x5c};uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极uchar code loc[]={0x00,0x80,0x40,0x20,0x10};uchar code ero[]={~0x79,~0x50,~0x5c};uint n=0,n1=0,n2=0; //赋初值uchar flag=0; //计算类型选择关键字void delay(int t);void display(int n);void error();main(){while(1){uchar temp;//第一行检测P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xfe;if(temp!=0xfe){temp=P3;switch(temp){case 0xee:n1=0;n2=0;n=0;flag=0;break; //清零case 0xde:n1=10*n1+0;n=n1;break;case 0xbe: if(flag==1)n=n2+n1; //=if(flag==2)n=n2-n1;if(flag==3)n=n2*n1;if(flag==4)n=n2/n1;n1=0;break;case 0x7e: // +n2=n1;n1=0;flag=1;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第二行P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:n1=10*n1+1;n=n1;break; //4case 0xdd:n1=10*n1+2;n=n1;break; //5case 0xbd:n1=10*n1+3;n=n1;break; //6case 0x7d:// -n2=n1;n1=0;flag=2;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第三行P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:n1=10*n1+4;n=n1;break;case 0xdb:n1=10*n1+5;n=n1;break;case 0xbb:n1=10*n1+6;n=n1;break;case 0x7b: // *n2=n1;n1=0;flag=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第四行P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:n1=10*n1+7;n=n1;break; //7case 0xd7:n1=10*n1+8;n=n1;break; //8case 0xb7:n1=10*n1+9;n=n1;break; //9case 0x77: // /n2=n1;n1=0;flag=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}display(n);}}//延时函数void delay(int t){int x,y;for(x=0;x<t;x++)for(y=0;y<t;y++);}//数码管显示void display(int n){//溢出处理uchar g,s,b,q;int abs;if((n>9999)||(n<-999)) error();//正数if((n>=0)&&(n<=9999)) {g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;P0=num[g];delay(5);P2=loc[4];delay(2);P2=loc[0];delay(3);if(n>=10){P0=num[s];P2=loc[3];delay(2);P2=loc[0];delay(3);}if(n>=100){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(3);}if(n>=1000){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(3);}}//负数if((n<0)&&(n>=-999)){abs=-n;g=abs%10;s=abs/10%10;b=abs/100%10;q=abs/1000%10;P0=num[g];P2=loc[4];delay(2);P2=loc[0];delay(2);if((abs/10%10>0)||(abs/100%10>0)){P0=num[s];P2=loc[3];;delay(2);P2=loc[0];delay(2);if((abs/100%10>0)){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(2);if((abs/1000%10>0)){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(2);}else{P0=num[11];P2=loc[1];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[2];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[3];delay(2);P2=loc[0];delay(2);}}}//溢出显示void error(){P2=loc[1];P0=ero[0];delay(2);P2=loc[0];delay(3);P2=loc[2];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[3];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[4];P0=ero[2];delay(2);P2=loc[0];delay(3); }。
基于51单片机的简易计算器51单片机是一种广泛应用于嵌入式系统中的常用微控制器。
我们可以利用51单片机的强大功能和丰富的外设资源,设计一个简易计算器。
这个计算器可以进行基本的加减乘除运算,并且具备显示结果的功能。
首先,我们需要准备一块51单片机开发板,一块1602液晶显示屏模块,以及一些按键开关和电阻。
我们可以将运算器主要分为以下几个模块:数码管显示模块、键盘输入模块、运算模块和存储模块。
数码管显示模块:我们使用1602液晶显示屏模块来显示计算器的结果。
我们可以通过51单片机的IO口,将计算结果发送给液晶显示屏模块,实现结果的显示。
键盘输入模块:我们可以使用几个按键开关来实现数字和运算符的输入。
通过对按键的检测,我们可以将用户输入的数字和运算符转化为字符形式,并保存到内存中。
运算模块:我们需要根据用户输入的数字和运算符,进行相应的运算。
我们可以使用栈来实现这个功能。
栈是一种常用的数据结构,具有"先进后出"的特点。
我们可以将用户输入的数字和运算符按照一定的规则入栈,然后按照相应的顺序进行出栈和运算。
最后将结果保存到内存中。
存储模块:我们可以使用内部RAM来保存运算结果。
51单片机的内部RAM具有一定的存储能力,可以满足我们的基本需求。
在编写程序时,我们可以使用汇编语言或者C语言。
通过合理的编程,我们可以实现计算器的各项功能。
总结一下,基于51单片机的简易计算器主要包括数码管显示模块、键盘输入模块、运算模块和存储模块。
我们可以通过合理的编程,将这些模块相互配合,实现一个功能完善的计算器。
这个计算器不仅可以进行基本的加减乘除运算,还可以显示结果,方便用户进行计算。
基于51单片机的简易计算器论文设计摘要:计算器是一种常见的电子设备,用于数学计算。
随着科技的迅速发展,计算器不再是一种巨大且笨重的机械设备。
相反,它们变得迷你、便携且功能强大。
本论文旨在设计和实现一种基于51单片机的简易计算器。
该设计利用了51单片机的优点,如低功耗、成本低廉和易于学习等特点。
本论文介绍了设计和实现的过程,包括硬件电路设计、软件程序编写以及性能测试等方面。
1.引言计算器广泛应用于日常生活和学习中,人们常常需要进行加减乘除等简单的数学计算。
为了提供便捷的计算功能,传统计算器使用专用的集成电路设计。
然而,这种计算器成本较高,体积较大,且功能有限。
为了满足市场需求,我们设计了一款基于51单片机的简易计算器。
2.硬件电路设计2.1键盘模块键盘模块采用矩阵键盘设计,包括数字键0-9、运算符键+、-、*、/以及等于键=。
采用矩阵建构可以减少IO口资源的使用,并简化设计。
2.2显示模块显示模块采用液晶显示器,能够清晰地显示数字、运算符和结果。
为了实现更好的用户交互体验,还可以添加背光模块。
2.3控制电路控制电路由51单片机和其他常用电子元件组成,可以通过编程控制键盘的输入和显示模块的输出。
其中,51单片机充当了控制中心的作用,负责接收键盘输入、解析用户命令、进行数学计算和控制显示模块的显示。
2.4电源电路电源电路用于提供稳定的电源给整个计算器系统。
电源电路由电池、稳压电路和滤波电路组成,能够为计算器提供稳定的电压和电流。
3.软件程序设计软件程序设计是整个计算器系统的核心。
主要功能包括接收键盘输入、解析输入、进行数学计算、控制显示模块的显示和处理异常情况。
3.1键盘输入接收软件程序通过扫描键盘矩阵来接收键盘输入。
当用户按下一些键时,软件程序会检测到相应的按键信号,并将其转换为数值或运算符。
3.2输入解析软件程序能够解析用户的输入,判断用户输入的是数字还是运算符,并将其保存在相应的变量中。
同时,软件还可以处理异常输入,如除以零等情况。
基于51单片机的简易计算器设计基于51单片机的简易计算器设计一、引言随着微电子技术和嵌入式技术的发展,越来越多的智能化设备被应用于日常生活中。
其中,基于51单片机的简易计算器设计具有广泛的应用价值。
本文将介绍如何使用51单片机设计一个简易计算器,实现加减乘除的基本运算功能。
二、设计方案1.硬件组成:本设计采用51单片机作为主控芯片,与键盘、显示器等外围设备相连。
键盘用于输入数字和运算符,显示器则用于显示运算结果。
2.软件设计:软件部分包括主程序和子程序。
主程序负责初始化硬件、读取键盘输入和显示运算结果。
子程序包括加减乘除的运算子程序,可根据输入的运算符和操作数进行相应的运算。
3.算法实现:在加减乘除的运算子程序中,采用基本的数学运算方法实现。
对于加法,直接将两个操作数相加;对于减法,将两个操作数相减;对于乘法,采用循环相乘的方法;对于除法,采用循环相除的方法。
三、实验结果在实验中,我们成功地使用51单片机设计了一个简易计算器,实现了加减乘除的基本运算功能。
在测试过程中,我们输入了不同的数字和运算符,得到了正确的运算结果。
同时,我们也测试了计算器的稳定性,发现其在连续运算时表现良好,没有出现明显的误差或故障。
四、结论基于51单片机的简易计算器设计具有简单易行、实用性强等优点。
通过实验测试,我们验证了其可行性和稳定性。
此外,该设计还可以根据需要进行扩展和优化,例如增加更多的运算功能、优化算法等。
未来,我们可以进一步研究如何提高计算器的运算速度和精度,以及如何将其应用于更多的实际应用场景中。
五、改进意见与展望1.增加更多的运算功能:例如实现括号、开方、指数等高级运算,满足更复杂的数学计算需求。
2.优化算法:针对现有的加减乘除运算算法进行优化,提高运算速度和精度。
例如采用更高效的除法算法,减少运算时间。
3.增加存储功能:在计算器中加入存储单元,使得用户可以在多个步骤之间进行数据传递和保存。
4.增强人机交互界面:优化显示器的显示效果,增加用户输入的便捷性,提高用户体验。
51单片机简易计算器设计一、设计思路计算器的基本功能包括加法、减法、乘法和除法。
我们可以使用按键作为输入方式,将输入的数字和操作符暂时保存在内存中,然后根据操作符进行相应的运算。
最后再将运算结果显示在数码管上。
具体设计思路如下:1.确定计算器所需的硬件组件:数码管、按键、51单片机和相关电路。
2.定义按键与数字和操作符的对应关系。
3.编写51单片机的程序,实现按键输入、运算和结果显示的功能。
二、硬件设计1.数码管:使用常见的7段数码管作为显示器,通过引脚连接到51单片机的IO口。
2.按键:使用4个按键分别表示数字输入键、加法键、减法键和等于键。
三、软件设计1.初始化:将数码管引脚设为输出模式,将按键引脚设为输入模式。
2.按键处理:采用中断方式检测按键输入,通过编程判断所按的键。
3.数字输入:将按键所对应的数字保存在变量中,最多支持四位数的输入。
4.操作符输入:将按下的操作符保存在变量中。
5.运算:根据保存的操作符进行相应的运算,并将结果保存在变量中。
6.结果显示:将结果显示在数码管上。
四、代码实现下面是一个示例代码的框架,供参考:```c#include <reg52.h>sbit SDA = P0^0; // I2C总线数据线sbit SCL = P0^1; // I2C总线时钟线//定义按键的IO口sbit BUTTON0 = P1^0; // 数字输入键sbit BUTTON1 = P1^1; // 加法键sbit BUTTON2 = P1^2; // 减法键sbit BUTTON3 = P1^3; //等于键unsigned char num1 = 0; // 第一个操作数unsigned char num2 = 0; // 第二个操作数unsigned char op = 0; // 操作符unsigned char result = 0; // 运算结果//判断按键所对应的数字或操作符void buttonif (BUTTON0 == 0) // 数字输入键//将按键所对应的数字保存在变量中//显示数字}else if (BUTTON1 == 0) // 加法键//保存操作符为加号}else if (BUTTON2 == 0) // 减法键//保存操作符为减号}else if (BUTTON3 == 0) //等于键//根据保存的操作符进行相应的运算//将结果保存在变量中//显示结果}void mainwhile (1)button(; // 按键处理}```五、总结通过以上的设计思路和示例代码,我们可以轻松地实现一个简易的计算器。
基于单片机的简易设计原理专业:通信专业班级:通信1班姓名:刘民学号:1304041127摘要:按下键盘,通过键盘扫描程序,在LCD液晶显示屏上显示按键的操作过程,最终显示计算结果,实现计算器的基本功能。
本文详细介绍LCD显示屏、矩阵键盘与C51单片机接口的应用,并介绍如何通过C51单片机实现计算器的算法。
关键字:C51单片机,键盘,LCD液晶,计算器一、设计任务:本次实验是要以51系列单片机为核心实现一个简易计算器,它的结构简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块STC90C51单片机构成,通过软件编程可实现简单加、减、乘、除、清除结果。
实现对计算器的设计,具体设计如下:1、采用6位显示,最大显示值为“999999”,设计16个按键的矩阵键盘,按键包括‘0~9’、‘+’、‘-’、‘*’、‘/’、‘=’、‘C’。
2、加减法做四字节运算;乘法做双字节运算;除法被除数为四字节,除数为两字节。
3、当运算结果超出显示范围时,显示ERROR!。
4、上述运算输入值均为整数,当结果带有小数时,可以采用四舍五入方式处理,也可以带小数显示。
二、方案论证经分析,计算器电路包括三个部分:显示电路、、4*4键扫描电路、单片机微控制电路。
具体如下:⒈)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。
又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.⒉)4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用3 种方法读取键值。
一种是中断式,外两种是扫描法和反转法。
扫描法:对键盘上的某一行送低电平,其他行及列全为高电平,然后读取列值,检查各列线点评的变化,如果某列线电平为低电平,就可以确定此行此列交叉点处的按键被按下,采用延时去抖动。
⒊)单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。
基于51单片机的简易计算器1、前言:本设计是基于51系列单片机来进展的数字计算器系统设计,可以完成计算器的键盘输入,进展加、减、乘、除根本四则运算,并在LCD上显示相应的结果;设计电路采用STC90C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入;显示采用字符LCD静态显示;软件方面使用C语言编程,并用PROTUES仿真。
2、设计任务:计算器软件程序要完成以下模块的设计:(1)键盘输入检测模块;〔2〕LCD 显示模块;〔3〕算术运算模块;〔4〕错误处理及提示模块。
3、主体设计局部:〔1〕、系统模块图:2〕、系统总流程图:4、硬件局部单片机局部+矩阵键盘+1602显示如下列图为简易计算器的电路原理图。
P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。
简易计算器电路原理图矩阵键盘有16个按键,满足对简易计算器的计算实现,显示局部采用LCD1602,第一行显示计算的数值符号,第二行显示计算结果。
LCD显示模块:本设计采用LCD液晶显示器来显示输出数据。
通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。
5、软件局部*include<reg52.h>*include<intrins.h>*define uchar unsigned charsbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P2^5;sbit lcdbf=P0^7;uchar temp,key,i,j,flag,fh,k;long a,b,c;uchar code table[]={1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};uchar code table2[]="123+456-789*000/"; void delay(uchar ms){uchar *,y;for(*=ms;*>0;*--)for(y=110;y>0;y--);}/*-------------对LCD1602的操作-----------*/ bit busy(void)//判断忙碌{bit res;lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();res=lcdbf;lcden=0;return res;}void write_inst (uchar cmd)//写命令{while(busy()==1); //忙碌就等待lcdrs=0;.lcdrw=0;lcden=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();lcden=1;_nop_();_nop_();lcden=0;}void write_(uchar )//写地址{write_inst(|0*80);}void write_date(uchar dat) //写数据{while(busy()==1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;_nop_();_nop_();lcden=1;_nop_();_nop_();lcden=0;}void init() //初始化{lcden=1;write_inst(0*38);//显示8位2行delay(5);write_inst(0*0c);//显示开,光标关,不闪烁delay(5);write_inst(0*06);//增量方式不位移delay(5);write_inst(0*80);//检测忙碌信号delay(5);write_inst(0*01);//delay(5);}/*------------键盘扫描-----------*/void keyscan()//键盘扫描{P3=0*fe;if(P3!=0*fe){delay(100);if(P3!=0*fe){temp=P3&0*f0;switch(temp){case 0*e0:key=0;break;case 0*d0:key=1;break;case 0*b0:key=2;break;case 0*70:key=3;break;}}while(P3!=0*fe);if(key==0||key==1||key==2){if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=1;write_date(table2[key]);}}}P3=0*fd;if(P3!=0*fd){delay(100);if(P3!=0*fd){temp=P3&0*f0;switch(temp){case 0*e0:key=4;break;case 0*d0:key=5;break;case 0*b0:key=6;break;case 0*70:key=7;break;}}while(P3!=0*fd);if(key==4||key==5||key==6){if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=2;write_date(table2[key]);}}}P3=0*fb;if(P3!=0*fb){delay(100);if(P3!=0*fb){temp=P3&0*f0;switch(temp){case 0*e0:key=8;break;case 0*d0:key=9;break;case 0*b0:key=10;break;case 0*70:key=11;break;}}while(P3!=0*fb);if(key==8||key==9||key==10) {if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=3;write_date(table2[key]);}}}P3=0*f7;if(P3!=0*f7){delay(100);if(P3!=0*f7){temp=P3&0*f0;switch(temp){case 0*e0:key=12;break;case 0*d0:key=13;break;case 0*b0:key=14;break;case 0*70:key=15;break;}}while(P3!=0*f7);.switch(key){case 12:{write_inst(0*01);a=0;b=0;flag=0;fh=0;j=0;k=0;} break;case 13:{if(flag==0){a=a*10;write_date(0*30);P1=0;}else if(flag==1){b=b*10;write_date(0*30);}.} break;case 14:{j=1;if(fh==1){write_(0*4f);write_inst(0*04);c=a+b;while(c!=0){write_date(0*30+c%10);c=c/10;}write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==2){write_(0*4f);write_inst(0*04);if((a-b)>0)c=a-b;elsec=b-a;if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;}if((a-b)*(-1)>0)write_date(0*2d);write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==3){write_(0*4f);write_inst(0*04);c=a*b;if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;}write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==4){write_(0*4f);write_inst(0*04);i=0;c=(long)(((float)a/b)*1000); //计算c的数据if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;i++;if(i==3)write_date(0*2e); //写数据}if((a/b)<=0)write_date(0*30);write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}} break;case 15:{if(k==0).{write_date(table2[key]);flag=1;k=1;fh=4;}} break;}}}void main(){init();i=0;j=0;.a=0;b=0;c=0;k=0;flag=0;fh=0;while(1){keyscan();}}6、总结通过该计算器的设计我深入学习数码管扫描和键盘控制,提高对了51系列单片机的实际应用能力。
基于单片机的简易计算器设计摘要 (3)关键字:80C51 LCD1602 4*4矩阵键盘计算器 (3)第一章绪论 (5)1.1系统开发背景 (5)1.2系统开发意义 (5)1.3设计目的 (5)1.4设计任务 (5)第二章单片机发展现状 (7)2.1目前单片机的发展状况 (7)2.1.1单片机的应用场合 (7)2.2计算器系统现状 (8)2.3简易计算器系统介绍 (9)第三章系统硬件设计及说明 (9)3.1系统组成及总体框图 (11)3.2AT89S52单片机介绍 (11)3.3其它器件介绍及说明 (13)3.3.1 LCD1602液晶显示 (13)3.3.2 4*4矩阵扫描按键 (18)第四章 PROTEUS模拟仿真 (19)第五章系统硬件设计及说明 (21)第六章软件设计 (22)6.1汇编语言和C语言的特点及选择 (22)6.2源程序代码 (22)摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算机在人们的日常生活中是比较常见的电子产品之一。
可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计主要以80C51单片机为控制芯片,用C语言进行编程实现,通过4*4矩阵键盘控制,输出用液晶屏LCD1602显示,该计算器可以实现一般的加减乘除四则混合运算。
关键字:80C51 LCD1602 4*4矩阵键盘计算器第一章绪论1.1 系统开发背景随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较的常见的电子产品之一。
如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好的为各个行业服务,成了如今电子领域重要的研究课题。
湖南机电职业技术学院毕业设计说明书课题名称: 基于51单片机简易的计算器制作院、系:电气工程学院专业:机电一体化学生班级:机电1211 学生姓名:成超强指导教师:李婕妤完成日期: 2021.10毕业设计任务书题目:基于51单片机的简易计算器制作任务与要求:在生活当中我们经常需要进行加减乘除计算,随着科技的开展,电子计算器代替心算和笔算已经相当普及。
但目前市面上有些电子计算器的功能设计过于复杂,功能简易实用的电子计算器反而更加适用于老人和小孩,且本钱低廉,存在一定的市场需求。
因此本设计制作一款适用于老人和小孩的简易电子计算器。
基于51单片机的简易计算器应用AT89C51单片机,通过4*4矩阵键盘设计计算器需要的数字键和功能键,用4个数码管来显示运算过程和结果。
此计算器由于受数码管个数限制,只能进行0-999内的加减乘除计算,显示结果只显示整数局部。
1.设计任务设计简易计算器的硬件电路,绘制PCB板,组装简易计算器,并完成计算器的C语言程序设计。
2.要求:1、计算器需设计0-9、+、—、*、%、=、去除共16个按键。
2、计算器带4位数码管显示。
3、计算器能实现3位数内的加减乘除计算。
4、计算器硬件应包含程序下载电路。
毕业设计(论文)进度方案表目录毕业设计任务书 (2)毕业设计(论文)进度方案表 (2)第一章单片机介绍 (6)1单片机及其应用 (6)1.1 单片机介绍 (6)1.2 单片机的应用 (7)第二章元件介绍 (7)单片机介绍 (8)第三章系统设计 (10)单片机简易的计算器制作 (10)数码管显示 (11)矩阵按键 (11)第四章系统硬件的设计与介绍 (12)复位电路的设计 (12)时钟震荡电路的设计 (13)输入电路的设计 (14)输出电路的设计 (16)第五章系统程序的设计与介绍 (18)显示程序流程图设计 (18)读键输入程序流程图 (20)主程序设计 (21)仿真与调试 (22)第六章心得体会 (24)结语........................................................................................ 错误!未定义书签。
基于51单片机的简易教学计算器设计设计目的:本设计旨在基于51单片机实现一个简易的教学计算器,可以进行基本的四则运算,并具备一些辅助功能,帮助学生进行数学计算和学习。
设计要求:1.显示器:使用液晶显示器(LCD)来显示操作数和计算结果。
2.键盘输入:设计一个按键矩阵作为输入设备,用于输入数字和操作符。
3.四则运算:实现加法、减法、乘法和除法四种基本运算。
4.辅助功能:提供开平方、取倒数等辅助功能。
5.界面友好:界面清晰、操作简单。
硬件设计:1.51单片机(AT89C52):作为计算器的核心芯片,控制程序运行和与外围设备的交互。
2.液晶显示器(LCD):用于显示操作数和计算结果。
3.按键矩阵:用于输入数字和操作符。
4.运算模块:用于进行四则运算和辅助功能计算。
软件设计:1.系统初始化:初始化51单片机和LCD屏幕,设置键盘矩阵的引脚。
2.输入处理:通过按键矩阵检测用户输入,并将输入的字符存储在缓冲区中。
3.表达式计算:根据用户输入的表达式,通过逆波兰表达式算法将其转换为后缀表达式,并进行计算得到结果。
4.显示结果:将计算结果显示在LCD屏幕上。
5.辅助功能:根据用户选择的辅助功能,进行相应的计算,并显示结果。
6.重置功能:提供清零功能,将计算器的状态和显示结果重置。
操作流程:1.系统初始化:开机时,系统进行初始化,屏幕显示“计算器”字样。
2.输入操作数和操作符:用户通过按键矩阵输入操作数和操作符。
3.计算结果:用户输入“=”符号后,计算器根据输入的表达式进行计算,并将结果显示在LCD屏幕上。
4.辅助功能:在计算结果显示完成后,用户可选择进行辅助功能,如开平方、取倒数等操作。
5.重置功能:用户可通过按下“C”键进行重置,将计算器状态和显示结果清零。
总结:本设计基于51单片机实现了一个简易的教学计算器,具备基本的四则运算功能和一些辅助功能。
其使用液晶显示器作为显示设备,利用按键矩阵进行输入操作,通过逆波兰表达式算法进行计算,并将结果显示在屏幕上。
基于51单片机简易计算器课程设计报告引言:计算器是现代社会中常见的电子设备之一,它能够帮助人们进行各种数学运算,提高计算效率。
本文将介绍基于51单片机的简易计算器的设计过程及实现方法。
一、设计目标本次设计的目标是实现一个简易计算器,能够进行基本的加减乘除运算,并能够显示计算结果。
通过该设计,旨在加深学生对51单片机的理解,培养其实际操作能力。
二、硬件设计1. 电源模块:采用稳压电源模块,提供稳定的电压给单片机及其他电路模块。
2. 单片机模块:采用51单片机,作为计算器的核心控制模块,负责接收按键输入、进行运算和显示结果。
3. 按键模块:设计合适的按键电路,用于输入数字和操作符。
4. 显示模块:采用数码管或液晶显示屏,显示计算结果。
5. 连接线:将各个模块连接起来,确保信号的传输畅通。
三、软件设计1. 初始化:设置单片机的工作模式、端口方向和初始状态。
2. 按键扫描:通过轮询的方式检测按键是否被按下,若有按键按下则进行相应的处理。
3. 输入处理:根据按键的顺序和操作符的位置进行输入的处理,将输入的数字和操作符分别存储在相应的变量中。
4. 运算处理:根据输入的操作符进行相应的运算,得出计算结果。
5. 结果显示:将计算结果通过数码管或液晶显示屏进行显示。
6. 清零处理:在计算结果显示完毕后,对相关的变量进行清零处理,以便进行下一次的计算。
四、功能实现1. 加法运算:通过按下"+"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
2. 减法运算:通过按下"-"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
3. 乘法运算:通过按下"*"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
新基于51单片机的简易计算器一、引言计算器是一种广泛应用的电子设备,用于进行常见的数值运算。
在现代社会,计算器是广大人们日常生活和学习中常用的工具之一、本文将介绍一种新基于51单片机的简易计算器的设计和实现,该计算器具有计算基本四则运算的功能,并且操作简便、界面友好。
二、设计实现1.系统硬件设计该计算器的硬件主要由51单片机、LCD显示屏、按键开关、电源等组成。
(1)51单片机:使用51系列单片机作为计算器的核心处理器,它具有处理能力强、易编程等特点,可以快速实现计算功能。
(2)LCD显示屏:采用16*2字符LCD显示屏,用于显示计算结果和用户输入的数字。
(3)按键开关:设置数字键盘开关、运算符键盘开关、等号键开关等,用户通过按下对应的按键输入数字和运算符。
(4)电源:使用直流电源供电,通过稳压电路和滤波电路提供稳定的电压和电流。
2.系统软件设计该计算器的软件主要由嵌入式C语言编写,实现了计算基本四则运算的功能。
(1)初始化:在系统启动时对各个设备进行初始化设置,包括LCD显示屏的初始化、按键开关的初始化等。
(2)用户输入:通过按键开关读取用户输入的数字和运算符,将其保存在缓冲区中。
(3)计算功能:根据用户输入的数字和运算符,通过判断运算符的类型进行相应的数值计算,并将结果保存在特定的寄存器中。
(4)结果显示:将计算结果从寄存器中读取并显示在LCD显示屏上,用户可以直观地看到计算结果。
三、系统特点1.硬件结构简单:该计算器的硬件结构简单,主要由几个常见元件组成,易于制作和调试。
2.操作简便:用户只需通过按键输入数字和运算符,即可完成计算操作,无需进行复杂的设置和调试。
3.界面友好:通过LCD显示屏直观地显示计算结果,用户可以清楚地了解计算过程和结果。
4.功能强大:该计算器可以进行基本的四则运算,满足大多数日常计算需求。
四、应用范围该简易计算器可以广泛应用于日常生活和学习中,包括商品购物计算、数学运算、财务统计等场景。
(完整)基于51单片机的简易计算器设计基于51单片机的简易计算器设计计算器作为一种常见的电子设备,既能满足日常生活的计算需求,又能帮助人们提高工作效率。
本文将介绍基于51单片机的简易计算器的设计。
该计算器具备加减乘除的基本计算功能,并支持用户输入和结果显示。
下面将从材料准备、电路连接和程序设计三个方面详细介绍该计算器的设计。
一、材料准备在设计计算器之前,我们需要准备以下材料:1. 51单片机开发板:用于控制计算器的整个运行过程;2. 液晶显示屏:用于显示用户输入的数字和计算结果;3. 数字按键:用于用户输入数字和运算符;4. 连接线:用于连接51单片机开发板、液晶显示屏和数字按键。
二、电路连接1. 连接液晶显示屏和51单片机开发板:将液晶显示屏的VCC、GND、SCL和SDA引脚分别与开发板上对应的引脚连接。
2. 连接数字按键和51单片机开发板:将数字按键的引脚依次与开发板上的IO口引脚连接,其中有一根引脚需要连接到开发板的中断口。
三、程序设计1. 初始化设置:在程序开始时,进行液晶显示屏和数字按键的引脚初始化设置,以及相应的中断设置。
2. 输入处理:通过数字按键输入,获取用户输入的数字和运算符,并将其保存到相应的变量中。
3. 运算处理:根据用户输入的运算符,对相应的数字进行加、减、乘、除的运算,并将结果保存到一个变量中。
4. 结果显示:将运算结果显示在液晶显示屏上,以便用户查看计算结果。
5. 重置处理:在每次运算结束后,对相关变量进行重置,以便下一次计算。
通过以上程序设计,我们可以完成基于51单片机的简易计算器的设计。
在实际使用过程中,用户只需要通过数字按键输入相应的数字和运算符,计算器就可以自动进行运算,并将结果显示在液晶显示屏上,方便用户进行查看。
总结本文介绍了基于51单片机的简易计算器的设计。
通过合理的材料准备、电路连接和程序设计,我们可以实现一个具备加减乘除功能的计算器。
该计算器不仅能满足人们日常的计算需求,还能帮助提高工作效率。
基于51单片机的简易计算器设计设计一个基于51单片机的简易计算器,主要功能包括加减乘除四则运算和百分数计算。
下面是设计的详细步骤:1.硬件设计:-使用51单片机作为主控芯片。
-连接16x2的LCD显示屏,用于显示输入和计算结果。
-连接16个按键开关,用于输入运算符和数字。
-连接4个LED灯,用于指示四则运算的选择。
2.软件设计:-初始化LCD显示屏,并显示欢迎信息。
-监听按键输入,在接收到输入后,根据输入的按键值判断操作类型。
-如果按键值对应数字键,保存输入的数字,并在LCD上显示当前输入的数字。
-如果按键值对应四则运算符(+、-、*、/),保存当前输入的数字,并保存运算符。
-如果按键值对应等号(=),根据保存的数字和运算符进行相应的运算,计算结果保存并显示在LCD上。
-如果按键值对应清零(C),将所有保存的数据清空,并显示初始状态。
-如果按键值对应百分号(%),将当前数字除以100并显示在LCD上。
3.主要函数说明:- void init_lcd(:初始化LCD显示屏。
- void display_lcd(char* str):将指定字符串显示在LCD上。
- void clear_lcd(:清空LCD显示屏。
- char get_key(:获取按键输入的值。
- void calculate(:根据保存的数字和运算符进行计算。
- void add_digit(char digit):将输入的数字添加到当前数字中。
- void set_operator(char op):保存运算符。
- void clear_data(:清空所有保存的数据。
4.主要流程:-初始化LCD显示屏并显示欢迎信息。
-在循环中监听按键输入,并根据输入的按键值进行相应的操作。
-根据不同的按键值,调用不同的函数进行处理。
-最后计算结果显示在LCD上。
以上是基于51单片机的简易计算器设计的详细步骤和主要函数说明。
你可以根据这个设计框架进行具体的代码实现。
51单片机简易计算器设计一、引言计算器是一种通过输入和输出数字信号进行数学运算的电子设备。
在现代社会,人们对计算器有着广泛的需求,因此设计一款简单而实用的计算器对于我们理解计算器的工作原理和学习单片机编程非常有帮助。
本文将介绍一种基于51单片机的简易计算器设计,涵盖了相关的硬件设计和软件编程。
二、设计思路本计算器设计的主要思路如下:1.使用数码管显示输入的数字和计算结果。
2.使用按键输入数字和操作符。
3.通过软件编程实现数字的输入、运算和结果的显示。
三、硬件设计1.数码管:使用4位共阴数码管,通过BCD-7段译码器将数字信号转化为数码管显示。
2.按键:使用独立按键输入数字和操作符。
3.电源:使用适当的电源电路提供电压和电流。
四、软件设计1.初始化:设置数码管显示方式、按键输入方式和端口状态。
2.输入数字:通过按键输入数字,并将数字显示在数码管上。
可以采用按键扫描的方式实现,每次按键触发时读取按键值,并将对应的数字显示在数码管上。
3.输入操作符:通过按键输入操作符,并将操作符显示在数码管上。
同样采用按键扫描的方式实现。
4.数字运算:根据输入的操作符和数字进行相应的运算,得出结果。
5.显示结果:将运算结果显示在数码管上。
五、程序流程图具体的程序流程图如下:六、程序实现以下是51单片机计算器的简单代码实现:```C#include<reg51.h>sbit LED=P1^0;sbit KEY=P3^0;void delay(int n)int i=0, j=0;for(i=0; i<n; i++)for(j=0; j<123; j++);void mainwhile(1)if(KEY==0)LED=0;elseLED=1;delay(10);}```七、测试和结果在硬件设计完成并烧录完程序后,我们可以进行测试。
通过按下按键,观察数码管是否正确显示输入的数字和运算结果。
如果显示正确,则说明程序设计成功。
基于51单片机的简易计算器设计一、引言计算器是一种执行基本数学运算的电子设备,现在市面上有各种类型的计算器,从小型的手持计算器到大型的科学计算器。
本设计基于51单片机设计了一种简易计算器,可以实现加法、减法、乘法和除法等基本运算。
二、设计思路1.系统硬件设计本设计使用的51单片机芯片选择了常用的STC89C52芯片,具有强大的功能和稳定性。
外设有键盘、数码管和LCD液晶显示屏。
2.系统软件设计系统的软件设计基于C语言进行,使用51单片机的汇编语言和C语言进行编程。
软件主要分为键盘输入处理、运算处理和结果显示三个部分。
三、系统硬件设计1.键盘输入部分使用4x4矩阵键盘作为输入设备,将键盘的4行4列分别接入到51单片机的4个IO口上,通过行列扫描的方式来检测按键的状态。
2.数码管显示部分使用共阳极的数码管来显示结果,通过提供适当的电压和信号控制来显示所需的数字。
3.LCD液晶显示屏为了方便用户查看输入和结果,本设计还使用了LCD液晶显示屏。
通过串口通信将结果传输到液晶显示屏上进行显示。
四、系统软件设计1.键盘输入处理通过行列扫描的方式检测键盘的按键状态,当检测到按键按下时,将对应的按键值存储起来。
2.运算处理根据用户的输入进行相应的运算处理。
根据检测到的按键值进行不同的运算操作,如加法、减法、乘法和除法。
3.结果显示将运算的结果通过串口通信传输到LCD液晶显示屏上进行显示。
五、系统实现1.硬件连接将键盘的行列引脚接到51单片机的对应IO口上,数码管和LCD液晶显示屏也分别连接到单片机的IO口上。
2.软件编码通过C语言编写系统软件,包括键盘输入处理、运算处理和结果显示三个模块。
3.调试测试将编写好的软件烧录到单片机上,通过键盘输入进行测试,并观察数码管和LCD液晶显示屏上的输出结果。
六、总结本设计基于51单片机实现了一个简易计算器,通过键盘输入进行基本的运算操作,并将结果通过数码管和LCD液晶显示屏进行显示。
基于51单片机的简易计算器制作专业:电气信息班级:11级电类一班姓名:王康胡松勇时间:2012年7月12日一:设计任务本系统选用AT89C52单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计,具体设计如下:(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LED 显示数据和结果。
(2)采用键盘输入方式,键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键(on\c)和等号键(=),故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)在执行过程中,开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LED上提示八个0;当除数为0时,计算器会在LED上会提示八个负号。
设计要求:分别对键盘输入检测模块;LED显示模块;算术运算模块;错误处理及提示模块进行设计,并用Visio画系统方框图,keil与protues仿真分析其设计结果。
二.硬件设计单片机最小系统CPU:A T89C52显示模块:两个4位7段共阴极数码管输入模块:4*4矩阵键盘1.电路图电路图说明本电路图采用AT89C52作为中处理器,以4*4矩阵键盘扫描输入,用两个74HC573(锁存器)控制分别控制数码管的位于段,并以动态显示的方式显示键盘输入结果及运算结果。
为编程方便,以一个一位共阴极数码管显示负号。
三,程序设计#include<reg52.h>#define Lint long int#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //锁存器段选sbit wela=P2^7;sbit display_g=P2^0; //负号段选sbit display_w=P2^1; //负号位选uchar code table[]={0x3f,0x06,0x5b,0x4f,//0,1,2,30x66,0x6d,0x7d,0x07,//4,5,6,70x7f,0x6f,//0x77,0x7c, //8,9//0x39,0x5e,0x79,0x71}; //数码管段码表uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管位码表/****************定义全局变量*******************/Lint store[2]={0}; //存取按键值和结果的数组uchar flag_op=0; //+,-,*,/操作符标志符uchar flag_order=0; //输入数的顺序标志符uchar flag_equal=0; //等于号标志符uchar key=16; //按键值/*****************延时函数*********************/void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}/****************显示函数*********************/void display(Lint temp){uint buf1,buf2,i=0;buf1=temp/10000000;if(buf1>=10||temp<-9999999) //数据溢出,显示错误00000000{display_w=1; //关负号位选dula=1;P0=0x3f;dula=0;P0=0xff;wela=1;P0=0x00;wela=0;delay(1);}else if(temp<0&&temp>=-99999999) //显示负数{display_w=0; //开负号位选temp=-temp;do{buf2=temp%10;dula=1;P0=table[buf2];dula=0;P0=0xff;wela=1;P0=table1[i];wela=0;i++;P0=0x00;temp=temp/10;delay(1);}while(temp!=0);}else{display_w=1; //关负号位选do{dula=1;buf2=temp%10;P0=table[buf2];dula=0;P0=0xff;wela=1;P0=table1[i];wela=0;i++;P0=0x00;temp=temp/10;delay(1);}while(temp!=0);}}/******************键盘扫描函数******************/ uchar KeyScan(){uchar temp;P3=0xfe; //扫描第一行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){switch(temp){case 0xe0:key=0;break;case 0xd0:key=1;break;case 0xb0:key=2;break;case 0x70:key=3;break;}while(temp!=0xf0) //等待按键被释放{temp=P3;temp=temp&0xf0;}}}P3=0xfd; //扫描第二行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){switch(temp){case 0xe0:key=4;break;case 0xd0:key=5;break;case 0xb0:key=6;break;case 0x70:key=7;break;}while(temp!=0xf0) //等待按键释放{temp=P3;temp=temp&0xf0;}}}P3=0xfb; //扫描第二行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){switch(temp){case 0xe0:key=8;break;case 0xd0:key=9;break;case 0xb0:key=10;flag_order=1;flag_op=1;break; //+case 0x70:key=11;flag_order=1;flag_op=2;break; //- }while(temp!=0xf0) //等待按键释放{temp=P3;temp=temp&0xf0;}}}P3=0xf7; //扫描第四行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){switch(temp){case 0xe0:key=12;flag_order=1;flag_op=3;break; //*case 0xd0:key=13;flag_order=1;flag_op=4;break; ///case 0xb0:key=14;break;case 0x70:key=15;flag_equal=1;break; //= }while(temp!=0xf0) //等待按键释放{temp=P3;temp=temp&0xf0;}}}return key;}/***************运算函数*********************/void YunSuan(){if(flag_equal==1){switch(flag_op){case 1: //加法运算store[0]=store[0]+store[1];flag_op=0;flag_order=0;store[1]=0; //输入的第二个数清零break;case 2: //减法运算store[0]=store[0]-store[1];flag_op=0;flag_order=0;store[1]=0; //输入的第二个数清零break;case 3: //乘法运算store[0]=store[0]*store[1];flag_op=0;flag_order=0;store[1]=0; //输入的第二个数清零break;case 4: //除法运算store[0]=store[0]/store[1]; //计算结果,存入第一个数flag_op=0; //操作符清零flag_order=0; //输入顺序标识符清零,显示结果store[1]=0; //输入的第二个数清零break;}flag_equal=0;}}/*****************主函数*****************/void main(){while(1){display_g=1; //开负号段选key=KeyScan(); //键盘扫描if(key>=0&&key<=9) //如果key在0到9之间,证明键盘按下的是数值{if(store[flag_order]<10000000){store[flag_order]=store[flag_order]*10+key;}key=16;}if(key==14) //如果key为14时,证明键盘按下的是CE键{display_w=1;store[0]=0; //数据清零store[1]=0;flag_op=0;flag_order=0;flag_equal=0;key=16;}YunSuan();display(store[flag_order]);}}。