给我一段实现51单片机利用4*4矩阵键盘自定义计算器,数码管显示计算器的输入输出,实现简单加减乘除功能的c语言代码
时间: 2024-02-12 21:05:53 浏览: 73
C51单片机实现加减乘除计算器
5星 · 资源好评率100%
好的,以下是一段51单片机的代码,可以实现利用4*4矩阵键盘自定义计算器,数码管显示计算器的输入输出,实现简单加减乘除功能:
```c
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1 = P2^0; // 定义数码管第1位
sbit D2 = P2^1; // 定义数码管第2位
sbit D3 = P2^2; // 定义数码管第3位
sbit D4 = P2^3; // 定义数码管第4位
uchar code num_code[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管显示码表
uchar key_value; // 定义按键值
uint result; // 定义计算结果
uchar op; // 定义运算符
uchar num1, num2; // 定义操作数1和操作数2
void delay(uint i) // 延时函数
{
uint j;
for(;i>0;i--)
for(j=110;j>0;j--);
}
void display(uint num) // 数码管显示函数
{
D1 = num_code[num/1000];
D2 = num_code[num/100%10];
D3 = num_code[num/10%10];
D4 = num_code[num%10];
}
uchar get_key() // 获取按键函数
{
uchar temp = 0;
P1 = 0xf0; // 设置P1的低4位为输出,高4位为输入
if(P1 != 0xf0) // 检测是否有按键按下
{
delay(10); // 延时去抖动
if(P1 != 0xf0) // 再次检测是否有按键按下
{
P1 = 0xfe; // 检测第一行
if(P1 != 0xfe)
temp = 1;
P1 = 0xfd; // 检测第二行
if(P1 != 0xfd)
temp = 2;
P1 = 0xfb; // 检测第三行
if(P1 != 0xfb)
temp = 3;
P1 = 0xf7; // 检测第四行
if(P1 != 0xf7)
temp = 4;
}
}
P1 = 0x0f; // 设置P1的高4位为输出,低4位为输入
if(P1 != 0x0f) // 检测是否有按键按下
{
delay(10); // 延时去抖动
if(P1 != 0x0f) // 再次检测是否有按键按下
{
P1 = 0x7f; // 检测第一列
if(P1 != 0x7f)
temp += 0;
P1 = 0xbf; // 检测第二列
if(P1 != 0xbf)
temp += 4;
P1 = 0xdf; // 检测第三列
if(P1 != 0xdf)
temp += 8;
P1 = 0xef; // 检测第四列
if(P1 != 0xef)
temp += 12;
}
}
return temp; // 返回按键值
}
void main()
{
while(1)
{
key_value = get_key(); // 获取按键值
if(key_value) // 如果有按键按下
{
delay(10); // 延时去抖动
if(key_value == 12) // 如果按下清零键
{
result = 0;
num1 = 0;
num2 = 0;
op = 0;
}
else if(key_value >= 1 && key_value <= 9) // 如果按下数字键
{
if(op == 0) // 如果是第一个操作数
{
num1 = num1*10 + key_value;
display(num1);
}
else // 如果是第二个操作数
{
num2 = num2*10 + key_value;
display(num2);
}
}
else if(key_value >= 13 && key_value <= 15) // 如果按下加、减、乘键
{
op = key_value;
}
else if(key_value == 16) // 如果按下除键
{
op = '/';
}
else if(key_value == 11) // 如果按下等于键
{
if(op == '+') // 加法运算
result = num1 + num2;
else if(op == '-') // 减法运算
result = num1 - num2;
else if(op == '*') // 乘法运算
result = num1 * num2;
else if(op == '/') // 除法运算
result = num1 / num2;
display(result); // 显示结果
num1 = result;
num2 = 0;
op = 0;
}
}
}
}
```
这段代码中,我们首先定义了四个数码管引脚和一个4*4矩阵键盘引脚,然后在主函数中不断检测键盘是否有按键按下。如果检测到按键按下,则根据按键值进行相应的操作,包括数字输入、运算符输入、等于键和清零键。在输入数字时,我们需要判断是第一个操作数还是第二个操作数,以便进行相应的操作。在输入运算符时,我们将运算符存储在op变量中。在按下等于键时,我们根据op变量执行相应的运算,并将结果显示在数码管上。需要注意的是,在检测到按键时,我们加了一个延时去抖动,以确保按键值只读取一次。
阅读全文