51单片机实现矩阵按键计算器功能显示在LCD上代码
时间: 2024-03-18 22:38:58 浏览: 37
以下是一个简单的51单片机矩阵按键计算器功能的示例代码,可将结果显示在LCD上。
```c
#include <reg52.h>
#include <intrins.h>
#define LCD_DB P0
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
sbit KEY_ROW1 = P1^0;
sbit KEY_ROW2 = P1^1;
sbit KEY_ROW3 = P1^2;
sbit KEY_ROW4 = P1^3;
sbit KEY_COL1 = P1^4;
sbit KEY_COL2 = P1^5;
sbit KEY_COL3 = P1^6;
sbit KEY_COL4 = P1^7;
void delay(unsigned int ms) { // 延迟函数
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++) {
}
}
}
void LCD_WriteCommand(unsigned char cmd) { // 写命令到LCD
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DB = cmd;
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
void LCD_WriteData(unsigned char dat) { // 写数据到LCD
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DB = dat;
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
void LCD_Init() { // LCD初始化函数
LCD_WriteCommand(0x38); // 8位数据口,2行显示,5x8点阵字符
LCD_WriteCommand(0x0c); // 开显示,光标不显示,不闪烁
LCD_WriteCommand(0x06); // 光标右移,字符不移动
LCD_WriteCommand(0x01); // 清屏
}
unsigned char KEY_GetValue() { // 获取按键值
unsigned char value = 0xff;
KEY_ROW1 = 0;
if (KEY_COL1 == 0) {
value = 1;
}
if (KEY_COL2 == 0) {
value = 2;
}
if (KEY_COL3 == 0) {
value = 3;
}
if (KEY_COL4 == 0) {
value = 0xa;
}
KEY_ROW1 = 1;
KEY_ROW2 = 0;
if (KEY_COL1 == 0) {
value = 4;
}
if (KEY_COL2 == 0) {
value = 5;
}
if (KEY_COL3 == 0) {
value = 6;
}
if (KEY_COL4 == 0) {
value = 0xb;
}
KEY_ROW2 = 1;
KEY_ROW3 = 0;
if (KEY_COL1 == 0) {
value = 7;
}
if (KEY_COL2 == 0) {
value = 8;
}
if (KEY_COL3 == 0) {
value = 9;
}
if (KEY_COL4 == 0) {
value = 0xc;
}
KEY_ROW3 = 1;
KEY_ROW4 = 0;
if (KEY_COL1 == 0) {
value = 0xe;
}
if (KEY_COL2 == 0) {
value = 0;
}
if (KEY_COL3 == 0) {
value = 0xf;
}
if (KEY_COL4 == 0) {
value = 0xd;
}
KEY_ROW4 = 1;
return value;
}
void main() {
unsigned char key, op = 0, i = 0, j = 0;
unsigned int num1 = 0, num2 = 0, result = 0;
LCD_Init();
while (1) {
key = KEY_GetValue();
if (key != 0xff) {
if (key >= 0 && key <= 9) {
if (op == 0) {
num1 = num1 * 10 + key;
LCD_WriteData(key + '0');
i++;
} else {
num2 = num2 * 10 + key;
LCD_WriteData(key + '0');
j++;
}
} else if (key >= 0xa && key <= 0xd) {
op = key;
if (op == 0xa) {
LCD_WriteData('+');
} else if (op == 0xb) {
LCD_WriteData('-');
} else if (op == 0xc) {
LCD_WriteData('*');
} else if (op == 0xd) {
LCD_WriteData('/');
}
} else if (key == 0xe) {
num1 = 0;
num2 = 0;
result = 0;
i = 0;
j = 0;
op = 0;
LCD_WriteCommand(0x01);
} else if (key == 0xf) {
if (op == 0xa) {
result = num1 + num2;
} else if (op == 0xb) {
result = num1 - num2;
} else if (op == 0xc) {
result = num1 * num2;
} else if (op == 0xd) {
result = num1 / num2;
}
LCD_WriteCommand(0xc0);
LCD_WriteData('=');
while (result != 0) {
LCD_WriteData(result % 10 + '0');
result /= 10;
}
}
}
delay(10);
}
}
```
这个代码中,我们使用了一个4*4的矩阵按键来输入数字和操作符,使用LCD来显示输入和计算结果。按下数字按键时,将数字添加到操作数中,并在LCD上显示该数字;按下操作符按键时,将其记录为当前操作符;按下“C”键时,清除数据和LCD屏幕;按下“=”键时,进行计算并在LCD屏幕上显示结果。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)