又好久没来写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语言】单片机上的按键检测框架的更多相关文章

  1. nRF52832 矩阵按键调试 同一列上的按键 任意两个按键 按下 检测不到低电平(电平拉不下来)

    参考链接:https://blog.csdn.net/zhanghuaishu0/article/details/78505045 调试过程中发现 同一列上的按键 任意两个按键 按下 检测不到低电平( ...

  2. 使用Twitter异常检测框架遇到的坑

    在Github上搜索“Anomaly Detection”,Twitter的异常检测框架(基于R语言)高居榜首,可见效果应该不错: 但是活跃度并不高,3-4年没人维护了: 因此在使用时难免会遇到一些坑 ...

  3. nRF51822外设应用[2]:GPIOTE的应用-按键检测

    版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 1. nRF51822寄存器类型 nRF51822的寄存器和一般的单片机有所差别,nRF51822 ...

  4. STM32f103按键检测程序实现长按短按

    背景 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去抖.初学者往往会在主循环调用按键检测程序(实时)并利用延时去抖(准确).这种在主循环内延时的做法对整个程序非常 ...

  5. 按键检测GPIO输入

    1. 项目 通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭. 2. 代码 mian.c #include "stm32f10x.h" //相当于51单片机中的 #includ ...

  6. 第12章 GPIO输入—按键检测

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  7. 第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  8. 谁能用通俗的语言解释一下什么是 RPC 框架

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题~ 谁能用通俗的语言解释一下什么是 RPC 框架? ...

  9. 第13章 GPIO输入—按键检测

    本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘 ...

随机推荐

  1. Scheme 编程环境的设置(racket/petite)-王垠

    Scheme 编程环境的设置 http://www.yinwang.org/blog-cn/2013/04/11/scheme-setup/ sudo apt-get insatll racket ; ...

  2. USB设备类型代码(class类型)

    Base Class E0h (Wireless Controller) This base class is defined for devices that are Wireless contro ...

  3. scheme Continuation

    Continuation Pass Style在函数式编程(FP)中有一种被称为Continuation Passing Style(CPS)的风格.在这种风格的背后所蕴含的思想就是将处理中可变的一部 ...

  4. 【HDU 4547 CD操作】LCA问题 Tarjan算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和 ...

  5. Java Base64编码与图片互转

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  6. Android学习总结——系统提示对话框(AlertDialog)

    new AlertDialog.Builder(MainActivity.this).setTitle("退出")//设置对话框标题 .setMessage("官人可是要 ...

  7. DataReader、Table、DataSet和Entity相互转化

    public class CommonService { #region DataReader转化 /// <summary> /// 将DataReader转化为Table /// &l ...

  8. CSDN-Markdown语法集锦

    前言: 使用Markdown近一个来月.越来越认为不舒爽. 改字体.改字号.改颜色.改样式,全不会!想加个数学公式.得,仅仅会截图.把图片传上去了还不会控制大小.也不会控制文字与图片的排版,写出来的博 ...

  9. gcc和arm-linux-gcc区别

    安装arm-linux-gcc的时候,查了不少资料,总算环境搭好了.于是,想写个程序员的经典程序---hello world. 语法都没错,生成test.c. 命令行运行:arm-linux-gcc ...

  10. Linux 下mysql修改数据库存放目录方法和可能遇到的问题

    MySQL版本:5.6.23-enterprise-commercial-advanced ,使用rpm安装linux:Red Hat Enterprise Linux Server release ...