【STM32】STM32中断读取按键模块

该代码实现了一个基于STM32的中断系统,用于读取GPIO端口PB14上的按键输入。当按键按下时,使用EXTI15_10_IRQHandler中断服务函数进行处理,通过延时防止抖动,并对按键计数器进行递增。在主函数中,使用这个计数器来控制LED的状态显示,并在OLED屏幕上显示按键计数值。
摘要由CSDN通过智能技术生成

STM32中断读取按键模块

  • KeyExti.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

uint16_t key_Count;

void CountKey_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
}

uint16_t CountKey_Get(void)
{
	return key_Count;
}

void EXTI15_10_IRQHandler(void)
{
	Delay_ms(10);
	if (EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
		{
			key_Count ++;
		}
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}
  • main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "led.h"
#include "key.h"
#include "OLED.h"
#include "KeyExti.h"

int main(void) {
	OLED_Init();
//	Key_Init();
	LED_Init(); 
	CountKey_Init();
	
	OLED_ShowString(1, 1, "Welcome Jun..");
	OLED_ShowString(2, 1, "Led Status:");
	OLED_ShowString(3, 1, "Key Count:");
	uint8_t led = 0, cnt = 0;
	
	while(1) {
		cnt = CountKey_Get();
		led = cnt % 2;
		if(led == 0) LED_A0_OFF();
		else	LED_A0_ON();
		OLED_ShowString(2, 12, (led == 1)? "ON " : "OFF");
		OLED_ShowNum(3, 11, cnt, 2);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值