按键编程 pal库和标准库

按钮的电路设计

按键编程 pal库和标准库_第1张图片
电路的搭建
按键编程 pal库和标准库_第2张图片
原理与编程
按键编程 pal库和标准库_第3张图片
创建了两个变量 用来捕捉按键的状态 先让两个变量都为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库和标准库_第4张图片
声明句柄 句柄是啥?
按键编程 pal库和标准库_第5张图片
句柄就是一种数据结构 编程就为数据结构+算法 数据结构就是数据 算法就是对数据结构里的数据进行操作 如茶壶 首先定义一个结构体用来存放茶壶的一些数据 (容量和水量)
第一个函数(对数据进行操作的方法)就是初始化一个茶壶 第二个函数就是完成倒入茶壶水 第三个函数就是从茶壶里倒出水

对按钮的编程也是数据结构+算法的方法 声明一个结构体 填表按键编程 pal库和标准库_第6张图片
PAL库把初始化和按键按下封装
出现了回调函数
按键编程 pal库和标准库_第7张图片

#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);//检测按键是否按下 如果按下就执行回调函数
	}
}

升级版 点击左侧的按钮点亮 点击右边的按钮熄灭

你可能感兴趣的:(stm32,单片机)