日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/1/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 按键的长按与短按让蜂鸣器响一下 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近我用標準庫和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;} }

以上就是實現讓按鍵長按,短按,蜂鳴器響一下的實驗代碼,歡迎指導討論哦!

總結

以上是生活随笔為你收集整理的按键的长按与短按让蜂鸣器响一下的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。