利用AT89C51在Keil5中编程,按键采用矩阵键盘,编写简易计算器功能
时间: 2024-06-08 08:11:01 浏览: 259
首先,需要定义矩阵键盘的行和列。在本例中,我们使用了4行4列的矩阵键盘,因此定义4个行引脚和4个列引脚。然后,需要定义每个按键所对应的值,这些值将用于计算器功能。在本例中,我们使用了加、减、乘、除和数字键0-9。
接下来,我们需要编写程序,以检测按下哪个按键,并根据按键所对应的值执行相应的操作。我们可以通过轮询行和列来检测按键,并使用一个变量来存储当前按键的值。一旦检测到按键按下,我们就可以根据按键所对应的值执行相应的操作。
编写代码如下:
```c
#include<reg51.h>
sbit ROW1 = P2^0;
sbit ROW2 = P2^1;
sbit ROW3 = P2^2;
sbit ROW4 = P2^3;
sbit COL1 = P2^4;
sbit COL2 = P2^5;
sbit COL3 = P2^6;
sbit COL4 = P2^7;
unsigned char keypad[4][4] = { {'1','2','3','+'},
{'4','5','6','-'},
{'7','8','9','*'},
{'0','.','=','/'}};
unsigned char key_pressed()
{
unsigned char i, j;
for(i=0; i<4; i++)
{
ROW1 = 1;
ROW2 = 1;
ROW3 = 1;
ROW4 = 1;
switch(i)
{
case 0: ROW1 = 0; break;
case 1: ROW2 = 0; break;
case 2: ROW3 = 0; break;
case 3: ROW4 = 0; break;
}
for(j=0; j<4; j++)
{
if(COL1 == 0) return keypad[i][0];
if(COL2 == 0) return keypad[i][1];
if(COL3 == 0) return keypad[i][2];
if(COL4 == 0) return keypad[i][3];
}
}
return ' ';
}
void delay()
{
unsigned int i;
for(i=0; i<50000; i++);
}
void main()
{
unsigned char key,prev_key=' ';
unsigned long int num1=0,num2=0,result=0;
unsigned char operator=' ';
while(1)
{
key = key_pressed();
if(key != prev_key)
{
prev_key = key;
if(key >= '0' && key <= '9')
{
num1 = num1*10 + (key-'0');
}
else if(key == '+' || key == '-' || key == '*' || key == '/')
{
operator = key;
num2 = num1;
num1 = 0;
}
else if(key == '=')
{
switch(operator)
{
case '+': result = num1 + num2; break;
case '-': result = num2 - num1; break;
case '*': result = num1 * num2; break;
case '/': result = num2 / num1; break;
}
num1 = result;
num2 = 0;
operator = ' ';
}
else if(key == '.')
{
num1 = num1*10 + '.';
}
}
P1 = key;
delay();
}
}
```
在这个程序中,我们定义了一个二维数组来存储矩阵键盘上的每个按键所对应的值。然后,我们使用一个循环来轮询行和列,并使用嵌套的if语句来检测按键是否按下。如果检测到按键按下,我们将按键的值存储在一个变量中,并根据按键所对应的值执行相应的操作。
在计算器功能中,我们使用了两个变量num1和num2来存储操作数,以及一个变量operator来存储操作符。当检测到操作符时,我们将num1的值存储在num2中,并将num1重置为0。当检测到等号时,我们执行计算操作,并将结果存储在num1中。
最后,我们使用一个延迟函数来避免按键抖动,并将按键所对应的值输出到P1口,以便我们可以在调试过程中查看按键的值。
这就是在Keil5中编写简易计算器功能的方法。
阅读全文