借鉴正点原子教学代码和模板
蜂鸣器懒得做
按键输入:
步骤:
1.初始化IO时钟
2.初始化PE2,3,4,上拉,PA1.下拉,当KEY0,1,2按下时,PE2,3,4,与地相连,PA1与电源输入相连。
3.编写输入捕获函数void KEY_Scan(mode) // mode用于选择按键为点按还是长按。key_up用 于表示按键是否松开。
当mode=0时,key_up不恢复为1,只捕获一次按键
当mode=1时,每次采集前key_up恢复为1,一直捕获按键输入
key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f4xx_gpio.h"
#include "stm32f4xx.h"
#define KEY0_PIN GPIO_Pin_4
#define KEY1_PIN GPIO_Pin_3
#define KEY2_PIN GPIO_Pin_2
#define WK_UP_PIN GPIO_Pin_2
#define KEY_GPIO GPIOE
#define WK_UP_GPIO GPIOA
#define KEY_GPIO_CLK RCC_AHB1Periph_GPIOE
#define WK_UP_GPIO_CLK RCC_AHB1Periph_GPIOA
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
void KEY_Init(void);
u8 KEY_Scan(u8 mode);
#endif
key.c
#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK |KEY_GPIO_CLK ,ENABLE);
RCC_AHB1PeriphClockCmd(WK_UP_GPIO_CLK ,ENABLE);
GPIO_InitTypeDef GPIO_InitStructe;
GPIO_InitStructe.GPIO_Pin = KEY0_PIN |KEY1_PIN |KEY2_PIN ;
GPIO_InitStructe.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructe.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructe.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(KEY_GPIO,&GPIO_InitStructe);
GPIO_InitStructe.GPIO_Pin = WK_UP_PIN ;
GPIO_InitStructe.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructe.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructe.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(WK_UP_GPIO,&GPIO_InitStructe);
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode)
{
key_up=1;
}
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);
key_up=0;
if (KEY0==0) return KEY0_PRES;
if (KEY1==0) return KEY1_PRES;
if (KEY2==0) return KEY2_PRES;
if (WK_UP==1) return WKUP_PRES;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
{
key_up=1;
}
return 0;
}
main.c
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
delay_init(168);
LED_Init();
KEY_Init();
PWM_Init(500,84);
u8 key;
u16 ledpwm=0;
u8 chang_flag=1;
LED0(OFF);
LED1(OFF);
while(1)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case KEY0_PRES:
LED0(ON);
LED1(OFF);
break;
case KEY1_PRES:
LED0(OFF);
LED1(ON);
break;
case KEY2_PRES:
LED0(ON);
LED1(OFF);
delay_ms(500);
LED0(OFF);
LED1(ON);
delay_ms(500);
case WKUP_PRES:
LED0(OFF);
LED1(OFF);
break;
}
key=0;
}
else delay_ms(10);
}
}
|