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

筒子们,上周参考了好多单片机计算器的文章,但是全文阅读基本都是付费,看了好几篇;参考了某个思路,终于完成了一个简易版的计算器;
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();
 }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值