点灯硬件原理图
1、首先,我们查看一下原理图,找到相对应的GPIO口
LED_R低电平导通,LED4亮,所以LED_R的GPIO口需要配置一个低电平才能亮;
LED_G低电平导通,LED3亮,所以LED_R的GPIO口需要配置一个低电平才能亮;
点灯代码实现部分
#include "led.h"
#include "delay.h"int main(void)
{Led_Config();//LED初始化while(1){ led3_on();Delay_ms(1000);led3_off();Delay_ms(1000);}
}
#include "led.h"/*
函数功能:LED初始化1、打开GPIOB时钟2、LED4 PB8 LED_R----- 通用推挽模式 LED3 PB9 --LED_G ----- 通用推挽模式
*/void Led_Config(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//打开GPIOB的时钟GPIO_InitTypeDef GPIO_InitStruct;//声明结构体变量//初始化PB8和PB9GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//通用输出GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;//第八号管脚GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度50MhzGPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_SetBits(GPIOB, GPIO_Pin_8);//灭GPIO_SetBits(GPIOB, GPIO_Pin_9);//灭}void led3_on(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_9);//亮
}void led3_off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_9);//灭
}void led4_on(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_8);//亮
}void led4_off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_8);//灭
}
#ifndef _LED_H_
#define _LED_H_#include "stm32f4xx.h"void Led_Config(void);
void led3_on(void);
void led3_off(void);
void led4_on(void);
void led4_off(void);#endif
按键硬件电路
KEY1按下是高电平,未按下是低电平。
KEY2按下是低电平,未按下是高电平。
按键代码实现部分
实现现象:key1控制LED3的亮灭、key2控制LED4的亮灭。
#include "key.h"
#include "delay.h"
#include "led.h"/*
key1 PA0
key2 PC13
*/
void key_config(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC,ENABLE); //开启GPIOA的时钟GPIO_InitTypeDef GPIO_InitStruct = {0};//声明结构体变量//给结构体赋值GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //PA0引脚GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空模式GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;GPIO_Init(GPIOA,&GPIO_InitStruct); //写入结构体GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_Init(GPIOC,&GPIO_InitStruct); //写入结构体
}/*
0 没有按键按下
1 key1按下
2 key2按下
*/uint8_t key_scan(void)
{uint8_t key_state = 0;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1) {Delay_ms(10);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1){while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1){//按键1按下}key_state = 1;}}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0) {Delay_ms(10);if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0){while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0){//按键2按下}key_state = 2;}}return key_state;
}//按键处理函数
void KEY_Handle(void)
{uint8_t Key_State=0;Key_State = key_scan();switch(Key_State){case 0: //没有按键按下break;case 1: //按键1按下led3_T();break; case 2: //按键2按下led4_T();break;case 3: //按键3按下break; case 4: //按键4按下break; default:break;}
}
#ifndef _KEY_H_
#define _KEY_H_#include "stm32f4xx.h" // Device header
void key_config(void);
uint8_t key_scan(void);
void KEY_Handle(void);#endif
#include "led.h"
#include "delay.h"
#include "key.h"int main(void)
{Led_Config();//LED初始化key_config();while(1){ KEY_Handle();}
}