单片机独立式按键、矩形按键的应用共18页
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有无按键 消抖 计算键值
按键服务
1 5 3.1P2.1P1.1P0.1P 0 8 4321
8.1. 独立按键
8.1.1.独立按键原理
单片机中除了P0接口,其它I/O接口内部都有上拉电 阻。上图所示P1.0-P1.2接了4个按键,当没有按下按键时 对应的I/O接口为高电平。当按下按键时,对应管脚会变 为低电平。因此只要检测到对应管脚是否为低电平就知 道此按键是否被按下。
L_LOOP: MOV MOV CJNE LJMP
P1,#0FH A,P1 A,#0FH,L_PRESS L_EXIT
;判断是否有按键
8.2.3.计算键值
开始 有按键?
消抖 有按键?
判断行 判断列 计算键值 按键服务程序
若有键被按下,判断是哪一个键闭合。 方法是对键盘的行线进行扫描。然后进 行列线扫描。
8 0 4 7 CCV 2 187654321 1 2.3P7.1P6.1P5.1P4.1P3.1P2.1P1.1P0.1P 5 0 8 CCV 87654321 1 5 0 8 7.1P6.1P5.1P4.1P3.1P2.1P1.1P0.1P
扫描按键式独立按键
中断式独立按键
扫描式独立按键,这种接法只是将每个按键连接在了I/O口上,在编 写程序时只需要不断的扫描I/O口电平的变化就可以了,如果I/O口有电 平变化,说明有按键按下,则此时只需要按按键判别的顺序进行判断, 这种方法的缺点是,CPU要不断的扫描I/O的电平,占用CPU的时间,较 为好的方法是上图所示的中断方案,在这种连接中,当有按键按下时, 7408就会在P3.2口产生一个低电平,触发中断,所以此时,单片机不需 要不断的扫描I/O口上是否有电平的变化,只需要在产生中断后进行按键 处理就可以了,这种方案的缺点是要多占用一个单片机的中断,且要在 硬件连接上较为复杂。
键盘的分类
键盘分编码键盘和非编码键盘。键盘上闭合键的 识别由专用硬件编码器实现,并产生键编码号或 键值的称为编码键盘,如BCD码键盘、ASCLL码 键盘等;而靠软件来识别的称为非编码键盘;在 单片机组成的测控系统及智能化仪器中,用的最 多的是非编码键盘。
非编码键盘有分为:独立式非编码键盘和行列式 非编码键盘(矩阵键盘)。无论是何种按键,其 功能实现都是分为三个步骤:
8.2.2. 矩阵按键检测
硬件电路如上图单片机的P1口用作键盘I/O口,键盘的 行线接到P1口的低4位,键盘的列线接到P1口的高4位。4 根行线和4根列线形成16个相交点。每个交点为一个按键, 每个按键赋一个键值,从左到右从上到下依次为0-15。
检测当前是否有键被按下。检测的方法是P1.4-P1.7输出 全“0”,P1.0-P1.3设置为1读取P1.0-P1.3的状态,若 P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。或者 将列设为输入,行设为输出。
E1
E2
S4 S5 S6 S7
E3
S8 S9 S10 S11
E4
S12 S13 S14 S15
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通 过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区 别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口 线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用 矩阵法来做键盘是合理的。矩阵式结构的键盘显然比独立键盘要复杂 一些。
在列输出行输入时(即列P1.4-P1.7全 为0,行P1.0-P1.3全为1)读取P1.0P1.3,若全为“1”,则表示没有键闭合, 否则有键闭合。由此得到闭合键的行值, 然后行输出列输入时(即列P1.4-P1.7全 为1,行P1.0-P1.3全为0)读取P1.4P1.7,由此得到闭合键的列值。
最后可采用计算法或查表法将闭合键 的行值和列值转换成所定义的键值。按 照上面所赋的键值标示,键值= 行*4+列。 如果键值标示有所改变那么此公式就要 相应的发生改变。
;KEY0服务程序 ;KEY1服务程序
A,#11111110B KEY7
;KEY7服务程序
MAIN
8.2 矩阵按键
8.2.1.矩阵按键的原理
P1.0 P1.1
C1 C2
P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
C3 C4 E1 E2 E3 E4
C1
C2
C3
C4
S0 S1 S2 S3
计算行:
行全部输出高电平,列全部输出低电平,读回数据,如果P1.0P1.3某行变为低电平就知道该行上面有按键。代码如左下:
计算列:
行全部输出低电平,列全部输出高电平,然后读回来判断。如果 P1.4-P1.7某列变为低电平就知道该列上面有按键。代码如右下:
MOV MOV MOV L_RawLoop: INC RRC JC
8.1.2.按键消抖
按键按下
键稳定
前沿抖动
ຫໍສະໝຸດ Baidu
后沿抖动
当某个按键被按下,由于其触点的机械特性,会抖动约 20mS,才会稳定下来,如图所示的波形。如果在此期间 去检测,很可能产生误判,所以检测到有键被按下并延时 20ms避开抖动期,然后才去检测是哪个被按下。另外手松 开也有抖动,所以很有可能在刚才判断时,有按键,等延时 20ms之后,就没有按键了。为了提高效率,应在延时20ms 后再次判断一下,是否有键被按下。
0000H MAIN 0030H
P1,#0FFH A,P1 A,#0FFH,L_PRESS MAIN
DELAY20MS ;消抖 P1,#0FFH A,P1 A,#0FFH,L_TUREPRESS MAIN
A,#11111110B KEY0 L_EXIT A,#11111101B KEY1 L_EXIT
8.1.3.独立按键流程图与软件实现
开始
否 有按键?
是 消抖
否 有按键?
是 否
按键1? 是
处理按键1
按键n? 否
是 按键n服务程序
ORG LJMP ORG MAIN: MOV MOV CJNE LJMP L_PRESS: LCALL MOV MOV CJNE LJMP L_TUREPRESS: CJNE LCALL LJMP CJNE LCALL LJMP ……….. CJNE LCALL L_EXIT: LJMP