按钮与板载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);
}