实现按键控制LED灯
前置知识:
基本的GPIO
- 输入模式:读取外部信号(如按键、传感器状态)。——主要用到上拉输入
- 输出模式:向外部输出信号(如控制 LED、继电器)。——主要用到推挽输出
- 其他模式:模拟输入、复用功能(如 USART、I2C)等。
按键的知识与常识
- 按键未按下:GPIO 引脚通过上拉电阻连接到 VCC,读取为高电平(1)。
- 按键按下:按键将 GPIO 引脚直接接地,读取为低电平(0)。
有关LED的代码部分
执行文件.c
#include "stm32f10x.h" // Device header
//LED的初始化函数
void LED_Init(void)
{
//时间时钟函数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//设置GPIO的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//设置为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//setbits是使它值为1(高电平)
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}
void LED1_ON(void){
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void){
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED1_Turn(void){
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) {
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
else{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
}
void LED2_ON(void){
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void){
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED2_Turn(void){
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0) {
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
}
头文件.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);
#endif
有关按键部分:
执行文件.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*
按键未按下:GPIO 引脚通过上拉电阻连接到 VCC,读取为高电平(1)。
按键按下:按键将 GPIO 引脚直接接地,读取为低电平(0)。
*/
uint8_t Key_GetNum(void){
uint8_t KeyNum = 0;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)
Delay_ms(20);
KeyNum =1;
}
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0){
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0)
Delay_ms(20);
KeyNum =2;
}
return KeyNum;
}
头文件.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_GetNum(void);
#endif
main.c
#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t KeyNum;
int main(void)
{
//主函数初始化
LED_Init();
Key_Init();
while(1){
//进入循环后,获取按键状态
KeyNum = Key_GetNum();
if(KeyNum == 1){
LED1_Turn();
}
if(KeyNum == 2){
LED2_Turn();
}
}
}