在《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旁边的数值相对应。按下按键可以进行计算。这个演示代码只是一个简单的计算器,只能进行整数的加减乘除运算,不能计算小数。