基本思路
- 首先检测按键有没有按下 。
- 如果检测到按键按下,进行适当延时延时滤除输入波动。
- 再次检查按键有没有按下。
- 如果检测到按键按下,等待按键释放(用循环语句进行等待)。
- 按键释放后,执行按键对应功能的代码。
相关代码
#include "stm32f10x.h"
int main(void){
//定义标记位
int flag = 0;
//定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//选择GPIO的第12引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//配置GPIO的12引脚工作模式为下拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
//初始化GPIOB
GPIO_Init(GPIOB, &GPIO_InitStructure);
//选择GPIOB的13引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
//配置GPIO的13引脚工作模式为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//初始化GPIOB
GPIO_Init(GPIOB, &GPIO_InitStructure);
while(1){
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1){
SysTick_Delay_ms(100);
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1){
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1);
if(flag){
GPIO_ResetBits(GPIOB, GPIO_Pin_13);
flag = 0;
}else{
GPIO_SetBits(GPIOB, GPIO_Pin_13);
flag = 1;
}
}
}
}
}
void SysTick_Delay_ms(u32 i){
u32 temp;
//设置重装数值, 72MHZ时
SysTick->LOAD = 9000 * i;
//使能,减到零是无动作,采用外部时钟源
SysTick->CTRL=0X01;
//清零计数器
SysTick->VAL=0;
do{
//读取当前倒计数值
temp=SysTick->CTRL;
}while((temp & 0x01) && (!(temp & (1 << 16)))); //等待时间到达
//关闭计数器
SysTick->CTRL=0;
//清空计数器
SysTick->VAL=0;
}