【单片机】简易计算器完整代码带电路图

简介: 【单片机】简易计算器完整代码带电路图

【单片机】51单片机计算器代码和电路图

文章目录

【单片机】51单片机计算器代码和电路图

一、问题描述

二、具体实现

1.完整代码带注释

2.电路图

总结


一、问题描述


通过AT89C51单片机16位矩阵键盘设计简易计算器(仅能实现加减操作)


二、具体实现


1.完整代码带注释

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
          {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
          0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//显示数字0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
uchar code address[]={0xfe,0xfd};//位选1,2
          //1111 1110数码管显示第一位
          //1111 1101数码管显示第二位
uchar code KEY_TABLE[] = 
            {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,
            0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//(反转法)矩阵键盘的各个按键的计算值
void delay(int k)
{
  for( ; k>0; k--);
}
void delay1()
{
  uint n = 50000;while(n--);
}
void delay2()
{
  uint n = 10000;while(n--);
}
main()
{
  uchar temp,key,num,i;
  int sum,sign,j,a[16],k=0;
  while(1)
  {
    P3 = 0xf0;//1111 0000
    if(P3 != 0xf0)
    {
      delay2();
      if(P3 != 0xf0)
      {
        temp = P3;
        P3 = 0x0f;//0000 1111
        key = temp|P3;//低四位改变,若有键按下,得出低四位的值。xxxx 1111
        for(i=0; i<16; i++)
          if(key == KEY_TABLE[i])
          { num = i;//0,1,2,3,,15
            delay(200);
            //0-14显示
            if(num>=0 && num<=14)
            {
              a[k++]=num;//a[0]=0
              P2 = address[0];//位选为0xfe,显示第一位数字
              P1 = table[num];//显示数字num
              delay(2000);
             }  
            else if(num==15)//按下15等号键进行判断
            {
              //判断输入的值是否合法
              if(a[0]>=0 && a[0]<=9 && (a[2]>=0 && a[2]<=9) && (a[1]==10 || a[1]==11))//1+2(第一位数字a[0],第二个运算符a[1]+-,第三位数字a[2])
                  sign=1;//合法
              else
                  sign=3;//不合法
              for(j=0;j<3;j++)//A+B循环三次,两个数字和一个运算符
              {
                  if(a[j]==12||a[j]==13||a[j]==14)//如果是12,13,14位,无效键
                    sign=0;
              }
            }
            if(sign==1)//合法
            {
              if(a[1]==10)//按下加号键
                sum=a[0]+a[2];//实现加法
              else if(a[1]==11)//按下减号键
                sum=a[0]-a[2];//实现减法
            }
          }
        delay1();
      }
    }
    //合法
    if(sign == 1)
    {
      if(sum<10)//0-9
      {
        P2=address[0];//位选为0xfe,显示第一位数字
        P1=table[sum];//显示数字table[sum]
      }
      else
      {
        for(i=0;i<100;i++)
        {
          P2=address[1];//位选为0xfd,显示第二位数字
          P1=table[sum/10];
          delay(1000);
          P2=address[0];//位选为0xfe,显示第一位数字
          P1=table[sum%10];
          delay(1000);
        }
      }
    }
    //不合法键判断
    if(sign == 3)
    {
      P2=address[0];//位选为0xfe,显示第一位数字
      P1=table[15];//显示字符f
      P2=address[1];//位选为0xfd,显示第二位数字
      P1=table[15];//显示字符f
    }
    //无效键判断
    if(sign == 0)
    {
      P2=address[0];//位选为0xfe,显示第一位数字
      P1=table[0];//显示字符f
      P2=address[1];//位选为0xfd,显示第二位数字
      P1=table[0];//显示字符f
    }
  }
}

2.电路图


初始界面

实现加法操作



总结


全网最详细代码,直接拿去用,感谢大家对我的关注!

目录
相关文章
|
4月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
|
4月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
102 1
|
4月前
|
人工智能 C语言
【51单片机】让AI识别电路图,帮你进行编码(以51单片机为例)
【51单片机】让AI识别电路图,帮你进行编码(以51单片机为例)
170 0
|
7月前
|
传感器
51单片机循迹小车原理介绍和代码示例
51单片机循迹小车原理介绍和代码示例
51单片机循迹小车原理介绍和代码示例
|
7月前
|
传感器
基于51单片机的自动浇花器电路
该文档是一个基于AT89C51单片机的自动浇水灌溉系统的设计方案。系统由5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块组成。它通过检测土壤湿度并将其转换为数字信号,与预设的湿度上下限值进行比较,以决定是否启动水泵进行灌溉。用户可以通过按键设置湿度上下限值,LCD屏幕实时显示当前湿度和上下限值。如果湿度低于下限,系统会启动声光报警并打开水泵;当湿度超过上限,声光报警关闭,但水泵会继续工作,直至湿度下降到下限以下。设计中还提供了Proteus仿真电路图和C代码实现。
|
7月前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)
【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)
【51单片机】自定义静态数码管显示(设计思路&代码演示)
【51单片机】自定义静态数码管显示(设计思路&代码演示)
|
7月前
|
C++
【51单片机】添加模块代码的常见问题(图示&代码演示)
【51单片机】添加模块代码的常见问题(图示&代码演示)
【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
下一篇
DataWorks