检测按键按下与否,进而做出相应的消息响应,
按键与IO口和GND相连。
<key.h>*********************************
#ifndef __KEY_H
#define __KEY_H
#define KEYPORT GPIOA //IO口的宏定义
#define KEY1 GPIO_Pin_0
#define KEY2 GPIO_Pin_1
void KEY_Init(void);
#endif
<key.c>*********************************
#include "key.h"
void KEY_Init(void){ //按键初始化
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY1 | KEY2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //当按键没有按下时,IO口检测为高电平,为上拉电阻模式,按下IO口与地连接,为低电平
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //与按键相连的IO口为输入,不需要设置接口速度,只有输出才用
GPIO_Init(KEYPORT,&GPIO_InitStructure)
}
<main.c>*********************************
#include "stm32f10x.h" //STM32????
#include "delay.h"
#include "key.h"
int main (void){
u8 a;
RCC_Configuration();
KEY_Init();
while(1){
//方法1
if(GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读取按键的高低电平 判断按键是否按下
GPIO_ResetBits(LEDPORT,LED1); //按下后的消息响应,此处为点灯
}else{
GPIO_SetBits(LEDPORT,LED1); //
}
//方法2 更为常用
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){
delay_ms(20); //延时 20ms ,硬件消抖,防止读取错误
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ // GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1)));
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键起来
}
}
网友评论