一、部队扫描法
矩阵式键盘的构造与作业原理:
在键盘中按键数量较多时,为了削减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--);
}