嵌入式--static在按键电路中的作用

按键扫描与连按模式实现
该代码段展示了如何使用C语言实现按键扫描功能,包括支持和不支持连按模式。通过`static`关键字管理变量`key_up`,在mode为1时启用连按模式,模式为0时禁用。在连按模式下,即使按键释放,`key_up`仍会迅速重置为1,允许连续响应按键;而在非连按模式下,按键释放后`key_up`不再重置,避免多次返回按键值。此外,代码还包含了去抖动处理,以提高按键检测的稳定性。

函数原理:

1.用static关键字定义的变量,其值会保存,下次再执行这个函数的时候不会被初始化 。

2.如果mode==1,则是支持连按模式。key_up=0之后key_up也会立刻变成1,保证继续返回键值

3.如果mode==0,则是不支持连按模式。key_up=0之后key_up无法变成1,无法继续返回键值。

u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//static修饰的变量,只进入一下,下次则不进入
	if(mode)key_up=1;  //mode为1就是支持连按,否则不支持。		  
	if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}
    else if(KEY0==1&&KEY1==1&&WK_UP==0)
    key_up=1; //如果没有按键按下,保证key_up的值为1,为下次按键做准备。	    
 	return 0;// 无按键按下
}

<think>嗯,用户询问嵌入式系统中de-glitch的概念和作用。这属于硬件信号处理范畴,需要结合数字电路嵌入式系统的特性来解释。 首先回忆glitch的本质:在数字电路中,glitch是信号在跳变过程中由于门电路延迟差异产生的短暂毛刺。比如当多个输入信号变化时,某个与门输出可能在纳秒级时间内出现非预期的尖峰。 de-glitch的核心作用就是消除这类毛刺。典型的实现方式是通过采样窗口滤波——比如在FPGA中常用移位寄存器连续采样三次信号,当三次采样值一致时才更新输出。这利用了信号稳定性原理:真正的电平变化会持续多个时钟周期,而毛刺通常只持续一个周期。 用户可能更关心实际应用场景。比如在机械按键检测中,按键弹跳会产生毫秒级抖动,此时de-glitch模块(通常叫debouncer)能确保单次按压只触发一次中断。另一个典型场景是旋转编码器信号处理,两个相位信号可能因机械振动产生交叠毛刺。 需要强调de-glitch与普通滤波的区别:它针对的是数字信号的逻辑错误而非模拟噪声。参数设计上,消抖时间窗口必须大于系统最大毛刺宽度但小于有效信号脉宽——工业控制中可能需要根据继电器特性调整到10ms左右。 突然想到用户可能混淆了类似概念,补充说明:de-glitch不同于看门狗定时器(防程序跑飞),也不同于施密特触发器(防模拟噪声),它是纯数字信号整形手段。</think>在嵌入式系统中,**de-glitch(消抖/去毛刺)** 是一种关键的数字信号处理技术,主要用于**消除输入信号中的瞬时干扰(毛刺)**,确保系统稳定可靠地识别有效信号[^1]。其核心原理与作用如下: --- ### **一、De-glitch 的核心原理** 1. **毛刺来源** 机械开关(如按键、拨码开关)或数字信号在跳变时,因触点弹跳、电磁干扰或电路噪声,会产生持续 **ms 级**的快速振荡信号(毛刺)。例如:按键按下时理想信号是 `0→1`,实际可能产生 `0→1→0→1…` 的抖动波形[^2]。 2. **消抖机制** - **时间窗口滤波**:设定一个时间阈值(如 10ms),持续监测信号状态。 - **状态一致性判断**:仅当信号在阈值时间内**保持稳定状态**,才判定为有效跳变。 > **逻辑示例**: > ```c > if (current_signal != last_state) { > reset_timer(); // 状态变化时启动计时 > } > if (timer >= DEBOUNCE_DELAY) { > accept_signal(); // 超时后仍稳定则采纳信号 > } > ``` --- ### **二、De-glitch 的核心作用** | **作用** | **应用场景** | **未消抖的后果** | |--------------------|-----------------------------|------------------------------| | **防止误触发** | 按键输入、限位开关检测 | 单次操作触发多次中断/动作 | | **提高信号可靠性** | 旋转编码器、传感器数字输出 | 数据采样错误,系统逻辑紊乱 | | **降低功耗** | 电池供电设备的唤醒信号检测 | 频繁误唤醒导致电量耗尽 | --- ### **三、实现方法对比** | **方法** | **原理** | **优缺点** | |------------------|-----------------------------|-------------------------------| | **硬件消抖** | RC 低通滤波 + 施密特触发器 | 响应快,占用 CPU 资源少;成本高 | | **软件消抖** | 定时器采样 + 状态机算法 | 灵活可调,成本低;消耗 CPU 周期 | | **混合方案** | 硬件基础滤波 + 软件精确判断 | 平衡性能与成本,工业控制常用 | > ✅ **最佳实践**:对实时性要求高的信号(如电机编码器)优先硬件消抖;对成本敏感的场景(消费电子按键)常用软件消抖[^3]。 --- ### **四、嵌入式代码示例(软件消抖)** ```c // 基于状态机的按键消抖(假设 10ms 检测周期) #define DEBOUNCE_TIME 10 // 消抖时间阈值 (ms) typedef enum { IDLE, PRESS_DETECTED, RELEASE_DETECTED } ButtonState; ButtonState debounce(ButtonState current_state, uint32_t timer) { static ButtonState state = IDLE; static uint32_t last_time = 0; switch (state) { case IDLE: if (current_state == PRESS_DETECTED) { last_time = timer; state = PRESS_DETECTED; } break; case PRESS_DETECTED: if (timer - last_time >= DEBOUNCE_TIME) { if (current_state == PRESS_DETECTED) { state = IDLE; return PRESS_CONFIRMED; // 确认有效按下 } state = IDLE; } break; // 释放状态处理类似... } return NOT_CONFIRMED; } ``` --- ### **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值