刚写了一个关于stm32单片机的按键识别的程序。目的,同时识别多个按键,并且不浪费cpu的时间。

关于去抖动,以前以为是在按键的时候,手会抖动。通过程序验证,这个确实是误解。这个应该是防止意外干扰。以我的手按键的速度,单次持续时间小于0.2秒钟。

前提:引脚低电平为按键按下。为每个按键设置3个变量,分别是识别过程的计数器keycnt、识别的结果keystat、可以判定的结果keymod(比如按下、释放、单击、双击、长按等)。

本例 只有单击一种判断,keymod暂时不用。另外考虑,按键判定后,直到松开,不重复判定。具体模式和规则,可根据需要修改。另外要考虑,按键后,要执行的其他动作,是瞬间动作还是长时间动作,比如让灯闪烁,本例没有涉及该步骤。

思路:定时周期内:扫描每个按键的引脚电平,根据预定规则改变对应的计数器;依据计数状态,给出按键结果。

对于具体应用,应进一步人性化。

部分头文件:

// KEY:PB12,PB13,PB14,PB15;PB3,PB4
// KEY On:0 ; KEY Off:1 低电平触发

#ifndef __MINIKEY_

#define __MINIKEY_

#include "stdint.h"
#include "miniled.h"
#include "miniusart.h"
#include "minirtc.h"

#define keynum 6 //On Board KEY NUMBER

#define KEY0 (GPIOB->IDR&0x1000) //PB12
#define KEY1 (GPIOB->IDR&0x2000) //PB13,
#define KEY2 (GPIOB->IDR&0x4000) //PB14
#define KEY3 (GPIOB->IDR&0x8000) //PB15
#define KEY4 (GPIOB->IDR&0x0001) //PB0
#define KEY5 (GPIOB->IDR&0x0002) //PB1
#define KEYON 0
#define KEYOFF 1
#define KEYPRESS 0x02  //单击

#endif

相关功能:

uint8_t keypress=15; // 去抖动参数,用于计数器参考判定按键单击。定时器间隔为0.01秒。
uint8_t keycnt[keynum]; //计数器
uint8_t keystat[keynum]; //0x00/release;0x01/down; 0x02/press;0x04/up; 0x10 /click; 0x20 /double; 0x40 /keep;
uint8_t keymod[keynum]; //定义同keystat,对应bit位置1,则为启动相应功能。

// KEY:PB12,PB13,PB14,PB15

void key_init(void)
{
uint8_t m;
RCC->APB2ENR|=0x08; //enable PORTB clock
GPIOB->CRH&=0x0000FFFF; //clean PB12,PB13,PB14,PB15¡£Per 4 bits for one Port¡£
GPIOB->CRH|=0x88880000; //set PB12,PB13,PB14,PB15
GPIOB->CRL&=0xFFF00000; //clean PB0,PB1¡£PB2,PB3 error¡£
GPIOB->CRL|=0x00008888; //set PB0,PB1¡£PB2,PB3 error¡£
GPIOB->ODR&=0x0FF0;
GPIOB->ODR|=0xF00F;

for(m=0;m<keynum;m++){
keycnt[m]=0;
keystat[m]=0;
keymod[m]=0x10;
}
}

//循环扫描,在定时中执行
void keyscan(void)
{
    uint8_t k;
    for(k=0;k<keynum;k++){
        keyone(k);
    }
}

//识别规则
void keyone(uint8_t nkey)
{
switch(nkey){
case 0:
if(KEY0==KEYON){
    if(keycnt[nkey]==keypress){
     //   keycnt[nkey]=0;//长按视为反复触发按键。
        keystat[nkey]=0x02;
        }else{
        keycnt[nkey]++;
        }
}else{
     keycnt[nkey]=0;
}
break;

…………

}

//后续动作,在定时中执行
void keydo(void)
{
if(keystat[0]==0x02){
keystat[0]=0; //reset key after done
kset0();  //要执行的动作
}
……………………
if(keystat[5]==0x02){
keystat[5]=0; //reset key begin done
led_flush(2);
led_flush(3);
}
}

stm32按键识别的更多相关文章

  1. M4—按键识别

    三.KEY 3.1  初始化 1.相应端口时钟使能 2.配置GPIO为输入模式 3.根据实际电路图 配置浮空输入,不用上下拉 3.2  按键识别 (1)一般按键步骤(延时消抖) 1. 判断相关的管脚是 ...

  2. 【audio】耳机插拔 线控按键识别流程【转】

    耳机插拔/线控按键识别流程 耳机插拔/线控按键识别流程 1.文档概述 本文以msm8909平台,android N为例,介绍了通用情况下,耳机插拔的流程步骤,以及对耳机类型的识别逻辑.以方便在项目工作 ...

  3. STM8S---外部中断应用之长按键识别

    STM8经常使用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); ...

  4. STM32按键控制程序

    由于最近时间比较匆忙 已经有很久的时间没有写博客了 这次和大家分享的是STM32的一个按键的小程序 他的优点呢也是和上面一个LED一样就是便于移植 更改管脚方便 虽然都是些小程序 但是我觉得他们就像基 ...

  5. stm32按键FIFO的实现

    学习目标: 1.理解FIFO的基本概念和设计按键FIFO的意义   2.写出实现按键FIFO的代码 1.设计按键FIFO的优点 要介绍实现按键FIFO的优点,首先要了解FIFO的一些基本概念.FIFO ...

  6. STM32 按键输入

    #include "stm32f10x.h"#include "key.h" //按键初始化函数void KEY_Init(void) { GPIO_InitT ...

  7. stm32按键配置

    前言:我们都知道开发板上除了有经典的流水灯之外,还有一个必备的练习硬件--按键(key),下面继续来完成按键的配置. 1.通过查看原理图,找出按键(key)的管脚名字和对应芯片上的I/O口,四个I/O ...

  8. stm32 按键操作

    抖动时间的长短由按键的机械特性决定,一般为5ms-10ms void key() { static u8 flag = 1; if(flag == 1 && KEY_UP == 1) ...

  9. stm32 按键

    //°´¼ü³õʼ»¯º¯Êý void KEY_Init(void) //IO³õʼ»¯ { GPIO_InitTypeDef GPIO_InitStructure; //³õʼ»¯KEY0- ...

随机推荐

  1. java 调用打印机 打印服务

    import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import javax ...

  2. <密码的实现>输入密码的时候,显示“*”,而不是显示输入内容

    一开始还以为用C语言和C++不能实现输入密码的时候显示出“*”而不显示输入的内容呢!没想到偶然的机会试出了用while循环结构可以实现.以下是我整理的C语言和C++的代码,供初学者参考. 这是C语言实 ...

  3. IIS7添加mp4 MINE类型报错:无法写入配置文件

    解决方法: 方法一: 可能是由于文件为只读属性,所以修改网站文件访问权限,把此文件夹或者文件的写入权限给了这个用户. 方法二: 可能由于网站目录所在的分区是fat32格式,所以要把网站目录放在NTFS ...

  4. Java源程序结构

    完整的java源程序应该包括下列部分: 1.package语句 l java编译器为每个类生成一个字节码文件,且文件名与类名相同,这就会带来一个问题:同名的类会发生冲突. l 所以package的两个 ...

  5. sql 各种格式

    --以2013-12-10 12:56:55为例--convert(nvarchar(10),CreateDate,120)      =>      2013-12-10--DATEPART( ...

  6. 关于java web开发需要哪些技术要求(简单的web界面管理系统)

    目前, 国内外信息化建设已经进入基于Web应用为核心的阶段, Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Ja ...

  7. [妙味DOM]第一课:DOM基础概念、操作

    知识点总结 childNodes.children子节点列表集合.nodeType节点类型.nodeName.nodeValue.attributes属性列表集合 childNodes和childre ...

  8. droidcon 北京2016安卓技术大会——安卓领域国际盛会

    目前droidcon国际技术大会已成为安卓领域全球最有影响力.规模最大的技术大会,每年在世界各地举办,横跨四大洲,超过上万人次参加. droidcon国际技术大会于2009年由一个Android爱好者 ...

  9. 【转载】Recycle机制

    首先要明白,Recycle机制并不是Java中的垃圾回收机制,而是相当于一种设计模式 思想:当一个对象不再使用时,储存起来,而不是让虚拟机回收,需要的时候再用,避免对象被回收之后重分配 适用范围:对于 ...

  10. javascript apply()和call()

    原文链接 http://www.jb51.net/article/30883.htm 想要理解透彻apply()和call() ,还要需要理解this  作用域 局部变量  全局变量 js apply ...