按钮的电路设计
电路的搭建
原理与编程
创建了两个变量 用来捕捉按键的状态 先让两个变量都为1 previous和current都为1 (按键没按下) 然后让current去捕捉按键的状态通过读gpioA的pin0 如果为0就是按键按下 如果为1就是按键没按下 然后赋值给current 如果current和previous相等就是按键没按下 如果相等就是按键按下了 那要在按键按下的瞬间改变LED的亮灭状态 即按键松开瞬间(在之前按键已经按下)if语句嵌套 第二个if为按键松开瞬间改变LED的亮灭状态
按键按下就亮 按键松开就熄灭
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
int main(void)
{
GPIO_InitTypeDef GPIOInitstruct;
uint8_t current = Bit_SET;
uint8_t previous = Bit_SET;//创建两个变量来捕捉按键状态
PAL_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC的时钟
GPIOInitstruct.GPIO_Pin = GPIO_Pin_13;
GPIOInitstruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIOInitstruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIOInitstruct);//对GPIOC PIN13初始化为输出开漏模式 输出速度为2mhz 引脚为PIN13
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟
GPIOInitstruct.GPIO_Pin = GPIO_Pin_0;
GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIOInitstruct); //对GPIOA PIN0初始化为输入上拉模式 不需要输出速度因为是输入模式 引脚为PIN0
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==Bit_RESET)
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
}
else
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
}
}
}
while(1)//按键按下就翻转一次led的电平
{
previous = current;
current = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if(current!=previous)
{
if(current == previous)//按钮按下
{
}
else//按钮松开
{
if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)==Bit_RESET)
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
}
else
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
}
}
while(1)//加入了消抖
{
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 // 按钮松开
{
// ODR
if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
else
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}
}
}
}
}
}
PAL库的按钮驱动
按键驱动介绍 引用头文件
声明句柄 句柄是啥?
句柄就是一种数据结构 编程就为数据结构+算法 数据结构就是数据 算法就是对数据结构里的数据进行操作 如茶壶 首先定义一个结构体用来存放茶壶的一些数据 (容量和水量)
第一个函数(对数据进行操作的方法)就是初始化一个茶壶 第二个函数就是完成倒入茶壶水 第三个函数就是从茶壶里倒出水
对按钮的编程也是数据结构+算法的方法 声明一个结构体 填表
PAL库把初始化和按键按下封装
出现了回调函数
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_button.h"
PalButton_HandleTypeDef hButton1;//声明句柄
static void OnButton1Released(void)
{
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);
}
//P13亮灭切换的代码
}
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;
hButton1.Init.ButtonReleasedCallback = OnButton1Released;
PAL_Button_Init(&hButton1);
while(1)
{
PAL_Button_Proc(&hButton1);//检测按键是否按下 如果按下就执行回调函数
}
}
升级版 点击左侧的按钮点亮 点击右边的按钮熄灭