STM32F4之按键(二)

版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_34706280/article/details/83828767

STM32寄存器模式实现按键控制LED灯的状态
使用正点原子的开源代码,保证了程序的简洁性和可读性。
key.h文件:

#ifndef __KEY__HH__
#define __KEY__HH__

#include "sys.h"
//KEY端口初始化
#define KEY0	PHin(3)
#define KEY1	PHin(2)
#define KEY2	PCin(13)
#define WK_UP	PAin(0)

//声明动作宏
#define KEY0_PRES	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define KEY2_PRES	3	//KEY2按下
#define WKUP_PRES	4	//KEY_UP按下


//函数声明
void KEY_Init(void);
u8	KEY_Scan(u8);
#endif

key.c文件:

#include "key.h"
#include "delay.h"

void KEY_Init(void)
{
	//使能时钟 PORTA、PORTC、 PORTH
	RCC -> AHB1ENR |= 1 << 0;	//A是首位
	RCC -> AHB1ENR |= 1 << 2;	//C是三位
	RCC -> AHB1ENR |= 1 << 7;
	
	//设置GPIOx模式 GPIOA、GPIOC、GPIOH
	GPIO_Set(GPIOA, PIN0, GPIO_MODE_IN, GPIO_OTYPE_PP, GPIO_SPEED_2M, GPIO_PUPD_PD);
	GPIO_Set(GPIOC, PIN13, GPIO_MODE_IN, GPIO_OTYPE_PP, GPIO_SPEED_2M, GPIO_PUPD_PU);
	GPIO_Set(GPIOH, PIN2|PIN3, GPIO_MODE_IN, GPIO_OTYPE_PP, GPIO_SPEED_2M, GPIO_PUPD_PU);

}

//按键扫描函数
u8	KEY_Scan(u8 mode)
{
	//定义按键松开标志
	static u8 key_up = 1;
	//连按模式支持
	if(mode)
	{
		key_up = 1;
	}
	
	if(key_up && (0 == KEY0 | 0 == KEY1 | 0 == KEY2 | 1 == WK_UP))
	{
		//去抖动
		delay_ms(10);
		key_up = 0;
		if(0 == KEY0)
		{
			return 1;
		}
		else if(0 == KEY1)
		{
			return 2;
		}
		else if(0 == KEY2)
		{
			return 3;
		}
		else if(1 == WK_UP)
		{
			return 4;
		}
	}
	else if(1 == KEY0 | 1 == KEY1 | 1 == KEY2 | 0 == WK_UP)
	{
		key_up = 1;
	}
	
	return 0;
}

main.c文件:

#include "sys.h"
#include "delay.h"
#include "key.h"
#include "led.h"

int main(void)
{
	//定义键值变量
	u8 key;
	//设置时钟
	Stm32_Clock_Init(360, 25, 2, 8);
	//初始化延时函数
	delay_init(180);
	//初始化LED
	LED_Init();
	//初始化KEY
	KEY_Init();
	//点亮LED0
	LED0 = 0;
	
	while(1)
	{
		//得到键值
		key = KEY_Scan(0);
		
		if(key)
		{
			switch (key)
			{
				case WKUP_PRES:
					LED1 = !LED1;
					LED0 = !LED1;
					break;
				case KEY2_PRES:
					LED1 = !LED1;
					break;
				case KEY1_PRES:
					LED0 = !LED0;
					break;
				case KEY0_PRES:
					LED1 = !LED1;
					LED0 = !LED0;
					break;
			}
		}
		else
		{
			delay_init(10);
		}
	}
}


猜你喜欢

转载自blog.csdn.net/qq_34706280/article/details/83828767