最近在学习单片机,在学习了动态数码管和矩阵按键后自己突然想实现一个简易的计算器程序。

按键的设置:按顺序设置下来4x4的矩阵按键,前两排设置成数字0-7,第三排按键前两个是数字8,9,后两个是'+'、'-'符号,最后一排是前两个设置成'*'、'/'符号,第三个是'='符号,最后一个暂未设置,可以进行数值较小的数字的运算,后续再慢慢进行优化

定义的变量的说明:数组用于保存按下的数字按键用于数码管动态显示,标志位tag0代表加运算,1代表减运算,2代表乘运算,3代表除运算,临时变量temp默认为0用于保存按下的数字后面用于计算,nexttag用于当按下符号按键后,下一次按下数字按键的话就会对数组进行清空进行第二次数字的输入。

大概思路就是单片机接通电源后,会一直进行检测有没有按键按下,如果有按键按下的话会进行判断,如果检测是按下数字按键的话会保存在一个数组里,temp变量进行*10+数字按键的计算保存按下的数字,如果检测到按下的是符号的话,这时会将临时变量保存到一个新的变量上后面用于运算,并将nexttag置为1,temp置为0,下一次进行数字按键输入的话就会清空数组,进行重新显示第二个数字,最后按下等于号的话就会将此时temp变量存储的值赋给第二个变量,通过判断tag进行对应的运算。

最后是源代码的分享,仅供参考哦,希望各位大神多多指教

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 keyvalue;
u8 keyvalue1;
u8 array[16]={0};
int count=0;
u8 tag;
int temp=0;
int one=0;
int two=0;
int total;
u8 nexttag=0;
void cleararray()
{u8 i;for(i=0;i<count;i++){array[i]=0;}count=0;
}
void delay(int i)
{while(i--);
}
void gettotal()
{u8 temp1;u8 i;u8 temp2;while(total){temp1=total%10;array[count++]=temp1;total=total/10;}for(i=0;i<count/2;i++){temp2=array[i];array[i]=array[count-1-i];array[count-1-i]=temp2;}
}
void KeyDown()
{char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);if(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):{if(keyvalue==0){keyvalue1=0; }else if(keyvalue==1){keyvalue1=1;}else if(keyvalue==2){keyvalue1=2;}else {keyvalue1=3;}}break;case(0xb0):{if(keyvalue==0){keyvalue1=4;   }else if(keyvalue==1){keyvalue1=5;}else if(keyvalue==2){keyvalue1=6;}else {keyvalue1=7;}}break;case(0xd0):{if(keyvalue==0){keyvalue1=8;   }else if(keyvalue==1){keyvalue1=9;}else if(keyvalue==2){keyvalue1=10;}else {keyvalue1=11;}}break;case(0xe0):{if(keyvalue==0){keyvalue1=12;    }else if(keyvalue==1){keyvalue1=13;}else if(keyvalue==2){keyvalue1=14;}else {keyvalue1=15;}}break;}if(keyvalue1>=0&&keyvalue1<=9){if(nexttag==0){array[count++]=    keyvalue1;temp=temp*10+keyvalue1;}else{cleararray();array[count++]=    keyvalue1;temp=temp*10+keyvalue1;nexttag=0;  }}else if(keyvalue1==10)   //加法{tag=0;one=temp;temp=0;nexttag=1;}else if(keyvalue1==11) //减法{tag=1;one=temp;temp=0;nexttag=1;}else if(keyvalue1==12)   //乘法{tag=2;one=temp;temp=0;nexttag=1;}else if(keyvalue1==13)  //除法{tag=3;one=temp;temp=0;nexttag=1;}else if(keyvalue1==14){two=temp;cleararray();switch(tag){case 0:{total=one+two;gettotal();}break;case 1:{total=one-two;gettotal();}break;case 2:{total=one*two;gettotal();}break;case 3:{total=one/two;gettotal();}break;}}while((a<50)&&(GPIO_KEY!=0xf0)){delay(1000);a++;}}}
}
void main()
{int i;while(1){KeyDown();for(i=0;i<count;i++){switch(i){case 0:LSA=1;LSB=1;LSC=1;break;case 1:LSA=0;LSB=1;LSC=1;break;case 2:LSA=1;LSB=0;LSC=1;break;case 3:LSA=0;LSB=0;LSC=1;break;case 4:LSA=1;LSB=1;LSC=0;break;case 5:LSA=0;LSB=1;LSC=0;break;case 6:LSA=1;LSB=0;LSC=0;break;case 7:LSA=0;LSB=0;LSC=0;break;}GPIO_DIG=smgduan[array[i]];delay(100);GPIO_DIG=0x00;}}
}

51单片机实现计算器程序相关推荐

  1. 单片机四位数加减计算机程序,51单片机简易计算器程序 实现数字的加减乘除运算...

    //头文件 #define uint unsigned int #define uchar unsigned char sbit lcden=P1^1; //LCD1602控制引脚 sbit rs=P ...

  2. 单片机加减法计算器_51单片机简易计算器程序 实现数字的加减乘除运算

    单片机源程序如下: #include //头文件 #define uint unsigned int #define uchar unsigned char sbit lcden=P1^1; //LC ...

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

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

  4. LCD液晶显示的51单片机简单计算器

    LCD液晶显示的51单片机简单计算器 概述 方案 矩阵键盘输入映射与设计原理 软件设计 软件设计思路 软件代码 概述 LCD液晶显示的51单片机简单计算器可实现完成了两个范围在0到255的数加.减.乘 ...

  5. 51单片机-红外计算器

    51单片机-红外计算器 1.硬件:普中-A2开发板 使用哪些硬件资源? 1.1.LCD1602液晶显示器 1.2.红外接收头 1.3.红外遥控器 2.软件介绍: 2.1.共分为8个.c文件. 2.1. ...

  6. AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc

    一个基于AVR单片机的计算器程序 #include #include//延时函数的头文件 #include // 中断函数的头文件 #define uint unsigned int #define ...

  7. 51单片机c语言程序执行顺序,51单片机程序执行流程详细分析

    这里是一个循环,根据DJNZ指令的功能:每执行一次DJNZ RO, IDATALOOP就将R0的值减1,若R0的值不为0则就跳到IDATALOOP地址去.很显然这是一个循环,那么RO的值是多少呢,在以 ...

  8. 三菱梯形图转换c语言软件,三菱梯形图转51单片机软件使用程序超过100步又要使用软件的朋友.pdf...

    三菱梯形图转51单片机软件使用程序超过100步又要使用软件的朋友 三菱梯形图转51单片机软件使用 希望这个软件 能降低你的电气控制成本. 1:运行三菱软件,选择PLC型号为FX1N,画好梯形图并保存. ...

  9. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  10. 51单片机C语言程序100例分析(1)IO+C语言+头文件

    51单片机C语言程序100例分析(1)IO+C语言+头文件 \\\插播一条:文章末尾有惊喜哟~///  P1=0xfe;//P1=11111110B,即P1.0输出低电平} 分析:通过这短短的几行代码 ...

最新文章

  1. 中石油-高精度除法-java版
  2. 当重复调用addsubview时出现显示重叠问题
  3. Python API简单验证
  4. 2011考研数学概率论基础复习必备知识点
  5. springboot-项目获取resources下文件的方法
  6. Spring中三种配置Bean的方式
  7. 【资源】编程珠玑I 源码
  8. 再记一下sscanf的一个小问题
  9. Tricks(四十七)—— 布尔矩阵(0-1矩阵)取反
  10. 用最新MySQL 8.0的源安装MySQL 5.7版本(CentOS 7环境下)
  11. 云计算实训总结_云计算平台实践心得
  12. 怎样将excel表格导入天正_天正无法导入excel表格
  13. Mac电脑高质量神器——超级右键
  14. Creo9.0 绘制中心线
  15. 利用C++求解一元二次方程
  16. 匹配指定字符背后的所有内容(正则表达式)
  17. web前端期末大作业(月饼美食网站) html+css+javascript网页设计实例 企业网站制作...
  18. Inventor记录
  19. 优麒麟(18.10)安装五笔拼音输入法
  20. CTPN的Python实现笔记一

热门文章

  1. 北斗卫星导航系统基础篇之(二)
  2. 几种免杀转储lsass进程的技巧
  3. 用友凭证打印没有辅助项
  4. flash游戏开发教程
  5. jsp网页视频播放器
  6. PDF怎么转换成CAD?教你几步轻松掌握
  7. 如何解决selenium与firefox版本不匹配的问题
  8. .chm 文档打不开
  9. 20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises05
  10. Mac环境配置MySQL(详细)