STM32学习笔记--按钮程序编写与原理(2026.3.11)

0 阅读1分钟

按钮与板载LED原理:

按钮程序与源码:

通过一个循环不断地读取引脚是高电位还是地电位,以电位的变化判断按钮的状态

按钮消抖

通过10ms的延迟删除这段毛刺。

Delay(10);

最终main.c代码:

#include "stm32f10x.h"
#include "delay.h"

void App_Button_Init(void);
void App_OnBoardLED_Init(void);

int main(void)
{
	App_Button_Init();
	App_OnBoardLED_Init();

	uint8_t current = Bit_SET, Previous = Bit_SET;

	while(1)
	{
		Previous = current;

		current = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);

		if (current != Previous)
		{
			if (current == Bit_SET)
			{
				// 改变LED
				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);
				}
			}
			Delay(10);
		}
		
	}
}

void App_Button_Init()
{
	//PA0 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
}

void App_OnBoardLED_Init(void)
{
	//PC13
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

	
	GPIO_Init(GPIOC, &GPIO_InitStruct);
}