目前实现功能:

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();}}}

C51简易计算器微机课设相关推荐

  1. 【微机课设分享】基于8086和LCD12864液晶显示仿真设计-基于8086直流电机调速控制系统设计-基于8086计数器仿真系统设计-基于8086计算器系统仿真设计-基于8086家具房间灯光控制设计

    1184基于8086和LCD12864液晶显示仿真设计-设计全套资料 本设计完整的实现基于8086红外报警仿真设计,protues仿真中, 红外传感用按键模拟(红外原理也是通过高低电平来检测感知的), ...

  2. 基于8086的波形发生器(汇编语言微机课设)

    目录 一.设计要求 二.设计方案及功能 三.元器件清单 四.原理图 五.代码 一.设计要求 采用8086/8088控制器和8位数/模转换芯片DAC0832设计实现波形发生器,编写软件程序. 基本要求: ...

  3. java简单计算器课程设计_java仿windows简易计算器课程设计 源码+报告

    [实例简介] java仿windows简易计算器课程设计 源码+报告 课直接运行. [实例截图] [核心代码] Java课设-简易计算器 └── Java课设-简易计算器 ├── Java课程设计.d ...

  4. 合肥工业大学宣城校区2018年-2019年第一学期(大三上学期)物联网工程专业资料汇总(含课件、个人实验报告、实验代码、课设报告等)

    我已经把所有文件都上传到GitHub."CSDN下载"和百度网盘(提取码:8r4r )上了,可以自行下载.包含的课程有:<模拟电路课程设计(含EDA)>.<硬件工 ...

  5. Java课设-百行代码实现简易计算器

    成绩: __________ Java程序设计 工程实践 --简易计算器的设计 院. 系 计算机与软件学院 专业 信息安全 姓 名 指导教师 2022年 6 月 11 日 目录: 一. 设计简介 2 ...

  6. 微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...

    PianoMFC 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文 ...

  7. C++课设 简易图像处理系统

    目录 前言 一.总体设计 1.1 主要功能 1.2 UML类图 二.代码实现 2.1 父类method 2.2 子类线性增强算法 2.3 gamma校正 2.4 管理类Manage.h 2.5 选择图 ...

  8. 计算机微机原理心得体会,微机原理课设体会心得体会

    微机原理课程设计心得体会 实得这学期通过对微机原理和微机实验学习,对微机系统和它的工作原理有了的了解. 微机实验课,总共做了十几个实验,回想起来受益匪浅,主要是加深了对计算机的一些硬件情况和运行原理的 ...

  9. 【C51单片机】简易计算器设计(仿真)

    1.功能描述 设计一个简易计算器,模拟常见计算器的加减乘除运算功能,通过1602液晶屏来显示数字.4*4的矩阵按键来模拟计算机的按键, 2.PROTEUS中设计的电路图 3.源代码 #include ...

最新文章

  1. 坑你没商量!盘点Java中最常见的事故现场,你都中过哪些招?
  2. MariaDB Spider:实现MySQL横纵向扩展的小能手
  3. 第3章:分布式文件系统 HDFS
  4. vc6.o--fatal error C1010错误的解决
  5. 零拷贝机制在文件传输中的使用手法
  6. REVERSE-PRACTICE-BUUCTF-25
  7. WinForm 中 comboBox控件之数据绑定
  8. 广州软件性能测试培训,Loadrunner企业级性能测试课程 广州八神软件性能测试实战教程 炼数性能测试视频...
  9. 海康监控摄像头能做视频直播那些事!
  10. 缺失.NET Framework组件的解决方法
  11. 产品经理的简历怎么写?
  12. 06 第五章 一阶逻辑等值演算与推理
  13. 木马可以损坏计算机硬件么,台式电脑总是自动重启怎么处理
  14. Google Chrome显示粉红色屏幕
  15. Javascript代码优化的8个知识点 1
  16. 《微信小程序开发实战》学习笔记chapter1微信小程序人门
  17. Getfasta--根据Acession Number(Ac号)批量下载GenBank分子序列数据的自动化程序
  18. GeneXus的科技基础(GeneXus背后的理论)
  19. 网上下载别人的vue项目如何运行在本地
  20. 自动驾驶系统入门(八)- 自动驾驶仿真技术

热门文章

  1. 服务器维护 志愿填报时间顺延,因系统维护 西藏高考志愿填报截止时间顺延两日...
  2. [全流程案例]壮汉:2. 添加装饰物(Blender)
  3. 计算机主机房临时停电应急预案,校园网中心机房停电应急预案管理规定
  4. 距离差分矩阵DDM算法
  5. 计算机专业英语BD,计算机专业英语
  6. 微视频试水社交网站 渐趋移动互联应用
  7. bzoj2683:简单题(树状数组套CDQ分分治)
  8. ubuntu向日葵和Todesk连接不了的桌面管理环境问题
  9. oracle ora 39111,数据迁移 有几个用户 imp导入时候 报错 ORA-39111,ORA-39112 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  10. 【一头扎进JMS】(4)----RabbitMQ概述