按键与键盘输入接口
独立按键输入接口
设置I/O口为输入方式,使能内部上拉电阻。当按键 处于断开状态时,I/O口引脚为高电平。当有按键按 下时,相应引脚由于接地,变成低电平。检测引脚 的电平可以判断按键是否按下。
实际的按键并不是理论上的简单,要考虑按键消抖的问题。由于按键开关为 机械式触点开关,利用机械触点接触和分离实现电路的通断。由于机械触点 弹性作用,加上按键时力度方向等不同,按键开关从按下到接触稳定需要经 过数毫秒的弹跳抖动,即在按下的几十毫秒时间理会连续产生多个脉冲;而 释放按键时,电路也不会一下断开,同样会产生抖动,按键的稳定闭合时间 为0.3~0.5秒。为了确保MCU对于按键动作准确确认,需要进行消抖处理。消 抖方式分为硬件(R-S触发器)和软件方式(第一次检测到按键后,延时 10ms,再次检测按键是否按下,只有两侧都检测到时,才确认按键按下)。
矩阵键盘输入接口
独立式按键就是按键相互独立,每个按键占用一个I/O口,彼此没有影 响。其电路简单配置灵活,适用于系统需要较少的按键场合。在需要 较多按键的情况下,往往采用矩阵式键盘接口。
一个4×4的矩阵键盘结构,可以构成16个按键,只需要占用8个I/O口, 节省很多引脚,但连接上比独立式按键复杂,而且按键识别方法也比 独立式复杂。
状态机分析
对于电子技术的读者,最先接触和使用到状态机是在数字逻辑电 路中,状态机的思想和分析方法被应用于时序逻辑电路设计。有限状 态机(FSM)是实时系统设计中的一种数学模型,是一种重要的、易 于建立的、应用比较广泛的、以描述控制特性为主的建模方法,它可 以应用于从系统分析到设计(硬件、软件)的所有阶段。采用状态机 对一个系统进行分析是一项非常细致的工作,它实际上是建立在对真 实系统有了全面、深入地了解和认识基础之上,进行综合和抽象化的 模型建立的过程。通常两种方法来建立有限状态机,一种状态转移图, 另一种状态转移表。总的说来,有限状态机的优点在于简单、易用、 状态间的关系能够直观看到;当应用在实时系统中时,便于对复杂系 统进行分析。 把单个按键看成是一个状态机,首先需要对一次按键操作和确认 的实际过程进行分析,然后根据实际情况和系统需要确定按键在整个 过程的状态和每个状态的输入信号和输出信号,以及状态之间的转换 关系,最后还要考虑时间序列的间隔。
基于状态机分析的按键设计2
(消抖) 有按键状态 无按键状态
(干扰)
计时 状态
计时 状态
#define key_input PIND.7//按键输入口 #define key_state_0 0 #define key_state_1 1 #define key_state_2 2 #define key_state_3 3 unsigned char read_key(void) { static unsigned char key_state=0,key_time=0; unsigned char key_press,key_return=0; key_press=key_input;//读取按键I/O电平 switch(key_state) { case key_state_0://按键初始状态 if(!key_press) key_state=key_state_1;//按键被按下,状态装换 到按键确认状态 break; case key_state_1://按键确认状态 if(!key_press) { key_state=key_state_2;//按键仍按下,状态转换 到计时1 key_time=0;//清零按键时间计数器 } else key_state=key_state_0;//按键在抖动,转换到按 键初始状态 break;
“ Impossible is nothing ”
按键与键盘输入接口
张晓冬
通用I/O数字பைடு நூலகம்入接口设计
假如把一个单片机嵌入式系统比作一个人的话,那么单片 机就相当于人的大脑,而输入接口就好似人的感官系统, 用于获取外部世界的变化、状态等各种信息,并把这些信 息输送进入人的大脑。嵌入式系统的人机交互通道、前向 通道、数据交换和通信通道的各种功能都是由单片机的输 入接口及相应的外围接口电路实现的。 对于一个电子系统来讲,外部现实世界各种类型和形态的 变化与状态都需要一个变换器将其转换成电信号,而且这 个电信号有时还需要经过处理,使其成为能被MCU容易 识别和处理的数学逻辑信号,这是因为单片机常用的输入 接口都是数字接口(A/D接口和模拟比较器除外)。上述 所谓的“变换器”和“转换处理”,从专业角度讲就是 “传感器技术”和“信号调理电路”。
I/O数字输入信号分类
模拟信号和数字信号 传感器将某个外部参数(温度、速度)的变化转换为电信号(电压、电流)。 如果传感器输出电信号的幅度变化特征代表了外部参数的变化,例如电压的升 高表示温度的升高,那么这个传感器就是模拟传感器,它产生模拟信号。由于 MCU是数字化的,因此信号需要通过A/D转换才能被接受,A/D转换是嵌入式 系统最重要的外围接口电路之一,用途广泛。 电压信号和电流信号 单片机IO接口的逻辑电平是数字逻辑电平,即以电压的高和低作为逻辑“1”和 “0”,因此进入单片机的信号要求是电压信号。一些传感器输出的是电流信号, 那么进入单片机之前需要将电流信号放大,并转换成电压信号调理电路。 单次信号和连续信号 间隔时间较长单次产生的脉冲信号和较长时间保持电平不变的信号称为单次信 号。常见的单次信号一般是由按键、开关等认为动作或机械器件产生的信号。 而连续信号一般指连续的脉冲信号,如计数脉冲信号、数据通信传输信号等。 单次信号要注意信号的纯净和抗干扰,如消除按键的抖动和外部的干扰等。连 续信号往往在数据交换和通信信道中使用,其特点是对时间定位、捕捉、时序 的要求较高,通常要对信号的边沿进行检测或触发。AVR单片机提供了丰富的 接口,如外部中断,定时计时器USART等,可以方便的对连续脉冲信号进行 检测、计数以及支持多种协议的数据交换和通信。
设置PD0~PD3为输出方式,输出低电平; PD4~PD7为输入方式且上拉电阻有效为高电平。将四根 行线PD0~PD3置为低电平输出,然后读取PD4~PD7四根列线中有无低电平出现。如果有低电平出现, 则说明这一行线中有按键按下,并记录列线中PD4~PD7四个I/O口数据;如果读取都是高电平,则表 示无按键按下。 设置PD4~PD7为输出方式,输出低电平; PD0~PD3为输入方式且上拉电阻有效为高电平。将四根 列线PD4~PD7置为低电平输出,然后读取PD0~PD3四根行线中有无低电平出现。如果有低电平出现, 则说明这一行线中有按键按下,并记录列线中PD0~PD3四个I/O口数据。 考虑按键消抖的问题,将两次I/O口数据对应累加,形成一个完整的8位数据,根据行列线中低电平的 交叉点就是确定的按键点。
case key_state_2://按键释放状态 if(key_press) { key_state=key_state_0;//按键已释放,转换到按 键初始状态 key_return=1;//输出为“1” } elseif(++key_time>=100)//按键时间计数 { key_state=key_state_3;//按下时间>1S,状态转换 到计时2 key_time=0;//清零计时器 key_return=2;//输出“2” } break; case key_state_3: if(key_press) key_state=key_state_0;//按键已释放,转换到按 键初始状态 else { if(++key_time>=50)//按键时间计数 { key_time=0;//按键时间>0.5S,清零计数器 key_return=2;//输出“2” } } break; } return key_return;//返回按键状态返回值 }
基于状态机分析的按键设计1
(消抖)
有按键状态
无按键状态
(干扰)
(确认)
等释放状态
#define key_input PIND.7//按键输入口 #define key_state_0 0 #define key_state_1 1 #define key_state_2 2 unsigned char read_key(void) { static unsigned char key_state=0; unsigned char key_press,key_return=0; key_press=key_input;//读取按键I/O电平 switch(key_state) { case key_state_0://按键初始状态 if(!key_press) key_state=key_state_1;//按键被按下,状态装换到按键确认状态 break; case key_state_1://按键确认状态 if(!key_press) { key_return=1;//按键经过延时后仍按下,按键确认输出为“1” key_state=key_state_2;//状态转换到按键释放状态 } else key_state=key_state_0;//按键在抖动,转换到按键初始状态 break; case key_state_2://按键释放状态 if(key_press) key_state=key_state_0;//按键已释放,转换到按键初始状态 break; } return key_return;//返回按键状态返回值 }
键盘模块
开始
初始化端口、芯片、键值编码表、显示数据编码表
设置按键程序,根据键值选择相应的显示数码数据, 驱动数码管显示
矩阵按键的识别仅仅是确认和定位了行和列的交叉点的按 键,接下来还要考虑键盘的编码,即对各个按键进行编号。 编程中常用查表的方法对按键进行具体的编号。 完成键盘扫描和处理的程序是系统程序中一个子程序, MCU通常通过三种方式调用子程序: 程序控制扫描方式。在主程序中适当的位置放置键盘扫描 程序,对键盘进行频繁扫描处理。 定时扫描方式。使用MCU的一个定时器,使其产生10ms 的定时中断,每到中断时,MCU响应中断进行键盘扫描 处理。 中断方式。使用外部中断方式,键盘增加一个键作为产生 中断的信号输入线,当有按键按下时,MCU接收到一个 中断信号,进而响应中断进行键盘扫描处理。