GPIO再举例之反转按键

GPIO再举例之反转按键

要求:实现按键反转

前提:已实现STM32 上 LED灯点亮的相关代码

完整代码如下:

#include "stm32f10x.h"
#define DELAY_TIME   0x3FFFFF
#define KEY_ON   0
#define KEY_OFF  1
void Delay(__IO uint32_t nCount)
{
   for(; nCount != 0; nCount--) ;
}

 u8 Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
	{
 		if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)   /*检测按键是否被按下,KEY_ON表示有可能被按下*/
		{
			/*延时消抖*/
			Delay(10000);
			    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
					{
						     /*等待按键被释放*/
						while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
						return KEY_ON;
					}
					else
						 return KEY_OFF;
				}
				else
					return KEY_OFF;
		}


int main(void)
{
	GPIO_InitTypeDef   GPIO_InitStructure;       	                     /*定义一个GPIO_InitTypeDef类型的结构体*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	                    /*开启GPIO的外设时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_5;			      /*选择一控制的GPIO引*/    
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                          /*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                         /*设置引脚速率为50MHz*/
	GPIO_Init(GPIOB,&GPIO_InitStructure);	                                   /*调用库函数,初始化GPIOC*/
	GPIO_Init(GPIOD, &GPIO_InitStructure);  
	
 	GPIO_SetBits(GPIOB, GPIO_Pin_5);  /*点亮LED1*/
//	GPIO_SetBits(GPIOD, GPIO_Pin_6|GPIO_Pin_3);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 /*开启GPIOC的时钟*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
			
	while(1)
    {
	if(Key_Scan(GPIOC,GPIO_Pin_5) == KEY_ON)  /*检测按键是否被按下,KEY_ON表示有可能被按下*/
     {
	GPIO_WriteBit(GPIOD,GPIO_Pin_6,
	(BitAction)((1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_6))));
     }
    }}

分步分析代码:

1.延时装置

作用:消抖

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

2.检测按键的状态

利用while函数形成一个死循环,不停调用Key_Scan函数,扫描按键是否被按下。

值得注意的是,这里的KEY_ON利用宏定义表示0,KEY_OFF利用宏定义表示1.

u8 Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
	{
 		if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)   /*检测按键是否被按下,KEY_ON表示有可能被按下*/
		{
			/*延时消抖*/
			Delay(10000);
			    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
					{
						     /*等待按键被释放*/
						while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
						return KEY_ON;
					}
					else
						 return KEY_OFF;
				}
				else
					return KEY_OFF;
		}

3.main函数中的代码分析

这里是点亮LED灯的相关代码

GPIO_InitTypeDef   GPIO_InitStructure;       	                     /*定义一个GPIO_InitTypeDef类型的结构体*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	                    /*开启GPIO的外设时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_5;			      /*选择一控制的GPIO引*/    
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                          /*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                         /*设置引脚速率为50MHz*/
	GPIO_Init(GPIOB,&GPIO_InitStructure);	                                   /*调用库函数,初始化GPIOC*/
	GPIO_Init(GPIOD, &GPIO_InitStructure);  

4.点亮LED1

	GPIO_SetBits(GPIOB, GPIO_Pin_5);  /*点亮LED1*/

5.开启按键的时钟及相关参数的设置

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 /*开启GPIOC的时钟*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

6.检查按键是否被按下+实现反转

	while(1)
			{
				if(Key_Scan(GPIOC,GPIO_Pin_5) == KEY_ON)  /*检测按键是否被按下,KEY_ON表示有可能被按下*/
				{
					GPIO_WriteBit(GPIOD,GPIO_Pin_6,       /*反转点亮LED2*/  
					(BitAction)((1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_6))));
				}
			}
		}
反转实现是读取当前的电平,然后用1减去读出的电平数据状态,相当于获取一个与当前输出相反的状态,再把这个相反的状态通过函数写入,从而实现了输出状态取反的功能。


展开阅读全文

没有更多推荐了,返回首页