c51单片机 4*4键盘键值显示出键值对应的10进制数
时间: 2023-07-29 16:07:17 浏览: 136
假设你使用的是常见的4x4矩阵键盘,其中有16个键。我们可以使用C51单片机的输入/输出口来读取键盘按键值,并将其转换为十进制数。
以下是一个简单的程序示例,它可以实现读取键盘按键值,并将其转换为对应的十进制数并在数码管上显示出来。请注意,该程序仅适用于常见的4x4矩阵键盘,并且仅能显示单个数字(0-9)。
```
#include <reg51.h>
#define KEYPAD_PORT P1 // 定义键盘接口
sbit ROW1 = P2^0; // 定义行引脚
sbit ROW2 = P2^1;
sbit ROW3 = P2^2;
sbit ROW4 = P2^3;
sbit COL1 = P2^4; // 定义列引脚
sbit COL2 = P2^5;
sbit COL3 = P2^6;
sbit COL4 = P2^7;
void delay(unsigned int time); // 延时函数
unsigned char get_key(void); // 获取按键值函数
void display(unsigned char num); // 在数码管上显示数字
void main()
{
unsigned char key_value;
while(1)
{
key_value = get_key(); // 获取按键值
if(key_value != 0xFF) // 如果有按键按下
{
display(key_value); // 在数码管上显示对应的十进制数
}
}
}
unsigned char get_key(void)
{
unsigned char row, col;
KEYPAD_PORT = 0x0F; // 先将行引脚置为高电平,列引脚置为低电平
col = KEYPAD_PORT & 0x0F; // 读取列引脚的状态
if(col == 0x0F) // 如果列引脚仍然为高电平,说明没有按键按下
{
return 0xFF;
}
// 依次循环检测每一行
ROW1 = 0;
ROW2 = 1;
ROW3 = 1;
ROW4 = 1;
delay(5);
col = KEYPAD_PORT & 0x0F;
if(col != 0x0F) // 如果此时列引脚有低电平,说明该行有按键按下
{
switch(col)
{
case 0x07: return 1; // 第一列
case 0x0B: return 2; // 第二列
case 0x0D: return 3; // 第三列
case 0x0E: return 10; // 第四列
}
}
ROW1 = 1;
ROW2 = 0;
ROW3 = 1;
ROW4 = 1;
delay(5);
col = KEYPAD_PORT & 0x0F;
if(col != 0x0F)
{
switch(col)
{
case 0x07: return 4;
case 0x0B: return 5;
case 0x0D: return 6;
case 0x0E: return 11;
}
}
ROW1 = 1;
ROW2 = 1;
ROW3 = 0;
ROW4 = 1;
delay(5);
col = KEYPAD_PORT & 0x0F;
if(col != 0x0F)
{
switch(col)
{
case 0x07: return 7;
case 0x0B: return 8;
case 0x0D: return 9;
case 0x0E: return 12;
}
}
ROW1 = 1;
ROW2 = 1;
ROW3 = 1;
ROW4 = 0;
delay(5);
col = KEYPAD_PORT & 0x0F;
if(col != 0x0F)
{
switch(col)
{
case 0x07: return 14;
case 0x0B: return 0;
case 0x0D: return 15;
case 0x0E: return 13;
}
}
return 0xFF;
}
void display(unsigned char num)
{
P0 = num; // 将数字写入P0口
delay(50); // 延时一段时间
}
void delay(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
{
for(j=0;j<125;j++)
{
}
}
}
```
在上述代码中,我们使用了一个名为“get_key”的函数来获取键盘按键值。该函数首先将行引脚置为高电平,列引脚置为低电平,然后读取每一列的状态。如果所有列引脚都为高电平,则说明没有按键按下。否则,我们将依次检测每一行,以确定哪一行的按键被按下。
在检测行引脚状态时,我们将当前行引脚置为低电平,其他行引脚置为高电平,并读取每一列的状态。如果某一列引脚为低电平,则说明对应的按键被按下。通过这种方法,我们可以确定被按下的按键是哪一个,并返回其对应的十进制数。
在主函数中,我们使用一个while循环来不断读取键盘按键值并在数码管上显示出来。如果没有按键按下,则程序会一直等待,直到有按键按下为止。
阅读全文