单片机按键按4下加一(单片机按键英文)

简介

单片机在嵌入式系统开发中应用广泛,其中按键控制是常见的应用场景。本文将介绍如何通过单片机实现按一定次数按键后自动加1的功能。

单片机按键按4下加一(单片机按键英文)

实现过程

按键按下后,需要使用计数器计数,当计数器计数到4时,执行加1操作。这里我们选用STM32F103C8T6单片机作为开发平台。在STM32F103C8T6开发板上,由于存在内置按键,我们可以直接使用内置按键进行实验。在Keil uVision中进行代码编写,主要分为按键的初始化和中断处理函数的编写两个部分。

代码实现

按键的初始化需要通过GPIO初始化和中断初始化两个步骤。在中断处理函数中,每次按键按下时,计数器先进行加1操作,接着进行倒计时直到计数器清零。当计数器清零后,再进行加1操作,这样就完成了按4下按键自动加1的功能。具体代码如下:

//按键引脚
#define KEY GPIO_Pin_0
#define KEY_PIN GPIO_Pin_0
#define KEY_PORT GPIOA
#define KEY_RCC RCC_APB2Periph_GPIOA
//延迟毫秒数
#define DELAY 12
void Key_Init(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
uint8_t key_up=1;
//计数器
uint32_t sys_count=0;
uint8_t five_count=0;
int main(void)
{
Key_Init();//按键初始化
while(1)
{
//按键按下时
if(key_up==0)
{
sys_count++;
Delay(DELAY);
//计数器增加到4时
if((sys_count>=1000/DELAY*4))
{
five_count++;
sys_count=0;
}
}
//计数器增加到5时,执行加1操作
if(five_count==5)
{
five_count=0;
sys_count=0;
printf("加1n");
}
}
}
//按键中断处理函数
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{
/* 等待释放按键 */
Delay(50);//复位时间
if(KEY_Scan(KEY_PORT,KEY_PIN)==0&&key_up==1)
{
key_up=0;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
//按键初始化
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO时钟
RCC_APB2PeriphClockCmd(KEY_RCC, ENABLE);//开启按键所在引脚的时钟

GPIO_InitStructure.GPIO_Pin = KEY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(KEY_PORT, &GPIO_InitStructure);//初始化引脚

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//外部中断源(GPIOA)
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//中断线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//开启中断
EXTI_Init(&EXTI_InitStructure);//初始化中断

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
}

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/mcuhj-2.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年4月25日 下午9:08
下一篇 2023年4月25日 下午9:08

猜你喜欢