单片机按键的定时器消抖处理

本文介绍了如何使用定时器进行单片机按键的消抖处理,通过在大循环中检测按键状态,实现对“按下”、“长按”和“抬起”的精确识别。进而讲解了如何在此基础上实现按键的长按功能(如1秒、2秒、3秒)和组合键操作(如Ctrl+C)。文章包含button.c和button.h的代码示例,并提供了在user.c中的应用步骤,包括设置定时器、初始化按键变量、调用消抖宏及扫描按键状态。
摘要由CSDN通过智能技术生成

使用定时器计时,给按键的按下、抬起的计时消抖,在大循环while里不堵塞,可以同时检测到每个按键各自的“按下”“长按”“抬起”的状态。在此基础上,按键的长按一秒、两秒三秒,按键的双击,组合键功能(例如Ctrl+C)等已经很容易实现了。
button.c和button.h直接添加到工程里,编译然后修改到对应的布尔变量。user.c是应用文件。

一、源文件button.c

按键操作。不同的编译器里布尔变量类型的几种写法:bit - bool - _Bool - unsigned char。
函数Btn_InitNull(BtnControl_pst pBtn)对按键参数初始化,设置按键初始状态为“无动作”。
函数Btn_InitPress(BtnControl_pst pBtn)对按键参数初始化,设置按键初始状态为“长按”。
函数Btn_Scan(BtnControl_pst pBtn, _Bool bPin)是在main()的大循环里检测按键状态。

#include "button.h"



static _Bool Btn_Shake(BtnControl_pst pBtn, uint8_t site);



/**************************************************************************
Function:    Btn_InitNull
Description: 初始化按键参数,状态设为:S_NULL(无动作)
Input:       - pBtn 按键操作结构体
Return:      no
**************************************************************************/
void Btn_InitNull(BtnControl_pst pBtn)
{
    pBtn->status  = S_NULL;
    pBtn->bAction = 0;
    pBtn->bDelay  = 0;
}
/**************************************************************************
Function:    Btn_InitPress
Description: 初始化按键参数,状态设为:S_PRESS(长按)
Input:       - pBtn 按键操作结构体
Return:      no
**************************************************************************/
void Btn_InitPress(BtnControl_pst pBtn)
{
    pBtn->status  = S_PRESS;
    pBtn->bAction = 1;
    pBtn->bDelay  = 0;
}
/*******************************************************
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 51 单片机定时器按键消抖程序: #include <reg51.h> sbit key = P1^0; // 定义按键引脚 sbit led = P1^1; // 定义 LED 引脚 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void main() { unsigned char key_state = 0; // 按键状态 unsigned char key_count = 0; // 按键计数器 unsigned char key_press = 0; // 按键按下标志 TMOD = 0x01; // 定时器 0 工作在模式 1 TH0 = 0xFC; // 定时器 0 计数初值 TL0 = 0x67; TR0 = 1; // 启动定时器 0 while (1) { if (key == 0) // 检测按键是否按下 { key_count++; // 按键计数器加 1 if (key_count >= 10) // 如果按键计数器大于等于 10 { key_count = 10; // 按键计数器置为 10 key_press = 1; // 按键按下标志置为 1 } } else { if (key_count > 0) // 如果按键计数器大于 0 key_count--; // 按键计数器减 1 } if (TF0 == 1) // 检测定时器 0 是否溢出 { TF0 = 0; // 定时器 0 溢出标志清零 TH0 = 0xFC; // 定时器 0 计数初值 TL0 = 0x67; if (key_press == 1) // 如果按键按下 { key_press = 0; // 按键按下标志清零 key_state = !key_state; // 按键状态取反 led = key_state; // LED 状态与按键状态相同 } } delay(1); // 延时 1ms } } 这个程序使用了定时器 0 来实现按键消抖,当按键按下时,按键计数器加 1,如果按键计数器大于等于 10,则认为按键已经按下,按键按下标志置为 1;当按键松开时,按键计数器减 1;定时器 0 溢出时,检测按键按下标志,如果为 1,则将按键按下标志清零,按键状态取反,LED 状态与按键状态相同。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值