(5)按键消抖—基于铁头山羊的STM32标准库教程

按下PA0处的按键,板载LED切换亮灭状态

【铁头山羊版本】

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	uint8_t current = Bit_SET;
	uint8_t previous = Bit_RESET;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//初始化PA0引脚,将其设置为输入上拉模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	PAL_Init();
	
	while(1)//不断读取PA0的值,以监测按钮动作
	{
		previous = current;
		
		current = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
		
		if(current != previous)
		{
			PAL_Delay(10);
			
			current = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
			
			if(current != previous)
			{
			 if(current==Bit_RESET) //按钮按下
			{
			}
			else //按钮松开
			{
			 if( GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13))
			 {
			  GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
			 }
			 else
			 {
			  GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
			 }
		    }
			}
			
		}
	
	}
}

使用PAL库设置按键(PA0处的按键来切换板载LED PC13的亮灭状态)

#include "stm32f10x.h"
#include "stm32f10x_pal.h"//首先要调用PAL库
#include "stm32f10x_pal_button.h"//调用PAL库中的按键库

PalButton_HandleTypeDef hButton1; // h - Handle句柄

static void OnButton1Released(void)
{
	// PC13亮灭状态切换的代码
	if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == Bit_SET)
	{
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
	}
	else
	{
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
	}
}

int main(void)
{
	GPIO_InitTypeDef GPIOInitStruct;
	
	PAL_Init();
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIOInitStruct);
	
	
	// PA0
	hButton1.Init.GPIOx = GPIOA;
	hButton1.Init.GPIO_Pin = GPIO_Pin_0;
	hButton1.Init.Button_Mode = Button_Mode_IPU;/* 按钮模式:
	                            内部上拉模式(不用外接电阻) - Button_Mode_IPU
                            	外部上拉模式(需要外接电阻) - Button_Mode_EPU */
	hButton1.Init.ButtonReleasedCallback = OnButton1Released;/* 两个回调函数        
                                ButtonPressedCallback;  按钮按下的回调函数
	                            ButtonReleasedCallback; 按钮松开的回调函数*/
	
	PAL_Button_Init(&hButton1);
	
	while(1)
	{
		PAL_Button_Proc(&hButton1);
	}
}

原理:

通过两个按钮(PA0和PA1)控制板载LED PC13的亮灭:

#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_button.h"

// PA0 -> 点亮 PC13 写 0 Button1
// PA1 -> 熄灭 PC13 写 1 Button2
PalButton_HandleTypeDef hButton1;
PalButton_HandleTypeDef hButton2;

static void OnButton1ReleasedCallback(void)//第一个按钮的回调函数
{
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}

static void OnButton2ReleasedCallback(void)//第二个按钮的回调函数
{
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}

int main(void)
{
	GPIO_InitTypeDef GPIOInitStruct;
	
	PAL_Init();
	
	// PC13 -> Out_OD
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIOInitStruct);
	
	hButton1.Init.GPIOx = GPIOA;
	hButton1.Init.GPIO_Pin = GPIO_Pin_0;
	hButton1.Init.Button_Mode = Button_Mode_IPU;
	hButton1.Init.ButtonReleasedCallback = OnButton1ReleasedCallback; // 调用第一个回调函数的内容使LED点亮
	PAL_Button_Init(&hButton1);
	
	hButton2.Init.GPIOx = GPIOA;
	hButton2.Init.GPIO_Pin = GPIO_Pin_1;
	hButton2.Init.Button_Mode = Button_Mode_IPU;
	hButton2.Init.ButtonReleasedCallback = OnButton2ReleasedCallback; // 调用第二个回调函数的内容使LED熄灭
	PAL_Button_Init(&hButton2);
	
	while(1)
	{
		PAL_Button_Proc(&hButton1);
		PAL_Button_Proc(&hButton2);
	}
}

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值