自学内容网 自学内容网

15:矩阵按键

1、 矩阵按键的原理图分析

在这里插入图片描述

(1)横向和纵向分割
(2)按键两端分别接不同的IO引脚
(3)按键的物理作用不变:按下接通电路,弹起断开电路
把上面的图简化如下图:
在这里插入图片描述
由图得出2个不同的引脚控制一个按键。如8号引脚和4号引脚控制按键S1。

2、 矩阵键盘的工作过程

(1)单片机CPU先输出(IO引脚输出)0x0f(0000 1111)
既8~5为0,4~1为1。
(2)若没有按键按下,则单片机CPU收到的依然是0x0f。假如S1按键按下,则4号引脚的高电平1会变成低电平0,则CPU收到的是 0x07(0000 0111),但是S1,S5,S9,S13按下后也会使4号引脚变成低电平0。
(3)单片机CPU继续输出0xf0(1111 0000),既8~5为1 ,4~1为0。假如S1按键按下,则8号引脚的高电平1会变成低电平0,则CPU收到的是 0x70(0111 0000),但是S1,S2,S3,S4按下都会使8号引脚变成低电平0。
(4)从收到的数据(IO引脚输入)判断哪一列按下了。
(5)综合2次得到的行和列位置,计算出键值。

3、编程实战

3.1、先通过LED灯进行按键测试

按键接P2端口,从上到下是P2.7~P2.0

#include <REGX51.H>

#define LED P0
#define KEY P2


void main(void)
{
KEY = 0X0F;    //从P2端口输出(0000 1111)
if(KEY != 0X0F) //代表由按键按下
{
LED = KEY;
}
}

0000 1111
K1按下:0000 0111
K2按下:0000 1011
K3按下:0000 1101
K4按下:0000 1110
由次可以类推出:
8位二进制,后4位代表列。

#include <REGX51.H>

#define LED P0
#define KEY P2


void main(void)
{
KEY = 0Xf0;    //从P2端口输出(1111 0000)
if(KEY != 0Xf0) //代表由按键按下,与P2连接的引脚输入不是1111 0000,
{
LED = KEY;
}
}

1111 0000
K1按下:0111 0000
K5按下:1011 0000
K9按下:1101 0000
K13按下:1110 0000
由次可以类推出:
8位二进制,前4位代表行。

3.2、通过静态数码管显示键值

按键接P2端口,从上到下是P2.7~P2.0

#include <REGX51.H>

#define SMG P0
#define KEY P2

void delay10ms(void)  //消抖的延迟函数
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}

void main(void)
{
  while(1)
{
unsigned char hang,lie,keynum;
unsigned char val[16] = {0xc0, 0xf9, 0xa4, 0xb0,
0x99, 0x92, 0x82, 0xf8, 
0x80, 0x90, 0x88, 0x83, 
0xc6, 0xa1, 0x86, 0x8e};

/******判断是哪一行按下******/
KEY = 0Xf0;    //从P2端口输出(0000 1111)
if(KEY != 0Xf0) //代表有按键按下
{
   delay10ms();//消抖
switch(KEY)
{
case 0x70:
     hang = 1;
break;
case 0xb0:
     hang = 2;
break;
case 0xd0:
     hang = 3;
break;
case 0xe0:
     hang = 4;
break;
default:
break;
}

/******判断是哪一列按下******/
KEY = 0x0F;//p2端口输出0000 1111
if(KEY != 0x0f)//代表有按键按下
  {
switch(KEY)
{
case 0x07:
     lie = 1;
break;
case 0x0b:
     lie = 2;
break;
case 0x0d:
     lie = 3;
break;
case 0x0e:
     lie = 4;
break;
default:
break;
}
}
keynum = (hang - 1)*4 + lie;
}
else//没有任何按键按下
keynum = 0;//静态数码管一直显示为0
 SMG = val[keynum];
 }

}

原文地址:https://blog.csdn.net/qq_51284092/article/details/136039960

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!