题目要求:

1、根据开发板设计10以内的加法计算器,用LED数码管显示数字和计算结果。(必做)。

2、根据开发板设计100以内的计算器,用LED数码管显示数字和计算结果,要求可实现加法、减法、乘法和除法的整型运算(选作)。

备注:做了第2题可不做第1题

选做第2题.功能实现如附件视频所示。

/*根据题目要求,设计计算器,51单片机矩阵按键的S4,S8,S12,S16分别代表着+,-,*,/;而S13键表示为清零;S1,S2,S3代表着1,2,3;S5,S6,S7代表着4,5,6;S9,S10,S11代表着7,8,9。如下排列所示:

1    2    3    +

4  5    6    -

7    8    9    *

清零 0    =    /

*/

#include<reg51.h>
typedef unsigned char u8;         //对数据类型进行声明定义
typedef unsigned int u16;sbit LSA=P2^2;  //74HC138译码器数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;#define GPIO_KEY P1
#define GPIO_DIG P0u16 KeyValue;        //用来存放读取到的键值
u16 keyflag,i;       //用来判断按下的数字还是运算符或清空键
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};  //显示0~F、负号‘-’u16 wei[8]={0};    //用来存放每一位数码管数字的数组void delay(u16 i)//延时函数
{  while(i--);
}void display()    //扫描显示动态数码管
{    LSA=0; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[7]];delay(50); GPIO_DIG=0x00; //消隐LSA=1; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[6]];delay(50); GPIO_DIG=0x00;LSA=0; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[5]];delay(50); GPIO_DIG=0x00; LSA=1; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[4]];delay(50); GPIO_DIG=0x00;
}
/*
1    2    3    +
4    5    6    -
7    8    9    *
清零 0    =    /
*/void KeyDown(void)//检测有按键按下并读取键值
{u16 a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(1000);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{   //测试列GPIO_KEY=0x0f;switch(GPIO_KEY)//行列扫描法{case(0X07): KeyValue=1;break;case(0X0b): KeyValue=2;break;case(0X0d): KeyValue=3;break;case(0X0e): KeyValue=13;break;}//测试行GPIO_KEY=0xf0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+3;break;case(0Xd0): KeyValue=KeyValue+6;break;case(0Xe0): KeyValue=KeyValue+9;break;}if(KeyValue==11){KeyValue=0;}if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9){keyflag=1;}while((a<50)&&(GPIO_KEY!=0xf0))  //检测按键松手检测{delay(1000);a++;}}}
}
void main()
{  u16 a=0,b=0,c=0;while(1){    display();                     /* 第一个数字输入*/KeyDown();               if(keyflag==1)  {                                 //输入一位,数字向左移动一位     for(i = 4; i <7;i++){wei[i]=wei[i+1];}  wei[7] = KeyValue;                      keyflag=0;                                  }else if(KeyValue==10){for(i=0;i<8;i++)wei[i]=0;              //对数码管清零display(); }else if(KeyValue==13)//加法运算      {a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值for(i=0;i<8;i++)wei[i]=0;while(1)                               //输入第二个数{display();KeyDown();if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入if(keyflag==1){  for(i = 4; i <7;i++){wei[i]=wei[i+1];}  wei[7] = KeyValue;                      keyflag=0;}}b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值c=a+b;wei[0]=c/10000000%10;               //计算C的各个位的数字wei[1]=c/1000000%10;wei[2]=c/100000%10;wei[3]=c/10000%10;wei[4]=c/1000%10;wei[5]=c/100%10;wei[6]=c/10%10;wei[7]=c%10;display();}else if(KeyValue==16)//减法运算      {a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值for(i=0;i<8;i++)wei[i]=0;while(1)                                //输入第二个数{display();KeyDown();if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入if(keyflag==1){  for(i = 4; i <7;i++){wei[i]=wei[i+1];}  wei[7] = KeyValue;                      keyflag=0;}}b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值c=a-b;wei[0]=c/10000000%10;               //计算C的各个位的数字wei[1]=c/1000000%10;wei[2]=c/100000%10;wei[3]=c/10000%10;wei[4]=c/1000%10;wei[5]=c/100%10;wei[6]=c/10%10;wei[7]=c%10;display();}else if(KeyValue==19)//乘法运算      {a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值for(i=0;i<8;i++)wei[i]=0;while(1)                                //输入第二个数{display();KeyDown();if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入if(keyflag==1){  for(i = 4; i <7;i++){wei[i]=wei[i+1];}  wei[7] = KeyValue;                      keyflag=0;}}b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值c=a*b;wei[0]=c/10000000%10;               //计算C的各个位的数字wei[1]=c/1000000%10;wei[2]=c/100000%10;wei[3]=c/10000%10;wei[4]=c/1000%10;wei[5]=c/100%10;wei[6]=c/10%10;wei[7]=c%10;display();}else if(KeyValue==21)//除法运算      {a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值for(i=0;i<8;i++)wei[i]=0;while(1)                                //输入第二个数{display();KeyDown();if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入if(keyflag==1){  for(i = 4; i <7;i++){wei[i]=wei[i+1];}  wei[7] = KeyValue;                      keyflag=0;}}b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值c=a/b;wei[0]=c/10000000%10;               //计算C的各个位的数字wei[1]=c/1000000%10;wei[2]=c/100000%10;wei[3]=c/10000%10;wei[4]=c/1000%10;wei[5]=c/100%10;wei[6]=c/10%10;wei[7]=c%10;display();}}
}

基于51单片机实现计算器功能相关推荐

  1. 用计算机设计电路图,基于51单片机的计算器设计(含电路图,程序)

    基于51单片机的计算器设计(含电路图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文11200字,程序,答辩PPT) 摘 要 计算器一般是指"电子计算器",能进行 ...

  2. 基于51单片机的多功能智能语音循迹避障小车

    目录 一.功能介绍及硬件准备 二.电机控制及调速 三.小车循迹方案 四.跟随功能实现 五.测速功能实现 六.OLED显示车速 七.摇头避障功能实现 八.SU-03T语音模块介绍 九.语音切换小车模式+ ...

  3. 基于51单片机的多功能八路抢答器

    1.功能介绍 多功能八路抢答器是基于51单片机来设计的,除了可以实现最基本功能--8路抢答外,还具有自动处理犯规选手,抢答时间调整,还可以进行答题,计分,并且可以查询或修改分数. 2.硬件设计 该抢答 ...

  4. 基于51单片机的计算器设计

    能做计算器的单片机 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子.科技.通信.汽车.工业等.本次设计是设计一个简易计算器,能够进 ...

  5. 基于51单片机实现红绿灯功能

    设计目标: 1.东西方向.南北方向均有红.黄.绿三种信号灯,初始红灯30秒,黄灯闪烁3秒,绿灯30秒,东西方向红灯时刻,南北方向绿灯,南北方向绿灯,东西方向红灯. 2.按键调节与控制功能,通过按键,可 ...

  6. 基于51单片机的多功能洗碗机(Protues仿真)

    本项目是以AT89C51最小系统为核心,外接DS18B20温度传感器.OVEN加热棒.LCD1604显示屏.ADC0832模数转换器模拟浊度传感器.L298和MOTOR当电机模块.电机模块用于模拟洗碗 ...

  7. 基于51单片机的多功能视力保护台灯

    目录 摘要. 1 1弓I言 1 1.1 选 题 背 景 1 2 视力保护器的现状 2 1.3 本文主要研究内容 3 2系统硬件 设计 3 1 89c52 单片机简介 4 2.2 超声波测距报警 电路 ...

  8. 基于51单片机的计算器 汇编语言 proteus仿真 数码管显示

    之前讲的计算器都是基于C语言的,接下来讲一下基于汇编语言的简易计算器. 硬件设计 显示器仍然是数码管,MCU是C51,支持整数部分的计算 仿真图: 程序设计 YJ EQU 50H ;结果存放 YJ1 ...

  9. 基于51单片机的计算器

    继续写一下寒假做的51小项目,这一次是基于AT89C51的计算器,带一个八位密码锁功能. 具体实现了计算器的加减乘除功能,并且自带八位密码锁,输入密码后按"="确定,错误输入三次密 ...

最新文章

  1. 使用Bash编写Linux Shell脚本-7.复合命令
  2. 高仿真的类-页面交互
  3. Android中实现APP文本内容的分享发送与接收方法简述
  4. (10)Node.js核心模块—fs文件系统之目录操作
  5. drawOval(int x,int y,int width,int height)函数
  6. 工业用Linux版本,工业主板支持哪些版本的LINUX系统?
  7. 一下删除MSSQL表所有的数据,但不删除表结构
  8. drbd mysql mha_浅谈秒级故障切换!用MHA轻松实现MySQL高可用(三)
  9. 轻松几步完成cisco交换机配置全是干货!
  10. 信息论——信源信息量和信息熵
  11. Android系统源码编译
  12. 如何用c语言插入(背景)音乐
  13. 有这5类人最难成为银行的优质客户!
  14. C程序-超简单的猜数字-游戏
  15. 在virtualbox中导入.vmdk文件
  16. 用计算机实现的动画效果,运用PPT编辑动画效果
  17. Java File相关源码分析:File、FileInputStream、InputStreamReader
  18. 开发移动应用的7个致命错误
  19. Linux内核源代码下载
  20. python星号和双星号的区别

热门文章

  1. iframe标签有什么用
  2. 系统分析实验 Python
  3. 【统计学习方法】统计学习及监督学习概论
  4. Linux编译x86架构内核出现_stack_chk_guard未定义错误
  5. 一个APP诞生的自述日记,APP开发流程
  6. 做中国的Salesforce,神州云动凭的是什么?
  7. git第一次提交不能使用git commit -a -m
  8. 基于Nginx以及web服务器搭建在线视频播放
  9. Codeforces--896A--The Artful Expedient
  10. 查看USB设备序列号的一些方法