按下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);
}
}