本帖最后由 刘洋讲单片机 于 2017-1-11 15:42 编辑
第13讲.独立键盘检测.zip
(336.53 KB)
众拳【剑齿虎STM8】开发板学习笔记分享
点击此处查看全部资料
第13讲 独立键盘检测
目 录
13.1键盘作用 2
13.2剑齿虎开发板集成自定义微动开关 3
13.2.1开发板自定义微动开关原理图 3
13.2.2自定义微动开关检测方法 4
13.3程序文件设计 5
13.3.1 lib文件中内容分析 5
13.3.2 main.c文件中的程序 6
13.3.3 key.c文件中的程序 7
13.3.4 key.h文件中的程序 9
13.1键盘作用
在剑齿虎上集成了两个键盘,一个是用来复位使用,一个是独立键盘,给用户自定义使用。键盘有很多种叫法,灵敏开关、触点开关、按键、微动开关等。
微动开关是一种施压促动的快速开关。 其工作原理是:外机械力通过传动元件(按销、按钮、杠杆、滚轮等)将力作用于动作**上,并将能量积聚到临界点后,产生瞬时动作,使动作**末端的动触点与定触点快速接通或断开。当传动元件上的作用力移去后,动作**产生反向动作力,当传动元件反向行程达到**的动作临界点后,瞬时完成反向动作。微动开关的触点间距小、动作行程短、按动力小、通断迅速。其动触点的动作速度与传动元件动作速度无关。微动开关以按销式为基本型,可派生按钮短行程式、按钮大行程式、按钮特大行程式、滚轮按钮式、**滚轮式、杠杆滚轮式、短动臂式、长动臂式等等。 微动开关在电子设备及其他设备中用于需频繁换接电路的自动控制及安全保护等装置中。微动开关分为大型、中型、小型,按不同的需要分有可以有防水型(放在液体环境中使用)和普通型,开关连接两个线路,为电器、机器等提供通断电控制,广泛应用在鼠标,家用电器,工业机械,摩托车等地方,开关虽小,但起着不可替代的作用。
13.2剑齿虎开发板集成自定义微动开关
剑齿虎开发板集成了一个独立的微动开关。它不和其它集成的功能有冲突和共用控制管脚的问题,这个独立的微动开关由PE4管脚控制,用户可以根据自己的需要设计这个独立微动开关的使用功能。
13.2.1开发板自定义微动开关原理图
图13.1自定义微动开关
13.2.2自定义微动开关检测方法
检测方式有两种,一种是扫描检测,另一种是中断检测。这次先说第一种,什么是扫描检测?
就是单片机每隔一段时间,就去检测一下IO口的状态,未触发的时候,该引脚是高电平,触发的时候是低电平。有人会有疑问,这种方式会不会有遗漏?基本不会,因为单片机以微秒甚至纳秒的级别运行指令,而触发一次按键至少需要几十毫秒,只要扫描次数足够,基本不会有遗漏。
什么是消抖?检测出键闭合后执行一个延时程序,10ms~20ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给10ms~20ms的延时,待后沿抖动消失后才能转入该键的处理程序。
那什么是中断检测呢?在程序设计中设置中断扫描标志,当有开关被按下是时,产生中断,CPU相应中断后转入处理中断子程序。
在这个实验中我们采用的是扫描(查询)检测的方法,目的是为了初学者学习使用。
注释:扫描检测占用CPU资源,中段检测不占用CPU资源,最好采用中断方式检测微动开关是否被按下。
13.3程序文件设计
13.3.1 lib文件中内容分析
我们建立一个“Lib”文件夹,把引用系统本身定义好的库函数加在其中,我们使用到哪个外设功能,直接引用到此文件夹中即可。一般情况下下面这三个文件都得引用。
图13.2 stm8s_conf.h头文件内部选择
本节实验及以后的实验我们都是用到库文件,其中 stm8s_conf.h头文件包含了所有外设的声明头文件,在本试验中我们使用到时钟外设和GPIO端口外设。所以#include "stm8s_clk.h"和#include "stm8s_gpio.h"需要“打开”(就是把语句前面的双斜线注释符号删除即可,参考图13.2)。Stm8s_gpio.c库函数包含了所有管脚初始化功能和具体的执行操作;Stm8s_clk.c库函数主要包含了内部时钟和外部时钟设置,在主函数中规定了具体的执行方法,在这个函数中就有具体相关的执行步骤。
13.3.2 main.c文件中的程序
主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。详情请大家参考光盘(网盘)中程序及程序注释。
#include "pbdata.h"
/***************************************************************************
* 函 数 名: KEY_Init
* 功能说明: KEY的GPIO管脚初始化
* 形 参:无
* 返 回 值: 无
***************************************************************************/
void KEY_Init(void)
{
GPIO_Init(K1_PORT, K1_PIN, GPIO_MODE_IN_FL_NO_IT);//初始化KEY键盘管脚为浮动输入无中断功能
}
/***************************************************************************
* 函 数 名: KEY_Down
* 功能说明: 键盘检测消斗
* 形 参:GPIO_TypeDef* GPIOx 输入要检测的端口
* GPIO_Pin_TypeDef GPIO_Pin 输入要检测的引脚
* 返 回 值: 布尔类型 (true 按下,flase 弹起)
***************************************************************************/
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
//检测是否有按键按下
if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//是否为低电平,低电平按下,高电平弹起
{
delay_ms(20);//延时20毫秒消抖
if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//再一次检测键盘是否有按下
{
//低电平为真(等待) 高电平为假(退出WHILE循环)
while(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0);
return true;//函数返回真
}
}
return false;//函数返回假
}
/**************************************************************************
* 函 数 名: KEY_Demo
* 功能说明: 键盘输入检测
* 形 参:无
* 返 回 值: 无
**************************************************************************/
void KEY_Demo(void)
{
if(KEY_Down(K1_PORT,K1_PIN)==true)//判断K1键盘是否被按下,如果按下将执行下面的语句,否则退出函数。
{
LED1_R;//PE0引脚电平取反,高电平时LED1发光二极管(熄灭),底电平时LED1发光二极管(发光)
LED2_R;//PA3引脚电平取反,高电平时LED2发光二极管(熄灭),底电平时LED2发光二极管(发光)
LED3_R;//PA6引脚电平取反,高电平时LED3发光二极管(熄灭),底电平时LED3发光二极管(发光)
}
}
13.3.3 key.c文件中的程序
#include "pbdata.h"
/***************************************************************************
* 函 数 名: KEY_Init
* 功能说明: KEY的GPIO管脚初始化
* 形 参:无
* 返 回 值: 无
***************************************************************************/
void KEY_Init(void)
{
GPIO_Init(K1_PORT, K1_PIN, GPIO_MODE_IN_FL_NO_IT);//初始化KEY键盘管脚为浮动输入无中断功能
}
/***************************************************************************
* 函 数 名: KEY_Down
* 功能说明: 键盘检测消斗
* 形 参:GPIO_TypeDef* GPIOx 输入要检测的端口
* GPIO_Pin_TypeDef GPIO_Pin 输入要检测的引脚
* 返 回 值: 布尔类型 (true 按下,flase 弹起)
***************************************************************************/
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
//检测是否有按键按下
if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//是否为低电平,低电平按下,高电平弹起
{
delay_ms(20);//延时20毫秒消抖
if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//再一次检测键盘是否有按下
{
//低电平为真(等待) 高电平为假(退出WHILE循环)
while(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0);
return true;//函数返回真
}
}
return false;//函数返回假
}
/***************************************************************************
* 函 数 名: KEY_Demo
* 功能说明: 键盘输入检测
* 形 参:无
* 返 回 值: 无
***************************************************************************/
void KEY_Demo(void)
{
if(KEY_Down(K1_PORT,K1_PIN)==true)//判断K1键盘是否被按下,如果按下将执行下面的语句,否则退出函数。
{
LED1_R;//PE0引脚电平取反,高电平时LED1发光二极管(熄灭),底电平时LED1发光二极管(发光)
LED2_R;//PA3引脚电平取反,高电平时LED2发光二极管(熄灭),底电平时LED2发光二极管(发光)
LED3_R;//PA6引脚电平取反,高电平时LED3发光二极管(熄灭),底电平时LED3发光二极管(发光)
}
}
13.3.4 key.h文件中的程序
/***********************************************************************
* 剑齿虎STM8开发板硬件连接
*
* K1引脚定义 K1-PE4
************************************************************************/
#ifndef _KEY_H
#define _KEY_H
/*---------------------------头文件引用--------------------------------------*/
#include "stm8s.h"//引用STM8头文件
/*---------------------------宏定义声明--------------------------------------*/
#define K1_PIN GPIO_PIN_4 //定义GPIO_PIN_4引脚为K1_PIN,相当于重新命名。
#define K1_PORT GPIOE //定义GPIOE端口为K1_PORT,相当于重新命名。
//如果想用其他管脚检测KEY键盘,那么只需更改上面对应的端口与引脚编号即可
/*---------------------------函数声明--------------------------------------*/
void KEY_Init(void);//KEY初始化函数
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin);//KEY键盘检测消斗函数
void KEY_Demo(void);//KEY键盘检测实验函数
#endif //定义文件名称结束
在这里我们对程序的主要部分做了详细的说明,如果想了解全部程序,请使用IAR软件打开我们的第13讲独立键盘检测程序(位置以光盘内容为主)。
独立键盘检测
|