筒子们,上周参考了好多单片机计算器的文章,但是全文阅读基本都是付费,看了好几篇;参考了某个思路,终于完成了一个简易版的计算器;
1.8位数码管显示
2.简单的四则运算(加减乘除)
3.PS,以下代码目前还不具备累计功能,后续待完善;
数据移位那里是否可以利用指针,简化代码,还有待完善,有知道的大神们,也可以留言分享哦~

8位数码管简易计算器代码如下

#include <reg52.h>
#include "math.h"
typedef unsigned int u16;
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
long m,l;
long t;
char a, j;
u8 b[8];
char n=0, fuhao;
char bj=0, xs, xsbj, xsb=0, x,xa;
char Equal_Set = 0;u8 KeyValue;
u8 DisplayData[8];u8 data smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//显示0~F的值
u8 data smgxiaoshu[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void delay(u16 i)
{while(i--);
}void KeyDown(void)
{char c=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(1000);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{ //测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((c<50)&&(GPIO_KEY!=0xf0))  {delay(1000);c++;}switch(KeyValue){case 0: a=7;break;case 1: a=8;break;case 2: a=9;break;case 3: a=-1;break;case 4: a=4;break;case 5: a=5;break;case 6: a=6;break;case 7: a=-2;break;case 8: a=1;break;case 9: a=2;break;case 10: a=3;break;case 11: a=-3;break;case 12: a=-4;break;case 13: a=0;break;case 14: a=-5;break;case 15: a=-6;break;}if(a>=0){n++;}/*if(a<0&&a!=-5&&a!=-4)*/if(a<0&&a!=-5){n=0;}if(a == -4){n = 0;m = 0;l = 0;}}}
}
//以上这个函数判断哪个键按下,并将计算器的0~9,四则运算符号等赋值定义到4*4矩阵键盘;void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i)  {case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3):LSA=0;LSB=0;LSC=1; break;//显示第3位case(4):LSA=1;LSB=1;LSC=0; break;//显示第4位case(5):LSA=0;LSB=1;LSC=0; break;//显示第5位case(6):LSA=1;LSB=0;LSC=0; break;//显示第6位case(7):LSA=0;LSB=0;LSC=0; break;//显示第7位   }P0=DisplayData[i];delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}
//以上函数利用138译码器进行位选void shuruzhi()
{static int i = 0;if(n==0){b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;b[6]=0;b[7]=0;b[0]=0;}switch(n){ case 0:DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;i=0; break;case 1:if(i==0){b[0]=a;DisplayData[0]=smgduan[a]; DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;i++;x=1;}break;case 2:if(i==1){b[1]=b[0];b[0]=a;DisplayData[1]=DisplayData[0];DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=2;}break;case 3:if(i==2){ b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=3;}break;case 4:if(i==3){b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=4;}break;case 5:if(i==4){b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=5;}break;case 6:if(i==5){b[5]=b[4];b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=6;}break;case 7:if(i==6){b[6]=b[5]; b[5]=b[4];b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[6]=DisplayData[5];DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=7;}break;case 8:if(i==7){b[7]=b[6];b[6]=b[5]; b[5]=b[4];b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[7]=DisplayData[6];DisplayData[6]=DisplayData[5];DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];i++;i = 0;x=8;}break;}if(n > 0){l=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);}
}void yunsuan()
{if((bj == 0)&&(a<0)&&(a!= -4)){m=l;bj++;fuhao=a;a=66; }else{if(a!=-5&&a<0&&a!=-4){switch(fuhao){case -1:m=m+l;fuhao=a;a=66;break;case -2:m=m-l; fuhao=a;a=66;break;case -3:m=m*l;fuhao=a;a=66;break;case -6:m=m/l;fuhao=a;a=66;break; }}if(a==-5){ switch(fuhao){case -1:m=m+l;fuhao=-1;a=66;break;case -2:m=m-l; fuhao=-2;a=66;break;case -3:m=m*l;fuhao=-3;a=66;break;case -6:m=m/l;fuhao=-6;a=66;break; }bj = 0;l = 0;t=m;}if(t<10){ DisplayData[7]=0x00;              DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00; DisplayData[3]=0x00;              DisplayData[2]=0x00;DisplayData[1]=0x00;DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=10&&t<100){DisplayData[7]=0x00;              DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00;DisplayData[3]=0x00;DisplayData[2]=0x00;DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=100&&t<1000){DisplayData[7]=0x00;              DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00;DisplayData[3]=0x00;DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];} if(t>=1000&t<10000){DisplayData[7]=0x00;              DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00;DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10]; }if(t>=10000&t<100000){DisplayData[7]=0x00;              DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=100000&t<1000000){DisplayData[7]=0x00;              DisplayData[6]=0x00;DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=1000000&t<10000000){DisplayData[7]=0x00;              DisplayData[6]=smgduan[(t%10000000)/1000000];DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=10000000&t<100000000){DisplayData[7]=smgduan[t/10000000];             DisplayData[6]=smgduan[(t%10000000)/1000000];DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}}}}}void main()
{ char i,t=0;for(i=0;i<8;i++){DisplayData[i]=~0x3f;  //此次实验的数码管是共阳数码管;b[i]=0;} while(1){KeyDown();shuruzhi(); yunsuan();DigDisplay();}
}

51单片机8位数码管简易计算器(4*4矩阵键盘)相关推荐

  1. 51单片机一位数码管汇编程序

    51单片机一位数码管汇编程序 程序: ;数码管从0-9显示ORG 0000HAJMP MAINORG 0030HMAIN: MOV R4, #00H ;记录码表的值MOV DPTR, #TABLE ; ...

  2. codeblocks 51单片机学习(四)简易计算器

    基于51单片机的数码管和矩阵按键实现的简易计算器,其实可以加入的东西有很多,就像我这个负数运算还没有加进去,以及我的除法运算只能算655(65535/100)以内的数,不过就先做到这里,这个作品至少已 ...

  3. AutoLeaders控制组——51单片机学习笔记(模块化编程、LCD_1602、矩阵键盘)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  4. 51单片机4位数码管按键显示

    定义一个数g,初始化为0,每按下一次键盘g都加1,把第一次的数赋给b显示在数码管上,第二次的数赋给c显示在数码管上,依次类推直到第四位.定义一个确认按键按下后检查密码是否为1112,如果是就..... ...

  5. 单片机学习笔记————51单片机实现带数码管显示的加法简易计算器

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

  6. 【51单片机】七段数码管和矩阵键盘的综合实验——计算器(思路+仿真电路+源代码)

    系列文章目录 [51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 [51单片机]点阵LED的显示实验 [51单片机]七段数码管显示实验+详细讲解 [51单片机]矩阵键 ...

  7. 基于51单片机和四位数码管的智能计算器算法

    前段时间,本人写了基于51单片机和四位数码管的智能计算器算法,由于时间关系,算法没能实现小数部分,但已为小数部分留出空间,有兴趣的可以添加进去 下面是源代码(矩阵键盘的检测部分参考了普中科技的实验例程 ...

  8. 【51单片机】七段数码管显示实验+详细讲解

    [51单片机]七段数码管显示实验 前言 一.兵马未动,粮草先行--认识七段数码管 1.关于显示器 2.七段数码管 3.七段数码管的结构 4.数码管显示方法 二.数码管显示程序 1.静态显示 效果 2. ...

  9. 51单片机入门——动态数码管显示详解

    51单片机:动态数码管显示 - 模块图 - 显示原理 – 消抖 静态数码管技术 + 人眼视觉停留 显示原理类似于以前的 胶片机放影视,也就是只要我切换的速度足够快你就看不出来其实我是一次次显示的(滑稽 ...

最新文章

  1. python流程控制语句-Python流程控制语句
  2. 用两张图告诉你,为什么你的App会卡顿?
  3. 如何使用Cyberduck登录SAP Leonardo机器学习服务的AWS在线存储
  4. c语言选择结构程序设计笔记,C语言选择结构程序设计.ppt
  5. Dijkstra解决POJ 2263
  6. python怎么直接操作git_基于python实现操作git过程代码解析
  7. 机器学习什么显卡_机器学习之多显卡加速运算(Pytorch版)
  8. 从0到1CTFer成长之路环境搭建详细教程
  9. chmod 777 授权无效
  10. html table的边框线怎么变圆角_CSS如何设置html table表格边框样式
  11. java语言就业方向_java就业有哪些方向
  12. 已有定义int x=57,用isprime()来判断整型数x是否为素数
  13. 盘点2021年晋升为Apache TLP的大数据相关项目
  14. 0820Python总结-线程队列,进程池和线程池,回调函数,协程
  15. BUUCTF WEB PYTHONGINX1
  16. 施一公在2018年全国科学道德和学风建设宣讲教育报告会上的发言 (2018年10月15日,北京人民大会堂)
  17. 基于图数据库的物联网模型(1)-图数据库与模型设计
  18. 在MAC 中修改虚拟机配置文件
  19. 【信奥赛一本通】1184:明明的随机数(详细代码)
  20. JAVA版微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器

热门文章

  1. 虹科分享 | TSN技术如何提高下一代汽车以太网的服务质量?
  2. Swift-画虚线、虚线圆
  3. 如何卸载Chrome应用程序
  4. Excel的发展历史
  5. BUUCTF Unravel
  6. 超简单的H5input新属性调色器
  7. python 定时刷新网页_js定时器刷新当前页面
  8. 字节跳动第四批笔试题
  9. 【数据挖掘实验】关联规则——Apriori算法
  10. 四轴六轴机械臂基础运动仿真实验(Matlab)