按键的长按与短按让蜂鸣器响一下
生活随笔
收集整理的這篇文章主要介紹了
按键的长按与短按让蜂鸣器响一下
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近我用標準庫和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); #endifmain.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;} }以上就是實現讓按鍵長按,短按,蜂鳴器響一下的實驗代碼,歡迎指導討論哦!
總結
以上是生活随笔為你收集整理的按键的长按与短按让蜂鸣器响一下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用易忘CSS小技巧
- 下一篇: mac如何配置maven的环境变量