您的位置:首页 > 其它

我的一个基于stm32的独立按键扫描方式

2013-11-30 14:50 381 查看
这两天完成了一个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<count;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; //按键引脚

u8 ButtonId;
//按键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一般用来当作没有按键的返回值。如今要加减按键就只需在上面的数组中处理。当然别忘了端口的初始化,这个就不说了。

分析一下优缺点,

优点:便于扩展,每加减一个按键都不用修改主要的按键扫描函数,如果端口初始化函数写得好的话连端口初始化函数都可以不用管。

缺点:如果按键过多,会损失不少时间,主要原因是循环结构
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: