0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

adc按键程序

分享:

以下是一个基于STM32的ADC按键程序示例(使用HAL库),采用中文注释说明:

#include "main.h"
#include "stm32f1xx_hal.h"

/* 定义ADC相关参数 */
#define ADC_HANDLE hadc1  // 使用的ADC句柄
#define ADC_CHANNEL ADC_CHANNEL_0  // 使用的ADC通道

/* 按键阈值定义(根据实际电路的分压值调整)*/
#define NO_KEY      4095  // 无按键(接近VCC)
#define KEY1_MIN    3000  // 按键1最小阈值
#define KEY1_MAX    3500
#define KEY2_MIN    2000
#define KEY2_MAX    2500
#define KEY3_MIN    1000
#define KEY3_MAX    1500
#define KEY4_MIN    500
#define KEY4_MAX    800

/* 按键编号枚举 */
typedef enum {
  KEY_NONE = 0,
  KEY_1,
  KEY_2,
  KEY_3,
  KEY_4
} Key_TypeDef;

/* 函数声明 */
Key_TypeDef ADC_GetKey(void);
void Key_Handler(Key_TypeDef key);

/* 主函数中的按键处理示例 */
int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_ADC1_Init();  // 初始化ADC

  Key_TypeDef currentKey = KEY_NONE;

  while (1) {
    currentKey = ADC_GetKey();  // 获取当前按键

    if (currentKey != KEY_NONE) {
      Key_Handler(currentKey);  // 处理按键
      HAL_Delay(100);  // 简单延时防抖
    }

    HAL_Delay(10);  // 循环延时
  }
}

/* 获取ADC按键值 */
Key_TypeDef ADC_GetKey(void) {
  uint32_t adcValue = 0;

  // 启动ADC转换
  HAL_ADC_Start(&ADC_HANDLE);

  // 等待转换完成
  if (HAL_ADC_PollForConversion(&ADC_HANDLE, 10) == HAL_OK) {
    adcValue = HAL_ADC_GetValue(&ADC_HANDLE);
  }
  HAL_ADC_Stop(&ADC_HANDLE);

  // 根据ADC值判断按键
  if (adcValue > KEY1_MIN && adcValue < KEY1_MAX) return KEY_1;
  else if (adcValue > KEY2_MIN && adcValue < KEY2_MAX) return KEY_2;
  else if (adcValue > KEY3_MIN && adcValue < KEY3_MAX) return KEY_3;
  else if (adcValue > KEY4_MIN && adcValue < KEY4_MAX) return KEY_4;

  return KEY_NONE;
}

/* 按键处理函数 */
void Key_Handler(Key_TypeDef key) {
  switch (key) {
    case KEY_1:
      // 执行按键1操作(例如点亮LED1)
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
      break;

    case KEY_2:
      // 执行按键2操作
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
      break;

    case KEY_3:
      // 执行按键3操作
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
      break;

    case KEY_4:
      // 执行按键4操作
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
      break;

    default:
      break;
  }
}

硬件电路说明 ?

  1. 电阻分压网络
    VCC  ┬───[10kΩ]───┬── ADC_IN
       │           │
      [按键1]      [4.7kΩ]
       │           │
      [按键2]      [2.2kΩ]
       │           │
      [按键3]      [1kΩ]
       │           │
      [按键4]      [470Ω]
       │           │
      GND         GND
  2. 按下不同按键时,ADC引脚会得到不同分压值

关键点说明 ?

  1. 阈值调整

    • 使用万用表测量每个按键的实际电压
    • 根据公式计算理论值:ADC值 = (分压电阻 / 总电阻) × 4095
    • 预留±10%的波动范围
  2. 防抖处理

    • 硬件:在ADC输入引脚加0.1uF电容滤波
    • 软件:连续3次检测相同按键才确认
      
      // 增强型防抖示例
      Key_TypeDef last_key = KEY_NONE;
      uint8_t stable_count = 0;

    Key_TypeDef temp = ADC_GetKey(); if (temp == last_key) { stable_count++; if (stable_count >= 3) { return temp; // 稳定检测 } } else { stable_count = 0; last_key = temp; }

  3. 校准建议

    // 上电时自动校准
    HAL_ADCEx_Calibration_Start(&ADC_HANDLE);
  4. 多通道支持

    • 如需检测更多按键,可使用多路ADC通道
    • 修改ADC初始化配置为扫描模式

实际使用时需根据开发板原理图调整:

  1. ADC通道选择
  2. GPIO引脚配置
  3. 电阻网络参数
  4. 按键处理逻辑

可通过串口打印调试信息辅助校准:

printf("ADC Value: %lu\r\n", adcValue);  // 查看实际ADC值

DshanMCU-R128s2 ADC按键配置方法

FreeRTOS平台上使用的按键ADC-KEY,采用的ADC模块为GPADC。 按键功能驱动的实现是通过ADC分压,使每个按键检测的电压值不同,从而实现区分不同的按键。按下或者弹起中断之后,通过

2023-12-22 19:11:39

ADC按键的相关资料分享

文章目录前言一、原理图二、由原理图得到的信息三、ADC按键初始化四、ADC按键应用函数五、ADC按键在主函数的应用方法前言本文是基于嵌入式开发板CT117E,stm32f103RBT6。一、原理图

远风 2022-01-11 06:56:03

采用RK2206芯片的ADC按键设计 含ADC驱动程序设计

对应一个GPIO口,进行高低电平输入检测。可是在GPIO口紧缺的情况下,不得不需要一个有效的解决方案,其中ADC检测实现按键功能是一种相对有效的解决方案。

2022-03-14 13:56:17

如何使用ADC实现多按键功能

节省IO口;本次介绍使用ADC实现多按键功能,通过采集ADC不同的值,然后判断是按键几按下?因此要求完成功能:实现一个ADC口完成对八个按键的检测,识别按键几按下,并将结果通过串口到串口助手上显示。(标准库和HAL库实现)单片机型号:STM32F103电路设计如下:.接线表设..

lique 2022-01-07 06:32:58

全志R128外设模块配置—ADC按键配置方法

FreeRTOS平台上使用的按键ADC-KEY,采用的ADC模块为GPADC。

2023-10-20 16:41:06

怎样去设计一个基于ADC模数转换的导航按键

/拨动导航按键时,A/D转换输入的模拟电压有0、100、200、300、400、500、700六种组合。二、A/D转换目标实现效果:程序主要是对ADC进行操作,并将寄存器相应位取出分别用8...

香脆面 2022-02-18 07:49:29

开发第1个LVGL程序与实现按键操作

开发第1个LVGL程序与实现按键操作

2025-01-07 13:49:18

ADC实现一个IO上挂多个按键

有时候做设计时,我们会遇到外部按键比较多,IO口不够用的情况。这时大部分人会考虑通过其它芯片扩展IO,或者直接换一个IO口足够的MCU。其实,还有个方法可以实现一个IO上挂多个按键———即采用ADC扫描。

2022-09-01 13:25:49

单片机按键扫描程序的设计

不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

2019-09-25 15:44:06

带32位MCU和高精度ADC的SoC产品----SD93F系列开发指南(一)

示例程序是以SD93F115-JBS芯片编写,包含了按键中断、RTC中断、SD ADC、SAR ADC、RTC、DAC、低压检测、LCD显示、休眠测试等多个基础功能综合的一个程序,配合按键中断进入不同的子程序进行演示。

2022-02-24 10:11:00

stm32单片机如何实现一个按键切换两个程序

stm32单片机如何实现一个按键切换两个程序? 作为一款功能强大的微控制器,STM32单片机可以支持多种应用场景,其中一个实用的功能是按键切换程序。通过按下按键,可以实现从一个程序切换到另外一个程序

2023-09-14 14:22:44

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】一个ADC实现多个按键检测

\platform\drivers\adc\hi_adc.c串口打印输出为了按键能够准确识别,我们首先要知道各个按键被按下时,ADC的值的范围,我们在程序中获取GPIO5 引脚处的ADC值,利用下面的函数进行

juby 2020-11-14 13:34:16

怎样使用ADC去检测按键输入引脚的电压值呢

本 demo 主要介绍一个基于 ADC按键功能,使用 ADC 检测按键输入引脚的电压值,根据不同的分压值判断相应的按键是否按下硬件连接本 demo 基于 BL706_AVB 开发板,连接方式如下

CDCNKA 2022-07-13 16:22:03

按键加减步进输出pwm的程序和一个ADC采集并用12864显示的程序合在一起后出错

Warning(s).Target not created我想把一个按键加减步进输出pwm的程序和一个ADC采集并用12864显示的程序合在一起 结果出现了上边的错误 在各个帖子里找到类似的错误 说是哪里的.h文件没有被注释 找了半天没找到 求解答 原程序附上12864电压显示.zip (3.03 MB )

sfsfs 2019-07-10 04:37:18

RK3288的ADC按键驱动怎么匹配的呢

在DTS文件中如何去添加自己ADC的资源呢?RK3288的ADC按键驱动怎么匹配的呢?

zmyecho 2022-03-04 07:41:41

单片机独立按键控制led灯程序

单片机独立按键控制LED灯程序 单片机独立按键控制LED灯程序是一种简单而有趣的电子学习项目,它通常由一个单片机芯片、一个LED灯和一个按键组成。这个项目的主要目的是让学习者学习如何利用单片机中断

2023-09-02 17:05:34

ADC口检测多个组合按键的方法

一般情况下,一个GPIO口只能连接一个按键,通过检测外部输入的高、低电平判断按键的开闭状态。

2023-03-21 10:13:12

采用ADC扫描实现一个IO上挂多个按键

有时候做设计时,我们会遇到外部按键比较多,IO口不够用的情况。这时大部分人会考虑通过其它芯片扩展IO,或者直接换一个IO口足够的MCU。其实,还有个方法可以实现一个IO上挂多个按键———即采用ADC扫描。

2023-08-11 09:16:29

基于FPGA的按键检测设计

在电子产品中我们会经常用到按键,比如电脑的键盘,手机的按键等等,按键就是人机交互的一种工具。 本文使用 FPGA 程序来检测与按键对应的 I/O口的电平高低来判断按键是否按下或松开,通过点亮/点灭开发板上相应的 LED 灯来指示按键的动作。   

2023-04-18 14:47:13

按键的外部中断学习

STM32 CubeMX学习:6. 按键的外部中断 系列文章目录前期的准备点亮 LED闪烁 LED定时器闪烁LEDPWM控制LED亮度常见的PWM设备按键的外部中断ADC模数转换串口收发未完待续

胡政鹏邮箱 2021-08-16 08:34:53

双轴遥感按键简介

在控制物体移动方面,像控制智能小车、平衡车、四轴飞控,双轴遥感按键远比按键要实用,而且引脚少,程序编写简单,是时候该放弃对按键的使用了,来看看双轴遥感按键吧!

2022-08-10 09:13:06

如何操作ADC去读取电压

本文简单介绍如何操作ADC去读取电压,并且实现开发板上3个ADC按键检测的功能。

2022-03-02 17:51:48

小凌派-RK2206OpenHarmony开发板例程系列之一:ADC按键案例

是一个按键对应一个GPIO口,进行高低电平输入检测。可是在GPIO口紧缺的情况下,不得不需要一个有效的解决方案,其中ADC检测实现按键功能是一种相对有效的解决方案。

2022-04-11 13:59:05

Hi3861 ADC驱动 如何使用开发板上的3个按键

本帖最后由 jf_39160458 于 2020-10-23 23:39 编辑 本节主要介绍Hi3861 的 ADC功能,顺便实现ADC按键检测。这里先看效果吧。查看开发板,可以看到除了复位

jf_39160458 2020-10-23 23:36:58

基于GPIO的按键板实现方案

介绍简单的ADC实现,需要IC提供一个额外的ADC。但出于IC成本的考虑,无法提供这个的ADC时,但提供了多个额外的GPIO(General Purpose Input Output:双向的:可以

2020-10-18 11:43:53

OpenHarmony轻量系统开发【6】驱动之ADC按键

摘要:本文简单介绍如何操作ADC去读取电压,并且实现开发板上3个ADC按键检测的功能适合群体:适用于润和Hi3861开发板,L0轻量系统驱动开发文中所有代码仓库:https://gitee.com

jf_39160458 2022-01-25 10:25:59

嵌入式Linux系统ADC按键驱动的相关资料分享

1 硬件基础我们的开发板上集成两个ADC按键,原理图如下,连接主控的SAR-ADC,SAR(Successive Approximation Register)即逐次逼近的算法,第一个通道:2

h1654155701.3944 2021-12-24 08:24:08

单片机实现按键的电路和程序设计资料说明

在单片机应用系统中,按键主要有两种形式:1、直接按键; 2、矩阵编码键盘。直接按键的每个按键都单独接到单片机的一个I/O口上,直接按键则通过判断按键端口的电位即可识别按键操作;而矩阵键盘通过行列交叉

2020-10-06 18:14:00

如何进行按键检测和按键FIFO的实现

! 一、如何进行按键检测 检测按键有中断方式和GPIO查询方式两种。推荐大家用GPIO查询方式。 1.从裸机的角度分析 中断方式 :中断方式可以快速地检测到按键按下,并执行相应的按键程序,但实际情况是由于按键的机械抖动特性,在程序进入中断

2021-11-03 09:13:26

加载更多
相关标签