按键的长按与短按让蜂鸣器响一下

news/2024/10/30 11:28:06/

最近我用标准库和stm32写了一个关于,多个按键的长按与短按,伴随蜂鸣器响一下的小实验,和大家分享一下!

按键的思路框架:

这个框架是我从网上找到的,便于大家理解。

void Key_Scan(void)
{static uint8_t cnt = 0;//按键的计时/消抖if(K1==0) //按键按下{cnt++;//开始计数}if(K1==1)//按键释放/没有按下按键/按键消抖{if(cnt>1000) //表示长按{//长按执行内容}else if(cnt>100) //表示短按{//短按执行内容}cnt = 0; //这块我理解为没有按/按键消抖}
}    

system.c

我的按键有触摸按键,原理图上给触摸按键提供了VCC,所以用这个函数GPIO_SetBits(GPIOB,GPIO_Pin_14);把提供VCC的引脚设置一下,使按键有电,按键就能正常工作啦!

void RCC_Config(void) //时钟配置
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
}void GPIO_Config(void)//GPIO口配置
{GPIO_InitTypeDef GPIO_InitStructure;  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_13 | GPIO_Pin_12 //按键GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //蜂鸣器GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_14);  
} void NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);  
}void InterruptConfig(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 7199;TIM_TimeBaseStructure.TIM_Prescaler = 99;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);TIM_Cmd(TIM4, ENABLE);
}

stm32_it.c

void TIM4_IRQHandler(void)//10ms
{    if(TIM_GetITStatus(TIM4, TIM_FLAG_Update) == SET){TIM_ClearITPendingBit(TIM4, TIM_FLAG_Update);RunData.RunCnt++;}
}

key.c

#include "key.h"
#include "delay.h"KEYVALUE Key = {0};//结构体void KEY_Scan(void)
{/********right********/if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==RESET) //记录按键低电平时间{Key.rightcnt++; //计数变量}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==SET) //按键释放/没有按下按键/按键按下的抖动{if(Key.rightCnt>1000)//说明是长按{//长按执行内容GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);delay_ms(50);GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);Key.rightLong = 1; //标志位}else if(Key.rightCnt>100) //短按{//执行短按内容GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);delay_ms(50);GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);Key.rightshort = 2;}Key.rightCnt=0;//清除计数变量Key.right = 0;//标志位//关闭按键的状态}/********left********/if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET) //记录按键低电平时间{Key.leftCnt++; //计数变量}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==SET) //按键释放/没有按下按键/按键按下的抖动{if(Key.leftCnt>1000)//说明是长按{//长按执行内容GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);delay_ms(50);GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);Key.leftLong = 1;}else if(Key.leftCnt>100) //短按{//执行短按内容GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);delay_ms(50);GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);Key.leftshort = 2;}Key.leftCnt=0;//清除计数变量Key.left = 0;//标志位}/********ok********/if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET) //记录按键低电平时间{Key.okCnt++; //计数变量}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==SET) //按键释放/没有按下按键/按键按下的抖动{if(Key.okCnt>1000)//说明是长按{//长按执行内容GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);delay_ms(50);GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);Key.okLong = 1;}else if(Key.okCnt>100) //短按{//执行短按内容GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);delay_ms(50);GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);Key.okshort = 2;}Key.okCnt=0;//清除计数变量Key.ok = 0;//标志位}

标志位:我都放在key.h的结构体里了

key.h

#ifndef _KEY_H_
#define _KEY_H_#include "system.h"typedef struct
{uint8_t right;  //不按标志位uint16_t rightCnt;//计数uint8_t rightLong;//长按标志位uint8_t rightshort;//短按标志位uint8_t left;uint16_t leftCnt;uint8_t leftLong;uint8_t leftshort;uint8_t ok;uint16_t okCnt;uint8_t okLong;uint8_t okshort; 
}KEYVALUE; //多个按键就继续写里面extern KEYVALUE Key;void KEY_Scan(void);
#endif

main.c

#include "system.h"
#include "key.h"int main(void)
{delay_init();RCC_Config();NVIC_Config();InterruptConfig();GPIO_Config();while (1)
{if(RunData.RunCnt>2)//20ms扫描一次按键{KEY_Scan();    RunData.RunCnt = 0;}     
}

以上就是实现让按键长按,短按,蜂鸣器响一下的实验代码,欢迎指导讨论哦!


http://www.ppmy.cn/news/445475.html

相关文章

利用蜂鸣器播放音乐

我们知道,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内置了频率发生电路,因此其通电就能够发出声音,但是其频率是固定的,而无源蜂鸣器内部没有频率发生电路,需要外界给予频率,因此适用于单…

如何选择6×9汽车喇叭为您的立体声

如何选择69汽车喇叭为您的立体声   这些69汽车音响的方法不断地从休息站出来,只是因为他们的形状不同,产生清晰的高品质声音。他们是目前年轻人和成人的汽车爱好者的选择,因为他们提供的几个特质。不是所有的69汽车音响系统将适合每一辆车&…

喇叭音圈是大一点好还是小一点好

基本上电子产品都会带有音频产品,手机、电脑、电视、汽车等产品成为越来越普通的用品。对于音频产品来说喇叭是核心。大家可能意识到了现在喇叭产品变得越来越小了(如手机、电脑),相反的,喇叭音圈却有越来越大的趋势&a…

这款扩音器让我见识了什么才是地摊神器,震撼的声音通透整条街

最近一段时间,地摊经济在全国范围内火了起来,各个城市的夜市一时间热闹非凡,大家茶余饭后都纷纷出去感受那“最抚凡人心”的城市烟火气。这当中,很多年轻人也都想着体验一把摆摊抢位的新鲜感,而在这样嘈杂的环境下摆摊…

鼠标速度太快怎么调

鼠标速度太快怎么调 1、找到键盘win键,找到设置 2、找到设置里边设备 3、找到鼠标点击一下右边会出现鼠标里的功能 4、这样就可以了,想快就往右边调,想慢一点就往左调 5、有的(机械)鼠标滚轮上下可以调 鼠标速度快慢

有关熊猫

[zt]床前明月光,熊猫在烧香 床前明月光,熊猫在烧香专杀杀不尽,两眼泪汪汪 熊猫烧不尽,关机开又生 宝剑锋自磨砺出,熊猫香自网上来。 无边香火烧烧下,不尽熊猫滚滚来。 身心俱疲终不悔,为猫消得人憔悴 千呼万唤猫出来&#x…

实现龙卷风收音机客户端电台数据解密算法

最新说明:自7月份始,文章公布后,Cradio官方更新了加密算法,故以下实现只对7月份之前的版本有效.关于最新的电台数据,目前只能通过js的方式获取,而相关的除电台名称,地址之外信息还需另外搜集和整理.在此,请诸位自行决定.(再次声明:js获取数据方式因可能对Cradio官方服务器产生不…

在电脑上收听广播——龙卷风网络收音机试用

在电脑上收听广播——龙卷风网络收音机试用 随着宽带网的普及,网速越来越快,网上听广播已不成问题。使用龙卷风网络收音机,只用鼠标轻轻一点,就能让您听遍全世界的声音。  龙卷风网络收音机(CRadio)是一款可以收听全球各地网络…