帮我用keil5写4*4矩形键盘模块三位数以内加减乘除计算器代码
时间: 2024-02-12 20:06:58 浏览: 83
好的,下面是使用Keil5编写4*4矩形键盘模块三位数以内加减乘除计算器的代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code keymap[4][4] = { // 键盘按键映射表
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'C', '0', '=', '/'}
};
uchar tmp, num1, num2, op, result; // 定义变量
sbit D0 = P2^0; // 显示数码管位选引脚
sbit D1 = P2^1;
sbit D2 = P2^2;
sbit D3 = P2^3;
sbit LSA = P2^4; // 显示数码管片选引脚
sbit LSB = P2^5;
sbit LSC = P2^6;
void delay(uint t) // 延时函数
{
uint i, j;
for(i=0; i<t; i++)
{
for(j=0; j<120; j++);
}
}
void scan_key() // 扫描键盘函数
{
uchar i, j;
for(i=0; i<4; i++)
{
P1 = 0x0f ^ (0x01 << i); // 设置行引脚电平
tmp = P1; // 读取列引脚电平
for(j=0; j<4; j++)
{
if(!(tmp & (0x01 << j))) // 判断是否有按键按下
{
delay(10); // 延时去抖动处理
if(!(tmp & (0x01 << j))) // 再次判断是否有按键按下
{
while(!(tmp & (0x01 << j))); // 等待按键释放
if(keymap[i][j] >= '0' && keymap[i][j] <= '9') // 如果是数字键
{
if(op == 0) // 如果还没有操作符
{
num1 = num1 * 10 + (keymap[i][j] - '0'); // 计算第一个数
P0 = num1; // 显示第一个数
}
else // 如果已经有操作符
{
num2 = num2 * 10 + (keymap[i][j] - '0'); // 计算第二个数
P0 = num2; // 显示第二个数
}
}
else if(keymap[i][j] == 'C') // 如果是清除键
{
num1 = 0;
num2 = 0;
op = 0;
P0 = 0; // 清除显示
}
else if(keymap[i][j] == '=') // 如果是等于键
{
switch(op)
{
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = num1 / num2; break;
default: break;
}
num1 = result;
num2 = 0;
op = 0;
P0 = result; // 显示结果
}
else // 如果是操作符键
{
op = keymap[i][j];
}
}
}
}
}
}
void display(uchar num) // 显示数码管函数
{
switch(num)
{
case 0: LSA = 0, LSB = 0, LSC = 0, D0 = 1, D1 = 1, D2 = 1, D3 = 1; break;
case 1: LSA = 1, LSB = 0, LSC = 0, D0 = 0, D1 = 1, D2 = 1, D3 = 1; break;
case 2: LSA = 0, LSB = 1, LSC = 0, D0 = 1, D1 = 0, D2 = 1, D3 = 1; break;
case 3: LSA = 1, LSB = 1, LSC = 0, D0 = 0, D1 = 0, D2 = 1, D3 = 1; break;
case 4: LSA = 0, LSB = 0, LSC = 1, D0 = 1, D1 = 1, D2 = 0, D3 = 1; break;
case 5: LSA = 1, LSB = 0, LSC = 1, D0 = 0, D1 = 1, D2 = 0, D3 = 1; break;
case 6: LSA = 0, LSB = 1, LSC = 1, D0 = 1, D1 = 0, D2 = 0, D3 = 1; break;
case 7: LSA = 1, LSB = 1, LSC = 1, D0 = 0, D1 = 0, D2 = 0, D3 = 1; break;
case 8: LSA = 0, LSB = 0, LSC = 0, D0 = 1, D1 = 1, D2 = 1, D3 = 0; break;
case 9: LSA = 1, LSB = 0, LSC = 0, D0 = 0, D1 = 1, D2 = 1, D3 = 0; break;
default: break;
}
}
void main()
{
while(1)
{
scan_key(); // 扫描键盘
display(num1 % 10); // 显示个位数字
delay(5);
display(num1 / 10 % 10); // 显示十位数字
delay(5);
display(num1 / 100); // 显示百位数字
delay(5);
}
}
```
在以上代码中,我们通过扫描键盘来获取用户的输入,并根据不同的按键进行相应的计算操作。同时,我们还使用了数码管来显示计算结果。需要注意的是,由于使用了延时函数来控制数码管的显示,可能会导致按键响应速度变慢,因此可以考虑使用定时器来代替延时函数来控制数码管的显示。
阅读全文