您的位置 首页 解答

单片机键盘扫描办法两种

一、行列扫描法矩阵式键盘的结构与工作原理:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵…

一、队伍扫描法

矩阵式键盘的结构与作业原理:

在键盘中按键数量较多时,为了削减I/O口的占用,通常将按键排列成矩阵方式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在穿插处不直接连通,而是经过一个按键加以衔接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,并且线数越多,差异越显着,比方再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需求的键数比较多时,选用矩阵法来做键盘是合理的。

矩阵式结构的键盘显着比直接法要杂乱一些,辨认也要杂乱一些,上图中,列线经过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,一切的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,经过读入输入线的状况就可得知是否有键按下了。详细的辨认及编程办法如下所述。

矩阵式键盘的按键辨认办法

承认矩阵式键盘上何键被按下介绍一种“行扫描法”。

行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键辨认办法,如上图所示键盘,介绍进程如下。

判别键盘中有无键按下将悉数行线Y0-Y3置低电平,然后检测列线的状况。只需有一列的电平为低,则表明键盘中有键被按下,并且闭合的键坐落低电平线与4根行线相穿插的4个按键之中。若一切列线均为高电平,则键盘中无键按下。

判别闭合键地点的方位在承认有键按下后,即可进入承认详细闭合键的进程。其办法是:顺次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在承认某根行线方位为低电平后,再逐行检测各列线的电平状况。若某列为低,则该列线与置为低电平的行线穿插处的按键便是闭合的按键。

下面给出一个详细的比方:

8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3别离接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线构成16个相交点。

检测当时是否有键被按下。检测的办法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状况,若P1.0-P1.3为全“1”,则无键闭合,不然有键闭合。

去除键颤动。当检测到有键按下后,延时一段时间再做下一步的检测判别。

若有键被按下,应辨认出是哪一个键闭合。办法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合顺次输出:

P1.7 1 1 1 0

P1.6 1 1 0 1

P1.5 1 0 1 1

P1.4 0 1 1 1

二、队伍回转法

了解队伍键盘扫描得从硬件开端学习,咱们得知道队伍扫描是什么意思。在 单片机体系中为了扩展同一个 I/O 口的键盘个数,则选用了队伍式键盘接法,就 是穿插相接。所谓的“行”、“列”是咱们人为规则的,假如试着把列当作行,将行当作列是相同的。
这儿咱们规则 P1.0~P1.3为列,P1.7~P1.4 为行。 如图所示:

1、51比方
举一个比方吧。
榜首步:行线IO P1.7~P1.4置低电平,列线IO P1.0~P1.3置高电平
假定K1按下,那么P1.0=0 读P1口 P1=00001110
第二步:行线IO P1.7~P1.4置高电平,列线IO P1.0~P1.3置低电平
假定K1按下,那么P1.7=0 读P1口 P1=01110000
两个字节相加,得到新数据:01111110(榜首行 榜首列)

每按一个键咱们都得到不同的字节,比对咱们的字节是什么就可以知道键值是什么了。

/////////////////////////////////////////////////////////////////////
#include //包括头文件,一般状况不需求改动,头文件包括特别功用寄存器的界说
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*————————————————
函数声明
————————————————*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*————————————————
主函数
————————————————*/
void main()
{
uchar key;
P2=0x00; //1数码管亮 按相应的按键,会显现按键上的字符
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相应的键显现相对应的码值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
}
}
/*————————————————
键盘扫描程序
————————————————*/

一、队伍扫描法

矩阵式键盘的结构与作业原理:

在键盘中按键数量较多时,为了削减I/O口的占用,通常将按键排列成矩阵方式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在穿插处不直接连通,而是经过一个按键加以衔接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,并且线数越多,差异越显着,比方再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需求的键数比较多时,选用矩阵法来做键盘是合理的。

矩阵式结构的键盘显着比直接法要杂乱一些,辨认也要杂乱一些,上图中,列线经过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,一切的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,经过读入输入线的状况就可得知是否有键按下了。详细的辨认及编程办法如下所述。

矩阵式键盘的按键辨认办法

承认矩阵式键盘上何键被按下介绍一种“行扫描法”。

行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键辨认办法,如上图所示键盘,介绍进程如下。

判别键盘中有无键按下将悉数行线Y0-Y3置低电平,然后检测列线的状况。只需有一列的电平为低,则表明键盘中有键被按下,并且闭合的键坐落低电平线与4根行线相穿插的4个按键之中。若一切列线均为高电平,则键盘中无键按下。

判别闭合键地点的方位在承认有键按下后,即可进入承认详细闭合键的进程。其办法是:顺次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在承认某根行线方位为低电平后,再逐行检测各列线的电平状况。若某列为低,则该列线与置为低电平的行线穿插处的按键便是闭合的按键。

下面给出一个详细的比方:

8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3别离接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线构成16个相交点。

检测当时是否有键被按下。检测的办法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状况,若P1.0-P1.3为全“1”,则无键闭合,不然有键闭合。

去除键颤动。当检测到有键按下后,延时一段时间再做下一步的检测判别。

若有键被按下,应辨认出是哪一个键闭合。办法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合顺次输出:

P1.7 1 1 1 0

P1.6 1 1 0 1

P1.5 1 0 1 1

P1.4 0 1 1 1

二、队伍回转法

了解队伍键盘扫描得从硬件开端学习,咱们得知道队伍扫描是什么意思。在 单片机体系中为了扩展同一个 I/O 口的键盘个数,则选用了队伍式键盘接法,就 是穿插相接。所谓的“行”、“列”是咱们人为规则的,假如试着把列当作行,将行当作列是相同的。
这儿咱们规则 P1.0~P1.3为列,P1.7~P1.4 为行。 如图所示:

1、51比方
举一个比方吧。
榜首步:行线IO P1.7~P1.4置低电平,列线IO P1.0~P1.3置高电平
假定K1按下,那么P1.0=0 读P1口 P1=00001110
第二步:行线IO P1.7~P1.4置高电平,列线IO P1.0~P1.3置低电平
假定K1按下,那么P1.7=0 读P1口 P1=01110000
两个字节相加,得到新数据:01111110(榜首行 榜首列)

每按一个键咱们都得到不同的字节,比对咱们的字节是什么就可以知道键值是什么了。

/////////////////////////////////////////////////////////////////////
#include //包括头文件,一般状况不需求改动,头文件包括特别功用寄存器的界说
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*————————————————
函数声明
————————————————*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*————————————————
主函数
————————————————*/
void main()
{
uchar key;
P2=0x00; //1数码管亮 按相应的按键,会显现按键上的字符
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相应的键显现相对应的码值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
}
}
/*————————————————
键盘扫描程序
————————————————*/
uchar keyscan(void) //键盘扫描函数,运用队伍回转扫描法
{
uchar cord_h,cord_l;//队伍值中心变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当时列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最终组合码值
}
}return(0xff); //回来该值
}
/*————————————————
延时程序
————————————————*/
void delay(uint i) //延时函数
{
while(i–);
}

cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当时列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最终组合码值
}
}return(0xff); //回来该值
}
/*————————————————
延时程序
————————————————*/
void delay(uint i) //延时函数
{
while(i–);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/266960.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部