在《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旁邊的數值相對應。按下按鍵可以進行計算。這個演示代碼只是一個簡單的計算器,只能進行整數的加減乘除運算,不能計算小數。