手搓固件库——GPIO输入一按键检测

手搓固件库——GPIO输入一按键检测_第1张图片

没有电容(需要软件消抖)

手搓固件库——GPIO输入一按键检测_第2张图片

手搓固件库——GPIO输入一按键检测_第3张图片手搓固件库——GPIO输入一按键检测_第4张图片 

手搓固件库——GPIO输入一按键检测_第5张图片

手搓固件库——GPIO输入一按键检测_第6张图片

idr寄存器配置输入 

 读取输入手搓固件库——GPIO输入一按键检测_第7张图片

代码

#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED_G_GPIO_PIN              GPIO_Pin_0
#define LED_G_GPIO_PORT             GPIOB
#define LED_G_GPIO_CLK              RCC_APB2Periph_GPIOB


#define    ON        1
#define    OFF       0

// \  C语言里面叫续行符,后面不能有任何的东西

#define   LED_G(a)   if(a) \
	                       GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
                     else  GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);

// ^ 异或,C语言的一个二进制的运算符
// 与1异或改变,与0异或不变

#define LED_G_TOGGLE        {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}

void LED_GPIO_Config(void);

#endif /* __BSP_LED_H */
#include "bsp_key.h"


void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);	
}

uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
	if( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
	{
		// 松手检测,这里没有软件消抖,因为板子上有电容进行了硬件消抖
		while( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON );
		return KEY_ON;
	}
	else return KEY_OFF;
}
#include "stm32f10x.h"   // 相当于51单片机中的  #include 
#include "bsp_led.h"
#include "bsp_key.h"

void Delay( uint32_t count )
{
	for(; count!=0; count--);
}

int main(void)
{
	// 来到这里的时候,系统的时钟已经被配置成72M。
	LED_GPIO_Config();
	KEY_GPIO_Config();
	
	while(1)
	{
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) ==KEY_ON )
			LED_G_TOGGLE;
		
		// if
	}
}

你可能感兴趣的:(stm32,蓝桥杯)