点灯硬件原理图
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和PB9
GPIO_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;//速度50Mhz
GPIO_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();
}
}