前段时间,本人写了基于51单片机和四位数码管的智能计算器算法,由于时间关系,算法没能实现小数部分,但已为小数部分留出空间,有兴趣的可以添加进去

下面是源代码(矩阵键盘的检测部分参考了普中科技的实验例程)

#include "reg52.h"            
#include "math.h"
                                                                                                                                                                                                                                                                                                                                                                                                                                     
typedef unsigned int u16;      
typedef unsigned char u8;

#define GPIO_DIG P0
#define GPIO_KEY P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
float m,l;
int t;
char  a, j;
char  b[4];
char  n=0, fuhao;
char  bj=0, xs, xsbj, xsb=0, x,xa;

u8  KeyValue;    
u8  DisplayData[4];

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)
            {
               n=0;
            }
            
        }
    }
}

void DigDisplay()
{
    u8 i;
    for(i=0;i<4;i++)
    {
        switch(i)    
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            
        }
        P0=DisplayData[i];
        delay(100); //间隔一段时间扫描    
        P0=0x00;//消隐
    }
}

void shuruzhi()
{
   int i;
 
   switch(n)
    {
        case 0:
               DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=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;
                   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[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[0]=smgduan[a];DisplayData[3]=0x00;
               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[0]=smgduan[a];
               i++;
               x=4;
               }
               break;
               
      }
      if(a==-4)
      {
           DisplayData[0]=smgxiaoshu[b[0]];
            xs=a;
         xsbj=x;
      }
      if(n==1)
      {
        b[1]=0;b[2]=0;b[3]=0;
      }      
      if(n==2)
      {
        b[2]=0;b[3]=0;
      }
      if(n==3)
      {
          b[3]=0;
      }
          if(a<0)
        {
          if(xs==-4)
          {
          xsbj=x-xsbj;
          if(xs==-4&&xsbj!=0)
          {
             if(xsbj==1)
             {
               l=b[3]*100+b[2]*10+b[1]*1+b[0]*0.1;
             }
             if(xsbj==2)
             {
               l=b[3]*10+b[2]*1+b[1]*0.1+b[0]*0.01;
             }
             if(xsbj==3)
             {
               l=b[3]*1+b[2]*0.1+b[1]*0.01+b[0]*0.001;
             }
             xsbj=0;
          }
          xa=xs;
          xs=0;
          }
         else
             l=b[3]*1000+b[2]*100+b[1]*10+b[0];

}

}
void yunsuan()
{
  if(bj==0&&a<0)
  {
     m=l;
     bj++;
     fuhao=a;
     a=11;
  }
  else
  {
     if(a!=-5&&a<0&&a!=-4)
     {
          switch(fuhao)
          {
             case -1:
                     m=m+l;
                     fuhao=a;
                     a=11;
                     break;
             case -2:
                      m=m-l;
                      fuhao=a;
                      a=11;
                      break;
             case -3:
                     m=m*l;
                     fuhao=a;
                     a=11;
                     break;
            case -6:
                    m=m/l;
                    fuhao=a;
                    a=11;
                    break;
          }
     }
     if(a==-5)
     {    
           switch(fuhao)
          {
             case -1:
                     m=m+l;
                     fuhao=-1;
                     a=11;
                     break;
             case -2:
                      m=m-l;
                      fuhao=-2;
                      a=11;
                      break;
             case -3:
                     m=m*l;
                     fuhao=-3;
                     a=11;
                     break;
            case -6:
                    m=m/l;
                    fuhao=-6;
                    a=11;
                    break;
          }
        if(m<0)
        {
          if(xs==-4)
          {
            t=-m*100;
          }
          else
          {
            t=-m;
          if(t<10)
          {  
             DisplayData[3]=0x00;                                                    
             DisplayData[2]=0x00;
             DisplayData[1]=0x40;
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];

}
           if(t<100&&t>=10)
          {
             DisplayData[3]=0x00;
               DisplayData[2]=0x40;
             DisplayData[1]=smgduan[(((t%1000)%100)/10)];
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];  
          }
           if(t<1000&&t>=100)
          {
            DisplayData[3]=0x40;
               DisplayData[2]=smgduan[((t%1000)/100)];
              DisplayData[1]=smgduan[(((t%1000)%100)/10)];
            DisplayData[0]=smgduan[(((t%1000)%100)%10)];   
          }
          }
          }
        else
        {
           if(xa==-4)
          {
            t=m*100;
            xa=0;
          }
          else
          {
            t=m;
          }
           if(t<10)
          {  
             DisplayData[3]=0x00;                                                    
             DisplayData[2]=0x00;
             DisplayData[1]=0x00;
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];

}
          if(t>=10&&t<100)
          {
             DisplayData[3]=0x00;
               DisplayData[2]=0x00;
             DisplayData[1]=smgduan[(((t%1000)%100)/10)];
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];  
          }
          if(t>=100&&t<1000)
          {
            DisplayData[3]=0x00;
               DisplayData[2]=smgduan[((t%1000)/100)];
              DisplayData[1]=smgduan[(((t%1000)%100)/10)];
            DisplayData[0]=smgduan[(((t%1000)%100)%10)];   
          }
          if(t>=1000&t<10000)
          {
            DisplayData[3]=smgduan[(t/1000)];
               DisplayData[2]=smgduan[((t%1000)/100)];
              DisplayData[1]=smgduan[(((t%1000)%100)/10)];
            DisplayData[0]=smgduan[(((t%1000)%100)%10)];
          }
          }
        }
         }
 
}

void main()
{    char i,t=0;
    
    for(i=0;i<4;i++)
    {
      DisplayData[0]=0x3f;
      b[i]=0;
    }

while(1)
   {
      KeyDown();
      shuruzhi();
      yunsuan();
      DigDisplay();
  }
}
如需借用请标明出处!

基于51单片机和四位数码管的智能计算器算法相关推荐

  1. 63、基于51单片机数字频率计NE555数码管显示系统设计(程序+原理图+Proteus仿真+参考论文+开题报告+任务书+元器件清单等)

    摘  要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此越来越广泛地应用各个领域. ...

  2. 101、基于51单片机数控电源 数码管 直流稳压电源 恒流恒压系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序 七.资料包括 摘要 随着电力电子技术的迅速发展, 直流电源应用非常 ...

  3. 基于51单片机的四位共阴数码管秒表proteus仿真

    硬件设计 (末尾附文件) 代码设计 #include "reg51.h" #include "intrins.h"#define GPIO_DIG P2 //数 ...

  4. 基于51单片机的水族箱温度水质监测智能宠物金鱼喂食器补氧换水proteus仿真原理图

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测水族箱温度及水质,并定时向WIFI串口发送监测信息 2.当水质超过设定阈值时,启动换水继电器 3.按键可设定阈值,可手动换水,喂食 ...

  5. 基于51单片机的水温水位测控智能热水器系统方案原理图仿真

    硬件系统设计 单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单元,如ROM.RAM.I/O.定时器/计数器.中断系统等不能满足应用系统的要求时,必须在片外进行扩展,选择适 ...

  6. 基于51单片机的4位竞赛抢答器的设计

    设计编号:Q001 资料下载 功能要求: 以单片机为核心,设计一个4位竞赛抢答器:同时供4名选手或4个代表队比赛,分别用4个按钮S0-S4表示. 1.设置一个系统清除和抢答控制开关S,开关由主持人控制 ...

  7. 基于51单片机1602温度显示时钟

    基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...

  8. 最简单DIY基于51单片机的舵机控制器

    51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...

  9. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

最新文章

  1. 【转载】Few-shot learning(少样本学习)和 Meta-learning(元学习)概述
  2. 华章7-8月份新书简介(2015年)
  3. 后台寻路系统的大体思路与流程
  4. 转载 一篇UI规范文件
  5. C#系统开发登录窗体在MDI窗体之前显示
  6. 谷歌18年博士生奖研金出炉,八位入选华人学生均毕业于国内高校
  7. C 语言会比 C++ 快?
  8. Python基础6—常用语句
  9. JAVA中Long与Integer
  10. Android系统版本与版本代号中英文名字
  11. 路由器与交换机的关系
  12. 记录 Spring Cloud GateWay 使用 路径与路由名字重复 出现的问题
  13. Grafana 任意文件读取漏洞复现
  14. 从从协方差的误差椭圆到PCA
  15. openoffice java awt_使用openoffice转pdf,详细
  16. Elastic search常用分词 和 多字段搜索优化
  17. matplotlib中关于极坐标轴的控制
  18. 电脑播放视频报错----------无法播放。请确保你的计算机的声卡和视频卡可以使用,并安装了最新的驱动程序----------解决!
  19. [VOT15](2021CVPR)Alpha-Refine: Boosting Tracking Performance by Precise Bounding Box Estimation
  20. dim=0与dim=1_CodingPark编程公园

热门文章

  1. java生成图片大小_Java 对图片进行大小转换
  2. 散粉在哪个步骤用_散粉在哪个步骤用 散粉用在哪一步骤
  3. instsrv+srvany创建服务实现开机自动启动vmware虚机
  4. PHP笔记-Workerman整合到Laravel中并创建websocket
  5. 小猫爪:i.MX RT1050学习笔记19-安全启动3-实现HAB签名
  6. element的复杂表单验证
  7. 安卓WebApp开发-项目MiliSetu
  8. jmeter 学习笔记
  9. linux epel,Linux增加epel源的方法
  10. Git reset(回滚) 和 revert(撤销)(图文详解)