一旦用到按键,一个关键的问题就是消抖,如果对这个问题不管的话,会引起很多难以控制的问题,最常见的就是反复进入中断导致程序飞出。
目前我手里的这款32有四个按键,上PA0是高电,左下右PE234是低电
操作步骤:
持续胡扫描key.c
#include "system.h"
#define KEY_LEFT_Pin GPIO_Pin_2 //定义K_LEFT管脚
#define KEY_DOWN_Pin GPIO_Pin_3 //定义K_DOWN管脚
#define KEY_RIGHT_PinGPIO_Pin_4 //定义K_RIGHT管脚
#define KEY_UP_Pin GPIO_Pin_0 //定义KEY_UP管脚
#define KEY_Port (GPIOE) //定义端口
#define KEY_UP_Port (GPIOA) //定义端口
//使用位操作定义
#define K_UP PAin(0)
#define K_DOWN PEin(3)
#define K_LEFT PEin(4)
#defineK_RIGHT PEin(2)
//使用读取管脚状态库函数定义
//#define K_UPGPIO_ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin)
//#define K_DOWNGPIO_ReadInputDataBit(KEY_Port,KEY_DOWN_Pin)
//#define K_LEFTGPIO_ReadInputDataBit(KEY_Port,KEY_LEFT_Pin)
//#define K_RIGHTGPIO_ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin)
//定义各个按键值
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_RIGHT 4
void KEY_Init(void);
u8 KEY_Scan(u8 mode);
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //下拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(KEY_UP_Port,&GPIO_InitStructure); /*初始化GPIO*/
GPIO_InitStructure.GPIO_Pin=KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(KEY_Port,&GPIO_InitStructure);
}
u8 KEY_Scan(u8 mode)
{
int i,j;
static u8 key = 1;
if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))
{
for(i = 0;i < 10;i++)
{
for(j = 0;j < 50; j++)
{}
}
key=0;
if(K_UP==1){
return KEY_UP;
}
else if(K_DOWN==0){
return KEY_DOWN;
}
else if(K_LEFT==0){
return KEY_LEFT;
}
else{
return KEY_RIGHT;
}
}
else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)
{
key=1;
}
if(mode==1) //??????
{
key=1;
}
return 0;
}
扫描模式带有一个形参,0扫描一次,1持续扫描
上一篇:stm32 蜂鸣器
下一篇:stm32 系统滴答定时器
推荐阅读最新更新时间:2024-11-20 11:04
设计资源 培训 开发板 精华推荐
- STEVAL-IDS001V2,基于 SPIRIT1 的演示板,315 MHz 频段低数据速率、短距离 USB 加密狗收发器
- DN05075/D,用于 15W LED 的降压-升压转换器设计说明
- MCP1630RD-LIC1、MCP1630 锂离子多槽电池充电器参考设计
- LTC2185IUP、16 位、125Msps 低功耗双通道 ADC 的典型应用电路
- DER-646 - 9W、宽范围、带开关填谷的隔离式反激式蓝牙轨道灯
- AM2F-1212SH52Z 12V 2瓦DC-DC转换器的典型应用
- 用于开/关控制应用的 AM2G-1205DH30Z ±5V 2 瓦 DC-DC 转换器的典型应用
- LT4275AIDD LTPoE++ 90W 受电设备接口的典型应用电路
- 使用 ON Semiconductor 的 ADP3170 的参考设计
- 采用辉芒微单片机的MP3闹钟