这块我先介绍一下按键扫描,这里按键扫描是有很大的缺陷的。问题就在消抖上!如果你如果涉及到按键让某一个变量依次加1的话,你会发现很难控制!但是这里为什么我们要讲按键扫描?因为如果之后有什么别的模块要用到外部中断(比如定时器在输入捕获时),那么这个按键就不能再用中断了只能用扫描了~~~
这里我就直接贴代码了:
<pre name="code" class="cpp" style="font-size: 12.380952835083px;">//button.c
#include"button.h"extern void Delay_ms(u32 ntime);void KEY_GPIO_Init(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);}void Delay(u32 Count){for(; Count!=0; Count--);}u8 KEY_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)//第一次检测到低电平{Delay(10000);if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)//延时后仍然能检测到说明按键按下{while(GPIO_ReadOutputDataBit(GPIOx,GPIO_Pin) == KEY_ON);{ return KEY_ON;}}elsereturn KEY_OFF;}else{return KEY_OFF;}}
<pre name="code" class="cpp" style="font-size: 12.380952835083px;">//button.h
#ifndef _BUTTON_H_#define _BUTTON_H_#include"stm32f10x.h"#include"stm32f10x_gpio.h"#include"stm32f10x_rcc.h"#include"misc.h"#define KEY_ON 0x00//当按键检测到低电平说明被拉低,有效!#define KEY_OFF 0x01extern u8 KEY_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);extern void Delay(u32 Count);extern void KEY_GPIO_Init(void);#endif
<pre name="code" class="cpp" style="font-size: 12.380952835083px;">//main.c
#include"stm32f10x.h"#include"led.h"#include"button.h"u32 TimeDelay=0;void main(){if(KEY_Scan(GPIOA,GPIO_Pin_0) == KEY_ON){GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8)));GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9)));GPIO_ResetBits(GPIOD,GPIO_Pin_2); GPIO_SetBits(GPIOD,GPIO_Pin_2);}if(KEY_Scan(GPIOA,GPIO_Pin_8)==KEY_ON){GPIO_WriteBit(GPIOC, GPIO_Pin_10, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10)));GPIO_WriteBit(GPIOC, GPIO_Pin_11, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11)));GPIO_ResetBits(GPIOD,GPIO_Pin_2); GPIO_SetBits(GPIOD,GPIO_Pin_2);}if(KEY_Scan(GPIOB,GPIO_Pin_1)==KEY_ON){GPIO_WriteBit(GPIOC, GPIO_Pin_12, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12)));GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)));GPIO_ResetBits(GPIOD,GPIO_Pin_2); GPIO_SetBits(GPIOD,GPIO_Pin_2);}if(KEY_Scan(GPIOB,GPIO_Pin_2)==KEY_ON){GPIO_WriteBit(GPIOC, GPIO_Pin_14, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14)));GPIO_WriteBit(GPIOC, GPIO_Pin_15, (BitAction)(1-GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)));GPIO_ResetBits(GPIOD,GPIO_Pin_2); GPIO_SetBits(GPIOD,GPIO_Pin_2);}}}void Delay_ms(u32 ntime){TimeDelay=ntime;while(TimeDelay);}
我这个工程是四个按键分别控制八个led灯亮灭。