按钮的电路设计
电路的搭建
原理与编程
创建了两个变量 用来捕捉按键的状态 先让两个变量都为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 引脚为PIN13RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟GPIOInitstruct.GPIO_Pin = GPIO_Pin_0;GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIOInitstruct); //对GPIOA PIN0初始化为输入上拉模式 不需要输出速度因为是输入模式 引脚为PIN0while(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 // 按钮松开{// ODRif(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);// PA0hButton1.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);//检测按键是否按下 如果按下就执行回调函数}
}
升级版 点击左侧的按钮点亮 点击右边的按钮熄灭