51单片机(三十)—— 矩阵键盘计算器

        在《51单片机(二十九)—— 矩阵键盘输入实验》中,我们对矩阵键盘的原理及使用方法进行了介绍。在本文中,我们采用矩阵键盘设计一个计算器,实现简单的计算器功能。

        这个实验的代码的主函数如下所示。

main()
{
	init_T0();
	for(;;)
	{
		keyma=KEYscan();
		keyvalue=Keychange(keyma);	
		if(keyvalue!=0xff)
		{
          if(mm==0)
              for(n=0;n<8;n++)
                  showdata[n]=0;  //清除数码管显示           

          if(('+'==keyvalue)|| (mm==8) || ('-'==keyvalue) || ('x'==keyvalue)|| ('/'==keyvalue) || ('='==keyvalue))//输入数字最大值8,输入符号表示输入结束
          {
              mm=0;  //计数器复位

              if(flag==0)  //如果是输入的第一个数据,赋值给a
              {
                  sscanf(temp,"%d",&a);  //从一个字符串输入到变量
                  flag=1;
              }
              else  
                  sscanf(temp,"%d",&b);  //将第二个输入的数据,赋值给b
             
              for(n=0;n<8;n++) //赋值完成后把缓冲区清零,防止下次输入影响结果
                  temp[n]=0;

              if(keyvalue!='=')      //判断当前符号位
                  sign=keyvalue;     //如果不是等号记下标志位
              else
              {  
                  flag=0;         //检测到输入=号,判断上次读入的符合
                  switch(sign)
                  {
                      case '+':a=a+b;
                        break;
                      case '-':a=a-b;
                        break;
                      case 'x':a=a*b;
                        break;
                      case '/':a=a/b;
                        break;
                      default:
                        break;
                  }
                  sprintf(temp,"%d",a);  //打印十进制到临时缓冲区
                  for(n=0;n<8;n++)       //打印的值是ASCII码值
                  { 
                      if(temp[n]==0)      //数码管上不显示
                          showdata[n]=0;
                      else if(temp[n]=='-')  //负号
                          showdata[n]=0x40;
                      else 
                          showdata[n]=BJTY_DuanMa[temp[n]-'0'];//显示断码		     
                  }
                  sign=0;
                  a=b=0;            //用完后所有数据清零
              }
          }
          else	if(mm<8)
          {
              temp[mm]=keyvalue+'0'; 
              showdata[mm]=BJTY_DuanMa[keyvalue];   //输出数据
              mm++;                          //输入数值累加
          }
		}
	}
}

         将程序代码烧写之后可以看到实验现象,在这个实验中,数码管显示的数值与S1~S16旁边的数值相对应。按下按键可以进行计算。这个演示代码只是一个简单的计算器,只能进行整数的加减乘除运算,不能计算小数。

 

  • 10
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值