大家好,欢迎来到IT知识分享网。
一、状态机检测单个按键(仅使用一个IO口)高低电平消抖
设计在按下时候执行按键动作(自己写的,仅供参考)
二、ADC采样可以通过单个IO口采样电压判断一排按键哪个按下,并用状态机消抖
ADC采样能处理多个按键的原因主要在于其模数转换的特性以及电阻分压的原理。
具体来说:
模数转换特性:ADC(模拟到数字转换器)能够将模拟信号转换为数字信号。在按键检测中,每个按键被按下时,通过电阻分压网络产生的模拟电压值是不同的。ADC能够精确测量这些不同的电压值,并将其转换为数字信号,从而识别出是哪个按键被按下。
电阻分压原理:通过为每个按键配置不同的分压电阻,当按键被按下时,与ADC引脚相连的点的电压会随着参与分压的电阻变化而变化。只要确保每个按键按下后的电压处于不同的区间,就可以通过ADC采样到的电压值来判断是哪个按键被按下。
提高IO口利用率:在传统的按键检测方法中,每个按键通常占用一个GPIO口。然而,在IO口资源有限的情况下,使用ADC和电阻分压网络可以在一个ADC端口上检测多个按键,从而大大提高IO口的利用率。
软件处理:为了更准确地识别按键,通常需要在软件上进行一些处理,如多次采样并取平均值以减少噪声和抖动的影响。同时,还需要根据ADC的分辨率和精度来合理设计电阻分压网络,确保按键之间的电压差异足够大,以便ADC能够准确区分。
值得注意的是,单个IO口的按键通常是上拉式或者下拉式,按下就能通过GPIO_Read读取到对应引脚IDR寄存器的电平状态,非零即一,然而对于ADC采样却不可以,对于3.3V单片机,0到0.8V可以认为是低电平0,2.2V到3.3V认为是高电平1,对于ADC采样的单个IO口的一排按键无法使用,所以需要采用ADC滤波算法判断是哪个按键按下。
ADC按键消抖状态机流程:(自己写的,仅供参考)
三、补充函数指针部分内容,将用两个代码示例说明
在C语言中,当你需要将一个函数作为参数传递给另一个函数时(即使用函数指针),通常情况下,传递函数名即可,不需要显式地使用取地址符号&。编译器会自动将函数名解析为对应的函数指针。
#include <stdio.h> // 定义一个函数指针类型 FuncPtr,指向返回类型为void,参数为两个int的函数 typedef void (*FuncPtr)(int, int); // 一个使用函数指针的函数 void executeFunction(FuncPtr func, int a, int b) { func(a, b); } // 一个要被传递的函数 void myFunction(int a, int b) { printf("a + b = %d\n", a + b); } int main() { // 调用executeFunction,传递myFunction作为参数 executeFunction(myFunction, 5, 10); return 0; }
在这个例子中,executeFunction函数接受一个函数指针FuncPtr作为参数。在调用executeFunction时,直接传递了myFunction而没有使用&myFunction。这是因为在C和C++中,函数名在大多数上下文中(包括这种情况)会被自动解释为函数指针。
这两种方式在效果上是等价的。
第一个例子:不取&符号
第二个例子:取&符号
typedef重命名函数指针
四、用typedef重命名函数指针以及使用
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136214.html