基于51单片机的数码管和矩阵按键实现的简易计算器,其实可以加入的东西有很多,就像我这个负数运算还没有加进去,以及我的除法运算只能算655(65535/100)以内的数,不过就先做到这里,这个作品至少已经叫做计算器了。
首先我这个工程里加入了两个文件,数码管显示文件,查询式矩阵按键文件,直接调用这两块功能的函数,然后在主函数里解决相当于软件层的计算器功能。

简易计算器实现的功能(待完善)

  • 四则运算
  • 可以显示2位小数
  • 利用矩阵按键输入,用数码管显示
  • 连续运算
  • 负数运算

代码的解释和功能实现

其它函数说明:

/*定义局部函数*/
void deletenum(int s[]);//退位函数,用于退1位,等同'c'
void addnum(int s[]);//加位函数,在输入下一位数的时候将前面的数后移1位
void count(void);//计算函数等同'='
unsigned long pow10(u8 n);//计算10的n次方
void init(void);//计算完成后初始化第二个输入数
void division(void);//除法运算
void multiplication(void);//乘法运算
void subtraction(void);//减法运算
void addition(void);//加法运算
/*定义变量*/
int gDigValue[8];//gDigValue用于显示数码管作为全局变量
int val[8],a[8],b[8];//分别存放运算结果,第一个数,第二个数
unsigned long sum=0,um=0;//sum用于存储被除数
u8 num=0,ch=0;//ch存放运算符,num存放键值
u8 flag1=0,flag2=1,next_flag=1;//分别代表是否有小数点,是否显示运算结果,是否要输入下一个数/*主函数
用于放置主要流程:1.获取键值,根据键值进行操作 2.分情况将数值显示在数码管
(输入数字时显示正在输入的数,运算后显示结果)
*/
void main(void)
{while(1){num=key_val();//获取键值if(num!=17)flag2=1;//当有按键按下,不再显示运算结果,改为显示正在输入的数WaitForKeyUp();if(next_flag){if(num>9){switch(num){case 14:deletenum(a);break;//退位case 15:break;//没有输入运算符的时候不能计算case 17:break;//没有按键按下default:ch=num;next_flag=0;break;//当按下的是运算符,用ch先保存,然后输入下一个数的标志next_flag等于0(逻辑否)}}else{addnum(a);a[7]=num;}}else{if(num>9){switch(num){case 14:deletenum(b);break;case 15:count();break;//在输入运算符后可以计算case 17:break;//没有按键按下default:ch=num;break;}}else//如果输入数字,所有数字左移一格,然后输入新的数字{addnum(b);//左移b[7]=num;}}if(flag2)//是否显示运算结果{if(next_flag)//显示正在输入的数for(u8 i=0;i<8;i++){gDigValue[i]=a[i];}elsefor(u8 i=0;i<8;i++){gDigValue[i]=b[i];}}else{if(flag1 && val[7]==0 && val[6]==0)//如果没有小数位(小数点后两位为0),则去掉小数点,所有数字右移两格{flag1=0;//不再显示小数点for(int j=7;j>=2;j--)//右移两格{val[j]=val[j-2];}val[0]=0;val[1]=0;}for(u8 i=0;i<8;i++){a[i]=val[i];//让第一个数变为运算的结果,可以连续运算gDigValue[i]=val[i];//显示运算结果}}DigDisplayVal();//数码管显示数值}}
/*用于获取键值,方便键值的改变,包含在key.c文件中*/
u8 key_val(void)
{switch(KeyScan())//获得查询式获取键值的结果{case 1:return 7;break;//数字7case 2:return 8;break;//数字8case 3:return 9;break;//数字9case 4:return 11;break;// / 除号case 5:return 4;break;//数字4case 6:return 5;break;//数字5case 7:return 6;break;//数字6case 8:return 12;break;// * 乘号case 9:return 1;break;//数字1case 10:return 2;break;//数字2case 11:return 3;break;//数字3case 12:return 13;break;// - 减号case 13:return 14;break;// 退位case 14:return 0;break;//数字0case 15:return 15;break;// = 等于case 16:return 16;break;// + 加号default:return 17;//没有按下按键时返回17}
}

四则运算函数,除了除法
,其他的类比列式计算
是不是生动形象

/*减法运算*/
void subtraction(void)
{for(int i=7;i>=0;i--){val[i]=a[i]-b[i];if(val[i]<0)//小于0的要借位{val[i]+=10;a[i-1]-=1;}}
}/*加法运算*/
void addition(void)
{for(int i=7;i>=0;i--){val[i]=a[i]+b[i];if(val[i]>9)//大于10的要进位{val[i]-=10;val[i-1]+=1;}}
}
/*乘法运算*/
void multiplication(void)
{for(int i=7;i>=0;i--)//类比我们的列式乘法,将乘数的每一位分别和被乘数的每一位相乘。{for(int j=7;j>=0;j--){if(i+j>=7)val[i-7+j]+=a[i]*b[j];}}for(int i=7;i>=0;i--)//将每一位大于10的进位while(val[i]>9){val[i]-=10;val[i-1]+=1;}
}
/*除法运算,这个算法受51单
片机运算能力限制只能运算输
入数字在655以内的除法。顺
带一提,要显示小数点,我们
需要回到数码管显示的底层函
数里,将段码|(位与)一个0x80,
也就是DIG_PORT=gDuanMa[gDigVal[i]] | 0x80;
*/
void division(void)
{for(int i=7;i>=0;i--){sum=sum+a[i]*pow10(7-i);//将输入的第一个数(被除数)获取um=um+b[i]*pow10(7-i);//将输入的第二个数(除数)获取}if(sum<1000000)//共两位小数点,所以整数部分最多6位,实际上到不了那么多位{sum=(sum*100)/um;for(int i=0;i<8;i++){val[7-i]=(sum%pow10(i+1))/pow10(i);}flag1=1;}
}

codeblocks 51单片机学习(四)简易计算器相关推荐

  1. 51单片机2位数简易计算器C语言实现

    今天是51单片机模块! 事实上,也是离不开C语言编程啦 适合手头上有51单片机且对硬件有兴趣的小伙伴们 这里推荐初学者(我自己就是哈哈哈)购买天祥电子51单片机开发板(TX-1C) 话不多说,上代码: ...

  2. 51单片机 Proteus仿真 简易计算器设计 清零 十以内

    1 利用键盘及数码管作为计算机的输入及显示模块 2 能进行10以内的减减乘除的基本运算,按键有0~9±*/= 3 有清零"CR"按键 4 有记忆功能键 M+ RM M-,可以保存. ...

  3. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

  4. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  5. 51单片机学习之智能小车(1)

    说明 这是我学习一段时间51之后自己动手做的,比较简陋.此篇作为总结和复习,如有问题,请评论指出. 下篇:51单片机学习之智能小车(2) 小车概述(功能,所用模块) (1)蓝牙控制 通过手机上蓝牙串口 ...

  6. 51单片机学习笔记2 仿真器的使用及STC89Cxx简介

    51单片机学习笔记2 仿真器的使用及STC89Cxx简介) 一.连接步骤 1. 硬件连接 2. 安装软件驱动 3. 检查是否安装成功 二.仿真步骤 1. 打开一个51工程 2. 选择仿真设备 3. S ...

  7. 51单片机学习 数码管 倒计时

    51单片机学习 数码管 倒计时 简介 1.硬件部分 普中单片机 开发板 (138译码器控制)数码管 2.软件部分 keil软件 硬件部分 138译码器 简介 74LS138 为3 线-8线译码器,共有 ...

  8. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  9. 51单片机学习历程——硬件准备&开发环境搭建

    系列文章目录 第一章 51单片机学习历程(1)--开发环境搭建 第二章 51单片机学习历程(2)--建立新的工程 第三章 51单片机学习历程(3)--点亮一颗LED 第四章 51单片机学习历程(4)- ...

最新文章

  1. linux集群无密码访问,Linux服务器集群通过SSH无密码登录
  2. ElasticSearch 索引详解
  3. java不看答案不会_Java新手必备:20道java基础面试题,不看答案你会几道题?
  4. 做到我这样,你也能拿到京东Offer
  5. NSOperation的进阶使用和简单探讨
  6. 支付宝移动端 Hybrid 解决方案探索与实践
  7. java读取空格_java 读取文件路径空格和中文的处理
  8. android 命令使用详解,Android下pm 命令详解
  9. 【译】数据显示:中国的程序员是世界上最牛的程序员?
  10. 股票市场的本质是为优质企业提供融资的平台
  11. gprof—Ubuntu中使用gprofile进行性能统计时没有数字结果
  12. 读书笔记-泛型有限通配符
  13. 详解如何实现斗鱼、B站等全局悬浮窗直播小窗口
  14. 华三模拟器(路由器)实现ipsec穿越NAT实验
  15. Spring框架爆RCE 0day漏洞的临时解决方案
  16. 8脚 tja1050t_TJA1050芯片手册.pdf
  17. 坚定不移地做自己认为正确的事情
  18. 时间戳 太平洋夏令时间和本地时间相互转换及自定义夏令时
  19. C# 克隆(Clone)中的深拷贝和浅拷贝
  20. 解决嵌入百度导航4.1.x遇到的坑

热门文章

  1. 【管理学】作业与思考题
  2. java.lang.IllegalStateException问题解决
  3. 一种在一张图片上涂改的效果
  4. Confluence搭建文档
  5. 电影《我爱你!》观后感
  6. 超精致 Vue 视频播放组件Vue-CoreVideoPlayer
  7. Pandas时序数据Time Series
  8. T1057 多边形内角和
  9. 微信公众号一键导航调用腾讯地图
  10. Flutter 货币格式化