找回密码
 立即注册
首页 业界区 安全 利用两个IO口检测6个按键

利用两个IO口检测6个按键

雌鲳签 昨天 12:53
用两个IO口扫描6个按键,原理图与扫描程序。
先贴上原理图:
1.png

以下为思路:
将两个IO口配置为上拉输出(STM32中)或者初始化输出高电平、
1、首先:IO1,IO2输出高电平。
S1按下,电流方向由R1流向GND,此时IO1为低电平。
2.png

S2按下,电流方向由R2流向GND,此时IO2为低电平。
3.png

S3按下,电流从两个电阻共同流向了GND,所以此时IO1,IO2都是低电平。

如果不是S1、S2、S3其中的按键按下,就需要翻转一下IO口电平做进一步判断了。
2、IO1输出低电平,读IO2电平
5.png

此时前3个按键按下的情况已经被排除,所以只会是后三个S4,S5,S6某个按键按下的情况。此时还需要分两种情况:
2.1 如果读IO2为低电平,此时应该是S4或者S6按下。

7.png

此时还无法立即判断出是S4还是S6按下了,所以需要再翻转引脚做进一步的判断,此时IO1输出高电平,IO2输出低电平,读IO1电平
8.png

当S4按下时,IO1为低电平。
9.png

当S6按下时,IO1电平不变仍为高。
10.png

此时就区分出了是S4还是S6按下了。
如果在IO1=0,IO2=1的情况下,没有检测到IO2变为低电平,则说明S5可能按下了,注意,是可能按下了,此时的IO口状态并不能区分出S5是否按下,因为此时的状态S5按下与松开IO2都为高电平。
此时需要再次将IO口翻转,判断S5是否按下了。
2.2 IO1输出高电平,IO2输出低电平,进行判断S5
11.png

读IO1,S5按下时,IO1为低电平。
12.png

按键扫描程序:
  1. unsigned char Key_Scan(void)
  2. {
  3.     unsigned char key_num = 0;
  4.     IO1 = 1; // IO口输出高电平
  5.     IO2 = 1; // IO口输出高电平
  6.     // 1、IO1 IO2都输出高,如果此时 S1 按下,IO1 呈现低电平
  7.     if (!IO1)
  8.     {
  9.         key_num = 1; // S1
  10.     }
  11.     // 如果此时 S2 按下,IO2 呈现低电平
  12.     else if (!IO2)
  13.     {
  14.         key_num = 2; // S2
  15.     }
  16.     // 如果此时 S3 按下,IO1 IO2 d都呈现低电平
  17.     else if (!IO1 && !IO2)
  18.     {
  19.         key_num = 3; // S3
  20.     }
  21.     // 2、没有检测到任何低电平,表明是 S4,S5,S6 其中之一被按下
  22.     else
  23.     {
  24.         // 2.1、IO1输出低电平,读取 IO2 的电平
  25.         IO1 = 0;
  26.         // 读取到 S2 为低电平,此时可能是 S4 或者 S6 按下,改变 IO 口输出进一步判断
  27.         if (!IO2)
  28.         {
  29.             // 这时不能立即判定是S4还是S6
  30.             IO1 = 1;
  31.             IO2 = 0; // 反向扫描
  32.             if (!IO1)
  33.             {
  34.                 key_num = 4; // S4
  35.             }
  36.             else
  37.             {
  38.                 key_num = 6; // S6
  39.             }
  40.         }
  41.         // 2.2 没有读取到低电平,那就只能是 S5 的状态了
  42.         else
  43.         {
  44.             // 需要进一步验证是否是 S5 按下了,因为 S5 没按下读取到的也是高电平
  45.             // 所以切换 IO 口电平状态进一步判断
  46.             IO1 = 1; // 释放总线
  47.             IO2 = 0; // 反向扫描
  48.             // IO1输出高电平,IO2输出低电平
  49.             // 读IO1,S5按下时,IO1为低电平
  50.             if (!IO1)
  51.             {
  52.                 key_num = 5; // S5
  53.             }
  54.         }
  55.         IO1 = 1;
  56.         IO2 = 1;
  57.     }
  58.     // 返回键值
  59.     return key_num;
  60. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册