stm32按键识别

刚写了一个关于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);
}
}

时间: 2024-11-01 11:13:18

stm32按键识别的相关文章

M4—按键识别

三.KEY 3.1  初始化 1.相应端口时钟使能 2.配置GPIO为输入模式 3.根据实际电路图 配置浮空输入,不用上下拉 3.2  按键识别 (1)一般按键步骤(延时消抖) 1. 判断相关的管脚是否为有效电平 2. 如果为有效电平,则进行消抖处理,如延时消抖(5~10ms) 3. 再次判断是否为有效电平.如果为有效电平,则确实是按键按下了,而不是干扰. 4. 识别到后做按键处理 5. 等待按键释放 //延时消抖 //返回键值 u8 key_scanf(void) { u8 key=NO_KE

[stm32] 按键

防抖时间设的不是太好.... 1 /* 2 ::按键控制 3 PA8接LED,PE2接按键 4 */ 5 #include"stm32f10x.h" 6 void RCC_Configuration(void); 7 void GPIO_Config(void); 8 void Delay(__IO uint32_t nCount); 9 10 int main() 11 { 12 RCC_Configuration(); //系统时钟配置|使能GPIO口 13 GPIO_Config

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

STM8常用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); 中断返回 _asm("iret"); 等待中断 _asm("wfi"); 软件中断 _asm("trap"); STM8S常用中断映射 如使用中断函数时,可以通过在上图中查找相对应的中断向量号,而中断函数的名字可以自定义 /* BASIC INTERRU

STM32 按键输入

#include "stm32f10x.h"#include "key.h" //按键初始化函数void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin

STM32单片机资料大全1.1G

STM32单片机资料大全1.1G包括有不限于以下资料:其实还有更多,大家凑合着看吧!资料下载地址下面都有写,需要的自己去瞧一瞧就知道了,stm32的全部资料在闯客网技术论坛都可以下载,只有你想不到,没有你找不到,请相信这个帖子所说的 STM32F107VCU3S羊册V6.pdfSTM32F系列ARM内核32位高性能徴控制器参考丰册V10_l.pdfSTM32F系列ARM内核32位高性能徴控制器参考丰册V14.pdfSTM32F系列ARM内核32位高性能徴控制器参考丰册V10_l.pdfKeil+

矩阵按键的组合按键触发

/***12个按键,每一个按键都会让蜂鸣器发出“嘀”的一声, 同时按下S1和S12会点亮一个LED灯,同时按下***/#include "REG52.H"#define const_voice_short 40#define const_key_time 12#define const_key_time_comb 14 //组合按键去抖动延时时间void initial_myself();void initial_peripheral();void delay_long(unsigne

[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发(2) [direct-X] 1.direct-X最小框架 [OpenGL] 1.环境搭建及最小系统 51单片机(21) [51单片机] 1602液晶显示控制代码 [51单片机] 1602液晶显示控制代码2 [51单片机] 定时器1 [51单片机] 定时器2-计数示例 [51单片机] 定时器3-计时示例 [51单片机] 中断1-中断整体介绍 [51单片机] TFT2.4彩屏1 [文字显示 画矩形] [51单片机] TFT2.4彩屏2 [32*32文字显示] [51单片机] TFT2.

【转】 矩阵键盘的工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,在矩阵键盘中每条水平线和垂直线在交叉处不直接相连,而是通过一个按键相连接,这样在由N条水平线和M条垂直线最多可以有N *M 个按键,大大的减少了对于芯片I/O的占用. 键盘矩阵的按键识别方法 图1   矩阵键盘的结构 方法一 行扫描法 1.判断键盘中有无键按下 将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态.只要有一列的电平为低,则表示键盘中有键

C语言实现五子棋简单功能

/******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者"w","s","a","d"控制棋子放置位置, 使用空格键放置棋子,使用“ESC”键退出游戏 测试环境:Redhat5.5 *****************************************************