给一段利用51单片机实现利用4*4矩阵键盘自定义计算器的输入按键,数码管作为计算器的输入显示,实现简单的加减乘除
时间: 2024-02-12 18:08:01 浏览: 93
比较简短的一种实现加减乘除计算功能的计算器,基于51单片机,使用数码管显示.zip
好的,下面是利用 51 单片机实现自定义计算器的输入按键、数码管作为输入显示、实现简单的加减乘除的代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
// 数码管显示0~9 A~F的值
uchar num[4] = {0}; // 用于存储按键输入的数值
uchar oper = 0; // 用于存储操作符
uchar cnt = 0; // 记录按键输入的数量
bit flag = 0; // 用于判断是否需要清空数值
// 延时函数
void Delay100ms() {
uint i, j;
for (i = 0; i < 30; i++) {
for (j = 0; j < 1000; j++);
}
}
// 数码管显示函数
void Display() {
uchar i;
for (i = 0; i < 4; i++) {
P2 = 0x00;
switch (i) {
case 0: P0 = table[num[0]]; break;
case 1: P0 = table[num[1]]; break;
case 2: P0 = table[num[2]]; break;
case 3: P0 = table[num[3]]; break;
}
P2 = 0x01 << i;
Delay100ms();
}
}
// 按键扫描函数
uchar KeyScan() {
uchar val = 0xff;
P3 = 0x0f;
if (P3 != 0x0f) {
Delay100ms();
if (P3 != 0x0f) {
P3 = 0x0f;
switch (P3) {
case 0x07: val = 0; break;
case 0x0b: val = 1; break;
case 0x0d: val = 2; break;
case 0x0e: val = 3; break;
}
P3 = 0xf0;
switch (P3) {
case 0x70: val = val; break;
case 0xb0: val += 4; break;
case 0xd0: val += 8; break;
case 0xe0: val += 12; break;
}
}
}
return val;
}
// 主函数
void main() {
while (1) {
if (flag) {
num[0] = 0;
num[1] = 0;
num[2] = 0;
num[3] = 0;
cnt = 0;
oper = 0;
flag = 0;
}
Display();
if (cnt == 4) {
switch (oper) {
case 1: num[0] += num[1]; break;
case 2: num[0] -= num[1]; break;
case 3: num[0] *= num[1]; break;
case 4: num[0] /= num[1]; break;
}
num[1] = num[2];
num[2] = num[3];
num[3] = 0;
cnt = 3;
oper = 0;
flag = 1;
}
uchar val = KeyScan();
if (val != 0xff) {
if (val >= 0 && val <= 9) { // 数字键
if (cnt == 0 || oper == 0) {
num[cnt++] = val;
} else {
num[cnt++] = val;
flag = 1;
}
} else if (val >= 10 && val <= 13) { // 加减乘除键
if (oper == 0 && cnt == 1) {
oper = val - 9;
}
}
}
}
}
```
这段代码实现了按键输入(0~9数字键和加减乘除键)和数码管的输入显示,同时实现了简单的加减乘除运算。
阅读全文