实验四:STM32按键控制LED灯亮灭

编程要点:

1)使能GPIO端口时钟;
2)初始化GPIO目标引脚为输入模式(浮空输入);
3)编写简单测试程序,检测按键的状态,实现按键控制LED灯;

bsp_led.h文件

#ifndef T_LED_H_
#define T_LED_H_
#include "stm32f10x.h"
//R-红色
#define LED1_GPIO_PORT			GPIOB
#define LED1_GPIO_CLK			RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN			GPIO_Pin_5
//G-绿色
#define LED2_GPIO_PORT			GPIOB
#define LED2_GPIO_CLK			RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN			GPIO_Pin_0
//B-蓝色
#define LED3_GPIO_PORT			GPIOB
#define LED3_GPIO_CLK			RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN			GPIO_Pin_1 

以上代码分别把控制LED灯的GPIO端口,GPIO引脚号以及GPIO端口时钟封装起来了。在实际控制的时候我们就可以直接使用这些宏,以达到应用代码与硬件无关的效果。

/*直接操作寄存器的方法控制IO*/
#define digitalHi(p,i)              {p->BSRR=i;}//输出高电平
#define digitalLo(p,i)              {p->BRR=i;}//输出低电平
#define digitalToggle(p,i)          {p->ODR^=i;}//输出反转状态

/*定义控制IO的宏*/
#define LED1_TOGGLE					digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯反转
#define LED1_OFF					digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯灭
#define LED1_ON						digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯亮

#define LED2_TOGGLE					digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯反转
#define LED2_OFF					digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯灭
#define LED2_ON						digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯亮

#define LED3_TOGGLE					digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯反转
#define LED3_OFF					digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯灭
#define LED3_ON						digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯亮

//红
#define LED_RED		         		LED1_ON;LED2_OFF;LED3_OFF		//红
#define LED_GREEN 	 				LED1_OFF;LED2_ON;LED3_OFF		//绿
#define LED_BLUE    				LED1_OFF;LED2_OFF;LED3_ON      //蓝
#define LED_YELLOW 					LED1_ON;LED2_ON;LED3_OFF       //黄
#define LED_PURPLE  				LED1_ON;LED2_OFF;LED3_ON       //紫
#define LED_CYAN        			LED1_OFF;LED2_ON;LED3_ON       //青
#define LED_WHITE  	    			LED1_ON;LED2_ON;LED3_ON        //白
#define LED_RGBOFF 	     			LED1_OFF;LED2_OFF;LED3_OFF     //黑
void LED_GPIO_Config(void);
#endif /*T_LED_H_*/									

bsp_led.c文件:

#include "bsp_led.h"
void LED_GPIO_Config(void)
{		
		//定义一个GPIO_InitTypeDef类型的结构体变量
		GPIO_InitTypeDef GPIO_InitStructure;
		//开启LED相关的GPIO外设时钟
		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);	
		//选择引脚模式为通用推挽输出
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
		//设置引脚速率为50MHz
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
		//选择要控制的GPIO引脚
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
		//初始化GPIO端口
		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		//初始化GPIO引脚
		GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
		//初始化GPIO端口
		GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
		//初始化GPIO引脚
		GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
		//初始化GPIO端口
		GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
		//关灯
		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
		//关灯
		GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);	 
    	//关灯
		GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}

bsp_key.h文件

#ifndef __KEY_H
#define	__KEY_H
#include "stm32f10x.h"
// 引脚定义
#define    KEY1_GPIO_CLK     RCC_APB2Periph_GPIOA
#define    KEY1_GPIO_PORT    GPIOA			   
#define    KEY1_GPIO_PIN	 GPIO_Pin_0
#define    KEY2_GPIO_CLK     RCC_APB2Periph_GPIOC
#define    KEY2_GPIO_PORT    GPIOC		   
#define    KEY2_GPIO_PIN	 GPIO_Pin_13
#define    KEY_ON	1
#define    KEY_OFF	0
void Key_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
#endif /* __KEY_H */

bsp_key.c文件

#include "bsp_key.h"  
void Key_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	/*开启按键端口的时钟*/
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; 
	//选择按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; 
	//选择按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);	
}
/*
检测是否有按键按下函数
*/
 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{			
	/*检测是否有按键按下 */
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
	{	 
		/*等待按键释放*/
		while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);   
		return 	KEY_ON;	 
	}
	else
		return KEY_OFF;
}

main.c文件

#include "stm32f10x.h"
#include "bsp_led.h"  
#include "bsp_key.h" 

int main(void)
{	
	/*LED端口初始化 */
	LED_GPIO_Config();
	/*按键初始化*/
	Key_GPIO_Config();
	/*查询按键是否按下,若按下LED反转*/
	while(1)                            
	{	   
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON  )
		{
			/*LED1反转*/
			LED1_TOGGLE;
		} 
		if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON  )
		{
			/*LED2反转*/
			LED2_TOGGLE;
		}		
	}
}

LED电路连接图

实验四:STM32按键控制LED灯亮灭

按键电路连接图

实验四:STM32按键控制LED灯亮灭

程序下载验证:

实验四:STM32按键控制LED灯亮灭

上一篇:正点原子探索版STM32F407,接入机智云之代码移植


下一篇:PyQt5基础学习-两个线程进行信号交互