写一个51单片机的4*4的矩阵式键盘
时间: 2023-10-15 07:02:11 浏览: 218
以下是51单片机的4*4矩阵式键盘的代码实现:
```c
#include <reg52.h>
#define uchar unsigned char
sbit row1 = P2^0; //定义行1引脚
sbit row2 = P2^1; //定义行2引脚
sbit row3 = P2^2; //定义行3引脚
sbit row4 = P2^3; //定义行4引脚
sbit col1 = P2^4; //定义列1引脚
sbit col2 = P2^5; //定义列2引脚
sbit col3 = P2^6; //定义列3引脚
sbit col4 = P2^7; //定义列4引脚
//读取按键函数
uchar keyread()
{
uchar keyvalue;
P2 = 0xf0; //将列引脚设置为高,行引脚设置为低
if(row1 == 0)
{
keyvalue = 1; //第一行第一列
}
else if(row2 == 0)
{
keyvalue = 2; //第二行第一列
}
else if(row3 == 0)
{
keyvalue = 3; //第三行第一列
}
else if(row4 == 0)
{
keyvalue = 4; //第四行第一列
}
P2 = 0xf0; //将列引脚设置为高,行引脚设置为低
if(col1 == 0)
{
keyvalue = 1; //第一列第一行
}
else if(col2 == 0)
{
keyvalue = 5; //第一列第二行
}
else if(col3 == 0)
{
keyvalue = 9; //第一列第三行
}
else if(col4 == 0)
{
keyvalue = 13; //第一列第四行
}
P2 = 0xf0; //将列引脚设置为高,行引脚设置为低
if(col1 == 1)
{
keyvalue = 0; //无按键按下
}
else if(col2 == 1)
{
keyvalue = 6; //第二列第二行
}
else if(col3 == 1)
{
keyvalue = 10; //第二列第三行
}
else if(col4 == 1)
{
keyvalue = 14; //第二列第四行
}
P2 = 0xf0; //将列引脚设置为高,行引脚设置为低
if(col1 == 1)
{
keyvalue = 0; //无按键按下
}
else if(col2 == 1)
{
keyvalue = 7; //第三列第二行
}
else if(col3 == 1)
{
keyvalue = 11; //第三列第三行
}
else if(col4 == 1)
{
keyvalue = 15; //第三列第四行
}
P2 = 0xf0; //将列引脚设置为高,行引脚设置为低
if(col1 == 1)
{
keyvalue = 0; //无按键按下
}
else if(col2 == 1)
{
keyvalue = 8; //第四列第二行
}
else if(col3 == 1)
{
keyvalue = 12; //第四列第三行
}
else if(col4 == 1)
{
keyvalue = 16; //第四列第四行
}
return keyvalue;
}
//主函数
void main()
{
uchar keyvalue;
while(1)
{
keyvalue = keyread(); //读取按键值
if(keyvalue != 0) //判断是否有按键按下
{
P1 = keyvalue; //将按键值输出到P1口
}
}
}
```
以上代码通过P2口控制行引脚和列引脚的高低电平,根据不同的高低电平组合判断按下的是哪个按键,并将按键值输出到P1口。
阅读全文