矩阵按键
- 1、 矩阵按键的原理图分析
- 2、 矩阵键盘的工作过程
- 3、编程实战
- 3.1、先通过LED灯进行按键测试
- 3.2、通过静态数码管显示键值
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 P2void 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 P2void 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 P2void 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 1111if(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;//静态数码管一直显示为0SMG = val[keynum];}}