我的一个基于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一般用来当作没有按键的返回值。如今要加减按键就只需在上面的数组中处理。当然别忘了端口的初始化,这个就不说了。
分析一下优缺点,
优点:便于扩展,每加减一个按键都不用修改主要的按键扫描函数,如果端口初始化函数写得好的话连端口初始化函数都可以不用管。
缺点:如果按键过多,会损失不少时间,主要原因是循环结构
//*******************************************************************
// 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一般用来当作没有按键的返回值。如今要加减按键就只需在上面的数组中处理。当然别忘了端口的初始化,这个就不说了。
分析一下优缺点,
优点:便于扩展,每加减一个按键都不用修改主要的按键扫描函数,如果端口初始化函数写得好的话连端口初始化函数都可以不用管。
缺点:如果按键过多,会损失不少时间,主要原因是循环结构
相关文章推荐
- STM32 按键扫描的方式实现,用队列传递参数
- 基于状态机的按键扫描的实现
- [置顶] ARM开发(6) 基于STM32的矩阵键盘按键触发外部中断引起蜂鸣器鸣叫
- 关于独立按键扫描程序的思考(整合两种算法)
- cortex_m3_stm32嵌入式学习笔记(二):独立按键实验(IO输入)
- 怎么用STM32配置产生PWM(一个定时器用输出比较方式产生不同频率的PWM)
- 一个基于 Arch 的独立 Linux 发行版 MagpieOS
- 一个简单的基于注解的 Controller (spring 2.5 annotation 方式实现mvc )
- ble学习笔记五------------独立按键查询方式
- document-scanner 一个基于 OpenCV 的文档扫描程序(从现在开始直到完成)
- 第八节:在定时中断函数里执行独立按键的扫描程序。
- 封装另一种思路的按键扫描方式
- 一个基于 Arch 的独立 Linux 发行版 MagpieOS
- VC面向对象的方式 写一个基于TCP的 客户端服务端程序 (SOCKET)
- ble学习笔记五------------独立按键查询方式
- 基于stm32的4X4矩阵键盘定时器扫描消抖法,彻底告别delay函数!
- VC面向对象的方式 写一个基于TCP的 客户端服务端程序 (SOCKET)
- stm32按键的检测(EXTI和Polling两种方式)
- 18、基于 STM32 的 I2C 时序 - GPIO 模拟方式
- 一个基于wcf ria的简单登录方式