C51简易计算器微机课设

news/2024/11/24 8:39:49/

目前实现功能:

1.末尾数置0

2.加减乘的五位数计算

3.计算结果溢出时,报错“ERROR”

4.有删除键

 

#include <REGX52.H>
int digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9数字数码管的段选
int zero[]={0xff,0xc0};//0xff即数码管全灭,用作末位置0
unsigned long box[5]={0};//计算器的个十百千万位
int i;
unsigned int KeyValue;       //用于定义16个按键
unsigned int KeySwitch;      //用于判断按下的是数字还是符号
int w; w=0;         //用于判断计算器是否该置0
//延时函数
void delay(int ms)    
{int x,y;for(x= ms;x>0;x--)for(y=110;y>0;y--);
}
//显示函数void display()   { if (w==0)      //w初值赋为0,只有检测到有按键被按下时才为1{P2=0x01;       //将前四位全灭,第五位亮0P0=zero[0];delay(10);P2=0x02;			P0=zero[0];delay(10);		P2=0x04;P0=zero[0];delay(10);P2=0x08;P0=zero[0];delay(10);P2=0x10;P0=zero[1];delay(10);}//当有按键被按下后,w赋为1,开始显示box列表里的值,box列表中五个值初值都置0,通过按下数字0~9来往里赋值if (w!=0){P2=0x01;           //万位P0=digit[box[4]];       delay(10);	  P2=0x02;           //千位P0=digit[box[3]];       delay(10);P2=0x04;          //百位P0=digit[box[2]];       delay(10);P2=0x08;         //十位P0=digit[box[1]];delay(10);P2=0x10;        //个位P0=digit[box[0]];delay(10); }}
//按键函数void KeyDown(void){  int n;n=0;	 P3=0x0f;          //定义好初值if(P3!=0x0f)      //检测是否有按键被按下,查找到被按下的键,并给w赋为1{delay(20);if(P3!=0x0f){  P3=0x0f;    //先检测列switch(P3){case(0X07): KeyValue=0;w=1;break;///将十六个键与keycalue联系起来,通过case(0X0b): KeyValue=1;w=1;break;///keyvalue来定义每个键的意义case(0X0d): KeyValue=2;w=1;break;case(0X0e): KeyValue=3;w=1;break;}P3=0xf0;///检测行switch(P3){case(0Xe0): KeyValue=KeyValue;w=1;break;case(0Xd0): KeyValue=KeyValue+4;w=1;break;case(0Xb0): KeyValue=KeyValue+8;w=1;break;case(0X70): KeyValue=KeyValue+12;w=1;break;}if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9){KeySwitch=1;//用keyswitch来区分数字和符号,数字0-9时为状态1}while((n<50)&&(P3!=0xF0)) //检测按键是否松开{delay(100);n++;}}}}
//主函数
void main(){ unsigned long a,b,c;while(1){display(); //调用显示函数和按键函数                  KeyDown();if(KeySwitch==1)  //如果被按下的是数字键,往box里赋值{                                 for(i=4;i>0;i--)              {box[i]=box[i-1];}             //多个数字被按下时前面的数字左移box[0]=KeyValue;                            KeySwitch=0;       //结束时将keyswitch置0                          }
//回删减if(KeyValue==15)   //按下删除键,显示屏最后一位数字被删除,其他数字依次右移一位  { for(i=0;i<4;i++)      {box[i]=box[i+1];}           //之前box里储存的数字依次取代右一位box[4]=0;                    //全部取代完后,首个数字置0KeyValue=16;     //随便将KeyValue赋个新值,不然主程序一直运行进来将所有数置0}		
//清0键if(KeyValue==10)  //计算器清零键,box里所有储存的值清0,并且w置0,计算器末位为0     { for(i=0;i<5;i++)box[i]=0;             w=0;display(); }
//加法else if(KeyValue==12)   {a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;//个十百千万存储到a   delay(10);for(i=0;i<5;i++)box[i]=0;                 //清空box,以便后续存储加数while(1)                                  {display();KeyDown();                    if(KeySwitch==1)    //输入加数{  for(i=4;i>0;i--){box[i]=box[i-1];}box[0]=KeyValue;KeySwitch=0;}//当按下加法键以后,程序进入加法死循环中,不按等号出不去,想用删除就要重新把删除段代码添加进来,减法,除法一样。 if(KeyValue==15) { for(i=0;i<4;i++){box[i]=box[i+1];}box[4]=0;KeyValue=16;}if(KeyValue==11) break; }b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000; //加数存储到b delay(10);c=a+b;                       //被加数与加数相加box[0]=c%10;                   //结果取余计算,返回到box中,个位数直接除10取余box[1]=c/10%10;                //十位先除十,再除十取余box[2]=c/100%10;box[3]=c/1000%10;box[4]=c/10000%10;delay(10);display();           //显示结果    后续减法乘法除法过程雷同}//减法else  if(KeyValue==13)      {a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;for(i=0;i<5;i++)box[i]=0;delay(100);while(1){                                    display();KeyDown();if(KeySwitch==1){  for(i=4;i>0;i--){box[i]=box[i-1];}box[0]=KeyValue;KeySwitch=0;}if(KeyValue==15)     { for(i=0;i<4;i++){box[i]=box[i+1];}box[4]=0;KeyValue=16;}if(KeyValue==11) break;}b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;  delay(100);c=a-b;box[0]=c%10;                 box[1]=c/10%10;box[2]=c/100%10;box[3]=c/1000%10;box[4]=c/10000%10;delay(100);display();}//乘法else   if(KeyValue==14)       {a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;for(i=0;i<5;i++)box[i]=0;delay(100); while(1){                                     display();KeyDown();if(KeySwitch==1){  for(i=4;i>0;i--){box[i]=box[i-1];}box[0]=KeyValue;KeySwitch=0;}if(KeyValue==15)     { for(i=0;i<4;i++){box[i]=box[i+1];}box[4]=0;KeyValue=16;}if(KeyValue==11) break;}b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;delay(100);   c=a*b;box[0]=c%10;                 box[1]=c/10%10;box[2]=c/100%10;box[3]=c/1000%10;box[4]=c/10000%10;delay(100);display();}}}


http://www.ppmy.cn/news/297579.html

相关文章

台式计算机功率一般多少瓦,台式电脑功率一般多大 台式机功率有多少【详细介绍】...

摘要&#xff1a;台式电脑现在在很多家庭都备有一台的&#xff0c;而很多人在使用台式电脑的时候&#xff0c;我想大家都很关心台式电脑功率多少的问题&#xff0c;那么台式电脑功率一般有多大呢?本文一起来看看。 【台式电脑功率】台式电脑功率一般多大 台式机功率有多大 台式…

【Flutter】如何更改 Flutter 应用的启动图标

文章目录 一、前言二、什么是启动图标三、为什么我们需要更改启动图标四、如何更改启动图标五、注意事项六、总结 一、前言 欢迎来到 Flutter 的世界&#xff01;在这篇文章中&#xff0c;我们将探索 Flutter 的一些基础知识。但是&#xff0c;你知道吗&#xff1f;这只是冰山…

C++经典程序训练3---模拟计算器

题目描述 简单计算器模拟&#xff1a;输入两个整数和一个运算符&#xff0c;输出运算结果&#xff1b; 输入 第一行输入两个整数&#xff1b; 第二行输入一个运算符&#xff08;、-、*、/); 输出 输出对两个数运算后的结果&#xff1b; 样例输入 30 50 * 样例输出 1500…

C语言初学者--制作简易计算器(+-*/四种运算)

运行结果 #include<stdio.h> int main() { float a, b; char c; printf("请输入两个数:"); scanf_s("%f%f", &a, &b); printf("请输入一个符号:"); getchar(); c getchar(); if (c ) printf(&q…

C语言 模拟计算器实现

#include <stdio.h> #include <windows.h> void main(){float x,y;char op;while(1){printf("\n");printf("请输入x运算符y:\n");scanf("%f%c%f",&x,&op,&y);switch(op){case :printf("%g%g%g",x,y,xy);break…

分析整装台式机是否物有所值

分析整装台式机是否物有所值 前言 今天我爸给了我一张配置图&#xff0c;我就拿之前了解过的经验分析一下。 《 2020年10月份电脑选购计划》、《 2020台式机选购计划》、《台式机与笔记本的最终选择方案》 我首先看这个配置的价格十分恰当。 然后结合之前的经验分析原因。…

简单C程序的编写4:模拟简单计算器

编写一个程序&#xff0c;模拟具有加、减、乘、除4种功能的简单计算器&#xff1a; #include<stdio.h> calculator(int m,char n,int o) {float d;if(n){dmo;printf("%f\n",d);} if(n-){dm-o;printf("%f\n",d);} if(n*){dm*o;printf("%f\n&quo…

C语言实现控制台简易计算器(VC6.0可用)

一、项目介绍 C语言版简易计算器&#xff0c;包含几个小功能&#xff0c;包括基本运算、进制转换、一元二次方程&#xff0c;支持返回操作&#xff0c;整体源码比较精简&#xff0c;代码逻辑简单&#xff0c;扩展性强&#xff0c;非常适合新手了解和学习的小项目。 二、运行截…