版权声明:本文为博主原创文章,转载请注明原创链接! 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);
}
}
}