【C语言】单片机上的按键检测框架
又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了。
下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收、滤波、最好处理按键任务,大体上没什么问题,不过没具体测试过到时可能会有bug。
/******************************************************************************
* @file button.c
* @author wule
* @version
* @date
* @brief
******************************************************************************
*
*****************************************************************************/ typedef unsigned char ButtonSizeType; typedef enum{
RESET = ,
SET = !RESET,
}FLAG; typedef struct button_bit{
ButtonSizeType button1:;
ButtonSizeType button2:;
ButtonSizeType button3:;
ButtonSizeType button4:;
ButtonSizeType button5:;
ButtonSizeType button6:;
ButtonSizeType button7:;
ButtonSizeType button8:;
}ButtonBitType; typedef union
{
ButtonBitType button_bit;
ButtonSizeType button;
}ButtonType; ButtonType InputFlag; //初始化按键标志状态
void Init_Button_Variable(void)
{
InputFlag.button = ;
} //判断函数,读取每个按键的状态
ButtonSizeType ReadButtonBit(void)
{
ButtonType button_bit; button_bit.button = ; button_bit.button_bit.button1 = ;
button_bit.button_bit.button3 = ;
button_bit.button_bit.button5 = ; return button_bit.button;
}
//滤波,返回值代表当前按键的值
ButtonSizeType Button_Filter(void)
{
ButtonSizeType bf_buf;
static ButtonSizeType bf_pre_buf = ,bf_backval = ;
static unsigned char bf_filtercnt = ; bf_buf = ReadButtonBit(); if(bf_buf != bf_backval && bf_buf == bf_pre_buf)//判断两次是否相同
{
bf_filtercnt ++;
if(bf_filtercnt > )//作一个简单的滤波
{
bf_backval = bf_pre_buf;
}
}
else
{
bf_pre_buf = bf_buf;
bf_filtercnt = ;
} return bf_backval;
}
//处在一个时间可控的位置,这里可以实现各种按键的操作
void ButtonTask(void)
{
ButtonType bt_state = Button_Filter();//得到按键状态 if(InputFlag.button_bit.button1 == && bt_state.button_bit.button1 == )
{
//单次触发
}
else if(InputFlag.button_bit.button1 == && bt_state.button_bit.button1 == )
{
//单次释放
} if(bt_state.button_bit.button1 == )
{
//计时触发
}
else
{
//结束判断按的时间
}
}
【C语言】单片机上的按键检测框架的更多相关文章
- nRF52832 矩阵按键调试 同一列上的按键 任意两个按键 按下 检测不到低电平(电平拉不下来)
参考链接:https://blog.csdn.net/zhanghuaishu0/article/details/78505045 调试过程中发现 同一列上的按键 任意两个按键 按下 检测不到低电平( ...
- 使用Twitter异常检测框架遇到的坑
在Github上搜索“Anomaly Detection”,Twitter的异常检测框架(基于R语言)高居榜首,可见效果应该不错: 但是活跃度并不高,3-4年没人维护了: 因此在使用时难免会遇到一些坑 ...
- nRF51822外设应用[2]:GPIOTE的应用-按键检测
版权声明:本文为博主原创文章,转载请注明作者和出处. 作者:强光手电[艾克姆科技-无线事业部] 1. nRF51822寄存器类型 nRF51822的寄存器和一般的单片机有所差别,nRF51822 ...
- STM32f103按键检测程序实现长按短按
背景 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去抖.初学者往往会在主循环调用按键检测程序(实时)并利用延时去抖(准确).这种在主循环内延时的做法对整个程序非常 ...
- 按键检测GPIO输入
1. 项目 通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭. 2. 代码 mian.c #include "stm32f10x.h" //相当于51单片机中的 #includ ...
- 第12章 GPIO输入—按键检测
第12章 GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列
第12章 GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 谁能用通俗的语言解释一下什么是 RPC 框架
转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题~ 谁能用通俗的语言解释一下什么是 RPC 框架? ...
- 第13章 GPIO输入—按键检测
本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘 ...
随机推荐
- Scheme 编程环境的设置(racket/petite)-王垠
Scheme 编程环境的设置 http://www.yinwang.org/blog-cn/2013/04/11/scheme-setup/ sudo apt-get insatll racket ; ...
- USB设备类型代码(class类型)
Base Class E0h (Wireless Controller) This base class is defined for devices that are Wireless contro ...
- scheme Continuation
Continuation Pass Style在函数式编程(FP)中有一种被称为Continuation Passing Style(CPS)的风格.在这种风格的背后所蕴含的思想就是将处理中可变的一部 ...
- 【HDU 4547 CD操作】LCA问题 Tarjan算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和 ...
- Java Base64编码与图片互转
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- Android学习总结——系统提示对话框(AlertDialog)
new AlertDialog.Builder(MainActivity.this).setTitle("退出")//设置对话框标题 .setMessage("官人可是要 ...
- DataReader、Table、DataSet和Entity相互转化
public class CommonService { #region DataReader转化 /// <summary> /// 将DataReader转化为Table /// &l ...
- CSDN-Markdown语法集锦
前言: 使用Markdown近一个来月.越来越认为不舒爽. 改字体.改字号.改颜色.改样式,全不会!想加个数学公式.得,仅仅会截图.把图片传上去了还不会控制大小.也不会控制文字与图片的排版,写出来的博 ...
- gcc和arm-linux-gcc区别
安装arm-linux-gcc的时候,查了不少资料,总算环境搭好了.于是,想写个程序员的经典程序---hello world. 语法都没错,生成test.c. 命令行运行:arm-linux-gcc ...
- Linux 下mysql修改数据库存放目录方法和可能遇到的问题
MySQL版本:5.6.23-enterprise-commercial-advanced ,使用rpm安装linux:Red Hat Enterprise Linux Server release ...