“Arduino实验四:矩阵键盘实验”的版本间的差异

来自丢石头百科
 
(未显示同一用户的10个中间版本)
第1行: 第1行:
 +
== 模块介绍 ==
 +
=== 模块说明 ===
 +
矩阵键盘作为单片机的外接设备,当所需的按键数量较多时,为减少I/O口的占用,提高单片机的利用率,通常会将按键排成矩阵形式。即在矩阵键盘中,每条水平线与垂直线之间是通过一个按键连接的,这样单片机的一个8位端口就可以控制4*4=16个矩阵式按键,相较于直接用端口控制按键的方法多出一倍。而且当线路越多时,区别就越明显。
 +
 +
=== 扫描原理 ===
 +
矩阵键盘的结构相较于独立键盘复杂一些,单片机对其进行的识别也会复杂一些。矩阵键盘的扫描方式有两种:行列扫描法和逐行/逐列扫描法。行列扫描法也称为线反法,适用于矩阵键盘受单片机连续的I/O口控制的情况;逐行/逐列扫描法适用于矩阵键盘被接入了单片机的任意I/O口的情况。在实际单片机应用中更为常用的是行列扫描法。
 +
下面以4*4矩阵键盘为例,其中四条行线(第一行开始)接入单片机的P1.0-P1.3,四条列线(第一列开始)接入P1.4-P1.7。
 +
*'''行列扫描法'''
 +
**使P1口的高四位输出高电平,低四位输出低电平,此时列线被拉高,行线被拉低。假设有按键按下,则某一列的电平将会被拉低,此时读取P1口高四位(四个列)的电平,若读取到的值不全为高电平,说明有按键按下,可通过读取到的值判断是第几列。再使P1口的高四位输出低电平,低四位输出高电平,读取P1口低四位(四个行)的电平,此时读取到的值不再全为高电平,可通过读取到的值判断是第几行。将两次读取的结果组合起来就可以得到当前按键的键值,从而确定按下按键的位置。
 +
*'''逐行/逐列扫描法'''
 +
**逐行/逐列扫描法本质和行列扫描法类似,即给某一行/某一列输出低电平,其余七个全部为高电平,此时读取电平变化,若由低电平则说明有按键键按下,可根据读取的键值判断按键按下的位置。
 +
**具体操作如下:将第一行置为低电平,其余三行和四列置为高电平。读取列线的数据,若列线不全为高电平表示第一行有按键按下,可根据读取的数据判断是第一行的哪一列按键按下;若列线全为高电平,则将第二行置为低电平,其余三行和四列置为高电平,读取列线的数据,判断是否有按键按下。重复上述动作,并以此类推。
 +
 +
== 实验说明 ==
 
=== 实验现象 ===
 
=== 实验现象 ===
 
*串口输出按下按键的键值
 
*串口输出按下按键的键值
  
 
=== 电路连接 ===
 
=== 电路连接 ===
*
+
*[[File:Arduino实验四:矩阵键盘实验_接线1.png|500px]]
  
 
=== 主要程序 ===
 
=== 主要程序 ===
第39行: 第53行:
  
 
=== 相关下载 ===
 
=== 相关下载 ===
*
+
*[[:File:Arduino实验四:矩阵键盘实验.zip|Arduino实验四:矩阵键盘实验]]

2023年6月3日 (六) 15:29的最新版本

模块介绍

模块说明

矩阵键盘作为单片机的外接设备,当所需的按键数量较多时,为减少I/O口的占用,提高单片机的利用率,通常会将按键排成矩阵形式。即在矩阵键盘中,每条水平线与垂直线之间是通过一个按键连接的,这样单片机的一个8位端口就可以控制4*4=16个矩阵式按键,相较于直接用端口控制按键的方法多出一倍。而且当线路越多时,区别就越明显。

扫描原理

矩阵键盘的结构相较于独立键盘复杂一些,单片机对其进行的识别也会复杂一些。矩阵键盘的扫描方式有两种:行列扫描法和逐行/逐列扫描法。行列扫描法也称为线反法,适用于矩阵键盘受单片机连续的I/O口控制的情况;逐行/逐列扫描法适用于矩阵键盘被接入了单片机的任意I/O口的情况。在实际单片机应用中更为常用的是行列扫描法。 下面以4*4矩阵键盘为例,其中四条行线(第一行开始)接入单片机的P1.0-P1.3,四条列线(第一列开始)接入P1.4-P1.7。

  • 行列扫描法
    • 使P1口的高四位输出高电平,低四位输出低电平,此时列线被拉高,行线被拉低。假设有按键按下,则某一列的电平将会被拉低,此时读取P1口高四位(四个列)的电平,若读取到的值不全为高电平,说明有按键按下,可通过读取到的值判断是第几列。再使P1口的高四位输出低电平,低四位输出高电平,读取P1口低四位(四个行)的电平,此时读取到的值不再全为高电平,可通过读取到的值判断是第几行。将两次读取的结果组合起来就可以得到当前按键的键值,从而确定按下按键的位置。
  • 逐行/逐列扫描法
    • 逐行/逐列扫描法本质和行列扫描法类似,即给某一行/某一列输出低电平,其余七个全部为高电平,此时读取电平变化,若由低电平则说明有按键键按下,可根据读取的键值判断按键按下的位置。
    • 具体操作如下:将第一行置为低电平,其余三行和四列置为高电平。读取列线的数据,若列线不全为高电平表示第一行有按键按下,可根据读取的数据判断是第一行的哪一列按键按下;若列线全为高电平,则将第二行置为低电平,其余三行和四列置为高电平,读取列线的数据,判断是否有按键按下。重复上述动作,并以此类推。

实验说明

实验现象

  • 串口输出按下按键的键值

电路连接

  • Arduino实验四:矩阵键盘实验 接线1.png

主要程序

  for (int i = 0; i < 4; i++)
  {
    digitalWrite(C[i], LOW);
  }
  if (!digitalRead(R[0]) || !digitalRead(R[1]) || !digitalRead(R[2])|| !digitalRead(R[3]))
  {
    delay(10);
    if (!digitalRead(R[0]) || !digitalRead(R[1]) || !digitalRead(R[2])|| !digitalRead(R[3]))
    {
      digitalWrite(C[0], LOW);//扫描第一列
      digitalWrite(C[1], HIGH);
      digitalWrite(C[2], HIGH);
      digitalWrite(C[3], HIGH);
      for (int j = 0; j < 4; j++)
      {
        if (!digitalRead(R[j]))
        {
          Serial.print("S");
          Serial.print(j * 4 + 1);//在串口监视器中输出键盘编号
          Serial.println(" has been pressed");
          while (!digitalRead(R[j]));
          Serial.println("The button has been loosened");
        }
      }
....................

注意事项

  • 需将按键连接引脚配置为输入上拉模式,这样该引脚在没有外接信号输入的情况可下保持高电位,则写为:pinMode(9, INPUT_PULLUP);
  • 若单纯写为:pinMode(9, INPUT),则该引脚的状态会不稳定。出现0和1无规律变化,从而影响程序判断。

相关下载