首页 > 其他分享 >利用两个IO口检测6个按键

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

时间:2024-08-22 21:38:09浏览次数:9  
标签:检测 低电平 IO1 IO2 按下 S5 IO 按键

用两个IO口扫描6个按键,原理图与扫描程序。

先贴上原理图:

以下为思路:

将两个IO口配置为上拉输出(STM32中)或者初始化输出高电平、

1、首先:IO1,IO2输出高电平。

S1按下,电流方向由R1流向GND,此时IO1为低电平。

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


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


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

此时前3个按键按下的情况已经被排除,所以只会是后三个S4,S5,S6某个按键按下的情况。此时还需要分两种情况:

2.1 如果读IO2为低电平,此时应该是S4或者S6按下。


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

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

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

此时就区分出了是S4还是S6按下了。

如果在IO1=0,IO2=1的情况下,没有检测到IO2变为低电平,则说明S5可能按下了,注意,是可能按下了,此时的IO口状态并不能区分出S5是否按下,因为此时的状态S5按下与松开IO2都为高电平。

此时需要再次将IO口翻转,判断S5是否按下了。

2.2 IO1输出高电平,IO2输出低电平,进行判断S5

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

按键扫描程序:

unsigned char Key_Scan(void)
{
    unsigned char key_num = 0;

    IO1 = 1; // IO口输出高电平
    IO2 = 1; // IO口输出高电平

    // 1、IO1 IO2都输出高,如果此时 S1 按下,IO1 呈现低电平
    if (!IO1)
    {
        key_num = 1; // S1
    }
    // 如果此时 S2 按下,IO2 呈现低电平
    else if (!IO2)
    {
        key_num = 2; // S2
    }
    // 如果此时 S3 按下,IO1 IO2 d都呈现低电平
    else if (!IO1 && !IO2)
    {
        key_num = 3; // S3
    }
    // 2、没有检测到任何低电平,表明是 S4,S5,S6 其中之一被按下
    else
    {
        // 2.1、IO1输出低电平,读取 IO2 的电平
        IO1 = 0;

        // 读取到 S2 为低电平,此时可能是 S4 或者 S6 按下,改变 IO 口输出进一步判断
        if (!IO2)
        {
            // 这时不能立即判定是S4还是S6
            IO1 = 1;
            IO2 = 0; // 反向扫描

            if (!IO1)
            {
                key_num = 4; // S4
            }
            else
            {
                key_num = 6; // S6
            }
        }
        // 2.2 没有读取到低电平,那就只能是 S5 的状态了
        else
        {
            // 需要进一步验证是否是 S5 按下了,因为 S5 没按下读取到的也是高电平
            // 所以切换 IO 口电平状态进一步判断
            IO1 = 1; // 释放总线
            IO2 = 0; // 反向扫描

            // IO1输出高电平,IO2输出低电平
            // 读IO1,S5按下时,IO1为低电平
            if (!IO1)
            {
                key_num = 5; // S5
            }
        }
        IO1 = 1;
        IO2 = 1;
    }

    // 返回键值
    return key_num;
}

标签:检测,低电平,IO1,IO2,按下,S5,IO,按键
From: https://www.cnblogs.com/RAM-YAO/p/18374811

相关文章

  • JAVA IO流-小白版
    I/O流原理I/O是Input/Output的缩写,I/O流技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等;Java中对于数据的输入/输出操作以"流(stream)"的方式进行;Java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过方法输入或输出数据;输入input:读取外部......
  • 5. 概述(General description)
    5.概述(Generaldescription)5.1.Introduction5.1.Alow-ratewirelesspersonalareanetwork(LR-WPAN)isasimple,low-costcommunicationnetworkthatallowswirelessconnectivityinapplicationswithlimitedpowerandrelaxedthroughputrequirements.The......
  • 【App Service】在App Service中配置Virtual applications and directories,访问目录中
    问题描述在AppServiceWindows的环境中,想一个AppServices下部署多个站点,比如/根目录下,从wwwroot中读取项目文件,而/files则通过配置的虚拟目录来读取\mounts\sitefiles目录中的静态文件。在AppService的 ConfigurationPathMapping中配置如下:通过Kudu查看AppService......
  • localStorage、sessionStorage、Cookie的区别以及特点
    文章目录一、localStorage、sessionStorage、Cookie是什么?二、各自特点以及之间的区别1.`window.localStorage`2.`sessionStorage`3.`Cookie`三、写一个html页面以用来测试这三者不同的区别四、开始测试测试`localStorage`:测试`sessionStorage`:测试`Cookie`:总......
  • [题解] permutation
    [题解]Permutation解析一眼DP或者组合。70pts场上推的DP对于\((4,2,2)\),先把所有序列枚举出来:\[\begin{split}1\\\2\\1\\\3\\1\\\4\\--\\2\\\3\\2\\\4\\3\\\4\end{split}\]可以发现,对于分割线上的部分,可以看作\((3,1,1)\)的所有序列......
  • SQL 时间盲注 (injection 第十六关)
    简介    SQL注入(SQLInjection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中,然后这些输入被传递到数据库服务器上执行。攻击者可以利用这一漏洞执行......
  • Solution - Codeforces 1970G3 Min-Fund Prison (Hard)
    时间\(\mathcal{O}(\frac{n\sqrt{n}\logn}{\omega})\)空间\(\mathcal{O}(\frac{n\logn}{w})\)的爆标做法。首先无解当且仅当图联通且无割边。首先考虑加边的贡献。一个比较直观的感受就是只会尽可能少的加边,即加边到整个图连通。证明考虑删掉的边。如果加多了边导致删......
  • 数据库_DuckDB-extension-读取clickhouse数据
    duckdb练习学习sql的新选择-用duckdb代替mysql个人最佳分析数据库01.duckdb和依赖的parquet、httpfs插件02.测试duckdb是否能正常使用OSS,03.在postgresql中使用pg_duckdb访问oss内的parquet文件duckdb扩展duckdb_mysql.DuckDBtodirectlyreadandwri......
  • nvidia系列教程-AGX-Orin 确定gpio编号
    目录前言一、软件版本说明二、debugfs得到gpio三、gpio操作总结前言        NVIDIAJetsonAGXOrin是一款强大的嵌入式AI计算平台,适用于各种复杂的边缘计算任务。对于开发者来说,准确地控制和操作GPIO(通用输入输出)引脚是非常重要的。本文将详细介绍如......
  • 洛谷P1182 数列分段 Section II
    传送门:P1182数列分段SectionII消灭人类暴政,世界属于三体题目意思:题目说的很明白了思路:考虑部分分:20%的数据保证n<10,直接爆搜;40%的数据保证n<1000,n^2+前缀和搞定100%的数据:求每段最大和的最小值:明显的二分(n在10^5的范围也说明了这一点,因为二分查找的......