STM32寄存器模式实现按键控制LED灯的状态
使用正点原子的开源代码,保证了程序的简洁性和可读性。
key.h文件:
#ifndef __KEY__HH__
#define __KEY__HH__
#include "sys.h"
//KEY端口初始化
#define KEY0PHin(3)
#define KEY1PHin(2)
#define KEY2PCin(13)
#define WK_UPPAin(0)
//声明动作宏
#define KEY0_PRES1//KEY0按下
#define KEY1_PRES2//KEY1按下
#define KEY2_PRES3//KEY2按下
#define WKUP_PRES4//KEY_UP按下
//函数声明
void KEY_Init(void);
u8KEY_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);
}
//按键扫描函数
u8KEY_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);
}
}
}
百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台