这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机部队扫描键盘程序说明

共4条 1/1 1 跳转至

单片机部队扫描键盘程序说明

工程师
2020-07-12 21:15:48     打赏

一、部队扫描法

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

  在键盘中按键数量较多时,为了削减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--);

  }




助工
2020-07-15 15:00:50     打赏
2楼

很简洁的代码


工程师
2020-07-15 15:27:23     打赏
3楼

收藏了


工程师
2020-07-16 08:52:22     打赏
4楼

讲解的很清楚!


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]