c51单片机矩阵键盘和lcd1602计算器程序
时间: 2024-01-03 16:04:42 浏览: 86
以下是基于 C51 单片机的矩阵键盘和 LCD1602 显示器的计算器程序,可以实现基本的加、减、乘、除四则运算:
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2 ^ 0; //定义RS引脚
sbit RW = P2 ^ 1; //定义RW引脚
sbit EN = P2 ^ 2; //定义EN引脚
uchar KeyValue; //定义键值变量
uchar KeyData; //定义键码变量
uchar KeySta; //定义键盘扫描状态
uchar FirstData; //定义第一个操作数
uchar SecondData; //定义第二个操作数
uchar ResultData; //定义结果变量
uchar Operator; //定义运算符变量
uchar Flag; //定义标志位变量
uchar code NumTable[] = { //定义字符集数组
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', '.', '='
};
uchar code KeyTable[] = { //定义键码数组
0xEE, 0xDE, 0xBE, 0x7E,
0xED, 0xDD, 0xBD, 0x7D,
0xEB, 0xDB, 0xBB, 0x7B,
0xE7, 0xD7, 0xB7, 0x77
};
void Delay() { //延时函数
uint i, j;
for (i = 0; i < 100; i++) {
for (j = 0; j < 1000; j++);
}
}
void WriteCommand(uchar cmd) { //写指令函数
RS = 0;
RW = 0;
EN = 0;
P0 = cmd;
Delay();
EN = 1;
Delay();
EN = 0;
}
void WriteData(uchar dat) { //写数据函数
RS = 1;
RW = 0;
EN = 0;
P0 = dat;
Delay();
EN = 1;
Delay();
EN = 0;
}
void InitLcd() { //LCD初始化函数
WriteCommand(0x38);
WriteCommand(0x0C);
WriteCommand(0x06);
WriteCommand(0x01);
}
void ScanKey() { //键盘扫描函数
uchar i, j;
KeySta = 0xFF;
for (i = 0; i < 4; i++) {
P1 = 0x0F;
P1 &= ~(0x01 << i);
for (j = 0; j < 4; j++) {
if (!(P1 & (0x10 << j))) {
KeySta = KeyTable[i * 4 + j];
return;
}
}
}
}
void GetKey() { //获取键值函数
ScanKey();
if (KeySta != 0xFF) {
KeyValue = KeySta;
KeySta = 0xFF;
for (KeyData = 0; KeyData < 16; KeyData++) {
if (KeyValue == KeyTable[KeyData]) {
break;
}
}
if (KeyData < 10) { //数字键
if (!Flag) {
FirstData = FirstData * 10 + KeyData;
WriteData('0' + KeyData); //在LCD上显示按键数字
} else {
SecondData = SecondData * 10 + KeyData;
WriteData('0' + KeyData);
}
} else if (KeyData == 10) { //小数点键
if (!Flag) {
Flag = 1;
WriteData('.');
} else {
WriteData('.');
}
} else if (KeyData == 11) { //等号键
switch (Operator) {
case '+':
ResultData = FirstData + SecondData;
break;
case '-':
ResultData = FirstData - SecondData;
break;
case '*':
ResultData = FirstData * SecondData;
break;
case '/':
if (SecondData == 0) {
WriteData('E');
WriteData('r');
WriteData('r');
WriteData('o');
WriteData('r');
return;
}
ResultData = FirstData / SecondData;
break;
}
WriteData('=');
WriteData('0' + ResultData / 10);
WriteData('0' + ResultData % 10);
} else { //运算符键
Operator = NumTable[KeyData];
WriteData(Operator);
Flag = 1;
}
}
}
void main() {
InitLcd();
WriteCommand(0x80);
Flag = 0;
FirstData = 0;
SecondData = 0;
while (1) {
GetKey();
}
}
```
其中,`ScanKey()` 函数用于扫描矩阵键盘,获取按键值;`GetKey()` 函数用于根据按键值进行相应的操作,包括数字输入、运算符输入、等号键计算等;`InitLcd()` 函数用于初始化 LCD 显示器;`WriteCommand()` 函数用于向 LCD 发送指令;`WriteData()` 函数用于向 LCD 发送数据。在 `GetKey()` 函数中,按键数字和运算符会显示在 LCD 显示器上,结果会以“= 数字”形式显示在 LCD 上。注意,除法运算需要进行除数为 0 的判断。
阅读全文