基于stm32的独立按键扫描方式
//*
// Function: 扫描按键
// Returns: u8 :按键id值
//*
u8 KeyScan()
{
static u8 keyUp=1;//按键按松开标志
u8 i,count,upCount=0;
count=sizeof(buttons)/sizeof(Button);
for (i=0;i
if (keyUp && (GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==0))
{
keyUp = 0;
delay_ms(10);
if (GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==0)
{
return buttons[i].ButtonId;
}
}
else if ((GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==1))
{
upCount++; //记录有多少个按键松开了
}
}
if (upCount == count)//按键松开数等于总按键数
{
keyUp = 1;
}
return ButtonNone;// 无按键按下
}
通俗易懂吧。接下来看结构体原型
typedef struct
{
GPIO_TypeDef* ButtonPort;//按键端口
uint16_t ButtonPin;//按键引脚
u8ButtonId;//按键ID
}Button;
使用方法
Button buttons[]={{GPIOB,GPIO_Pin_5,ButtonFunction},
{GPIOB,GPIO_Pin_6,ButtonUp},
{GPIOB,GPIO_Pin_1,ButtonDown},
{GPIOB,GPIO_Pin_0,4}};
一般的结构体初始化方法,前两个参数大家都懂,最后一个可以定义一个枚举,当然也可以自己赋值,注意别重复和定义为0了,因为0一般用来当作没有按键的返回值。如今要加减按键就只需在上面的数组中处理。当然别忘了端口的初始化,这个就不说了。
分析一下优缺点,
优点:便于扩展,每加减一个按键都不用修改主要的按键扫描函数,如果端口初始化函数写得好的话连端口初始化函数都可以不用管。
缺点:如果按键过多,会损失不少时间,主要原因是循环结构
stm32独立按键扫描方 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)