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);
}
}
}
上一篇:STM32F4之LED(一)
下一篇:STM32F4之串口(三)
推薦閱讀
史海拾趣