用stc89752RC/LE52RC芯片、单片机、OLED显示屏、4*4矩阵键盘做计算器的烧写代码,4*4键盘第一行从左到右的按键为7,8,9,+,第二行从左到右的按键为4,5,6,-,第三行从左到右的按键为1,2,3,*,第四行从左到右的按键为0,.,=,/。
时间: 2024-04-28 21:27:22 浏览: 10
好的,您需要编写一个计算器程序,可以使用 stc89752RC/LE52RC 芯片,单片机,OLED 显示屏和 4*4 矩阵键盘。以下是一个简单的参考代码,可以满足您的需求:
```c
#include <reg52.h>
// 定义按键对应的行列值
#define ROW P2
#define COL P1
// 定义键盘输入的值
char key[4][4] = {
{'7', '8', '9', '+'},
{'4', '5', '6', '-'},
{'1', '2', '3', '*'},
{'0', '.', '=', '/'}
};
// 显示器初始化
void OLED_Init() {
// ...
}
// 显示器显示
void OLED_Display(char *str) {
// ...
}
// 读取按键值
char Read_Key() {
char key_val = 0xFF;
ROW = 0xFF; // 按键扫描
if (COL != 0xFF) {
ROW = 0x0F;
if (COL != 0xFF) {
switch (COL) {
case 0xFE: key_val = key[0][0]; break; // 7
case 0xFD: key_val = key[0][1]; break; // 8
case 0xFB: key_val = key[0][2]; break; // 9
case 0xF7: key_val = key[0][3]; break; // +
case 0xEE: key_val = key[1][0]; break; // 4
case 0xDE: key_val = key[1][1]; break; // 5
case 0xBE: key_val = key[1][2]; break; // 6
case 0x7E: key_val = key[1][3]; break; // -
case 0xED: key_val = key[2][0]; break; // 1
case 0xDD: key_val = key[2][1]; break; // 2
case 0xBD: key_val = key[2][2]; break; // 3
case 0x7D: key_val = key[2][3]; break; // *
case 0xEB: key_val = key[3][0]; break; // 0
case 0xDB: key_val = key[3][1]; break; // .
case 0xBB: key_val = key[3][2]; break; // =
case 0x7B: key_val = key[3][3]; break; // /
default: break;
}
while (COL != 0xFF); // 按键松开检测
}
}
return key_val;
}
// 主函数
void main() {
char buf[10] = {0}; // 存储输入的值
int buf_idx = 0; // 存储输入值的下标
char key_val; // 存储读取到的按键值
float num1 = 0, num2 = 0, result = 0; // 存储计算结果
char operator = '+'; // 存储运算符号
OLED_Init(); // 初始化显示器
while (1) {
key_val = Read_Key(); // 读取按键值
if (key_val != 0xFF) {
if (key_val == '=') { // 当按下等于号时,进行计算
if (buf_idx > 0) {
num2 = atof(buf); // 将输入值转换为浮点数
switch (operator) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = num1 / num2; break;
}
sprintf(buf, "%.2f", result); // 将计算结果转换为字符串
OLED_Display(buf); // 显示计算结果
buf_idx = 0; // 重置输入值的下标
num1 = 0; // 重置第一个操作数
num2 = 0; // 重置第二个操作数
result = 0; // 重置计算结果
operator = '+'; // 重置运算符号
}
} else if (key_val == '+' || key_val == '-' || key_val == '*' || key_val == '/') { // 当按下运算符号时,进行运算
if (buf_idx > 0) {
num1 = atof(buf); // 将输入值转换为浮点数
operator = key_val; // 存储运算符号
buf_idx = 0; // 重置输入值的下标
}
} else { // 当按下数字或小数点时,将其添加到输入值中
if (buf_idx < 9) {
buf[buf_idx++] = key_val;
OLED_Display(buf); // 显示输入值
}
}
}
}
}
```
请注意,此代码仅供参考,实际情况可能需要根据您的具体需求进行修改。同时,您需要根据您的硬件配置和实际情况进行适当的调整。