行列式键盘接口
键盘接口设计
键盘接口设计键盘接口设计摘要:本文主要介绍了键盘的工作原理和六种键盘接口电路的结构及其按键的识别方法,可以满足各种应用场合对于键盘的要求。
关键词:独立式行列式阶梯式ADC Pin I/O Pin和ADC Pin 二极管一、引言键盘是基本的输入设备,在单片机应用系统中能实现向单片机输入数据、传送命令等功能,是人工干预单片机的主要手段。
下面介绍键盘的工作原理,键盘接口类型及其按键识别方法。
二、键盘的工作原理1、键盘输入的特点键盘实质上是一组按键开关的集合。
通常,键盘开关利用了机械触点的合、断作用。
一个电压信号通过键盘开关机械触点的断开、闭合,其行线电压输出波形如图1所示。
图1 键盘开关及其波形图1中T1和T3分别是按键的闭合和断开过程中的抖动期(呈现一串负脉冲),抖动时间长短和开关的机械特性有关,一般为5~10ms,T2为稳定的闭合期,其时间由按键动作所确定,一般为十分之几秒到几秒,T0、T4为断开期。
2、按键的确认按键的闭合与否,反映在行线输出电压上就是呈现高电平或低电平,如果高电平表示按键断开,低电平表示按键闭合,通过对行线电平高低状态的检测,便可确认按键按下与否。
为了确保MCU对一次按键动作只确认一次按键有效,必须消除抖动期T1和T3的影响。
3、软件消除按键抖动通常采用软件来消除按键抖动,基本思想是:在第一次检测到有键按下时,假设该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线电平是否仍为低电平,如果仍为低电平,则确认该行确实有按键按下。
当按键松开时,行线的低电平变为高电平,执行一段延时10ms的子程序后,检测该行线为高电平,说明按键确实已经松开。
三、键盘接口类型及原理1、独立式键盘接口独立式键盘就是各键相互独立,每个按键各接一个Input Pin,通过检测Input Pin的电平状态可以很容易的判断哪个按键被按下。
在按键数目较多时,独立式键盘电路需要较多的Input Pin,且电路结构繁杂,故此种键盘适用于按键较少或操作速度较高的场合。
行列式键盘
错误键值?
N 显示键值 延时
//检测按键 //返回-1表示没有检测到按键按下
char getkey(void){ char k1=0,k2=0,i=0; P3=0xf0; delay(10); if(P3!=0x0f){ //行线有键按下 k1=P3; //保存行线状态 delay(10);//消抖处理 if(P3==k1){ P3=0x0f; //扫描列线 delay(10);
void delay(unsigned int time) { unsigned int j=0; for(;time>0;time--) for(j=0;j<125;j++); } //经典延时程序 void main(void){ char key=0; P2=0x00; //关闭LED数码管 while(1){ key=getkey(); if(key!=-1){ P2=led_mod[key]; //赋初值 } delay(10); } }
键盘扫描原理(以P3口为例):
①判断判断哪一行有键压 下 写端口(0xf0):行线电 平=0;列线电平=1。 读端口进行判断:若P3 = 0xf0→没有按键压下; 若 P3≠0xf0→某行有键压端口(0x0f):行线电平=1;列线电平=0。 读端口进行判断:若P3 = 0x0f→没有按键压下; 若P3≠ 0x0f→某列有键压下→K2 ③ 将K1与K2相“与” 并存于K2(形成键值)——闭合键所在行、列 的状态均为1,其余皆为0。 第一行的键值: 00010001、00100001、01000001、10000001 整个键盘的键值: 0x11、0x21、0x41、0x81 0x12、0x22、0x42、0x82 0x14、0x24、0x44、0x84 0x18、0x28、0x48、0x88 ④ 利用查表比对法求出闭合按键的键模。 将各键的键值依次存放在一个数组中,其顺序号就是键模。 利用循环变量i控制比对过程,两者相等时的i就是闭合键的键模。
第5讲 IO口的应用二—行列式键盘
成于大气 信达天下
行列式按键硬件电路
Chengdu University of Information Technology
成于大气 信达天下
行列式按键硬件电路解析
Chengdu University of Information Technology
测试按键按下以前, 测试按键按下以前,先将行置为高电 平,列置为低电平。如果某个按键被按下, 列置为低电平。如果某个按键被按下, 原来输出高电平的,被外部拉低,这样就判 原来输出高电平的,被外部拉低, 断出到底哪行有键按下; 断出到底哪行有键按下;然后将行列电平反 转,就可以判断出是哪列有键按下了。有了 就可以判断出是哪列有键按下了。 行和列的值, 行和列的值,就可以确定出是哪个键被按下 了。
成于大气 信达天下
行列式按键扫描程序
Chengdu University of Information Technology
行列式按键扫描程序结构: 行列式按键扫描程序结构:
判断是否有键按下; 判断是否有键按下; 判断是哪个键按下; 判断是哪个键按下; 根据按下的键,执行相应的程序代码。 根据按下的键,执行相应的程序代码。
成于大气 信达天下
行列式按键键号对应的键值
Chengdu University of Information Technology
行列式按键中每个键号对应一个唯一 的键值, 的键值,通过对键值的查询就可以判断出是 哪个按键被按下了,这种查询在C语言中可 哪个按键被按下了,这种查询在 语言中可 以用switch{case …}语句来描述。 语句来描述。 以用 语句来描述
应当注意:在判断键按下及执行程序过程中,还需要 判断键是否弹起,如果不做该判断,那有可能使程序一直 检测到有按键按下,从而导致程序出错。
9 接口技术II键盘接口
P.168
b. 线反转法
采用线反转法的键盘行线、 列线端口各自应当可以在输 入与输出方式间切换! 如图:高四位与低四位均可 独立改变其输入或输出方式
实验板4×4键盘 实验板 × 键盘 连接82C55的端口线 连接 的端口线 PC3 PC2 PC1 PC0 PC4 PC5 PC6 PC7
图10-10线反转法原理图 10-10线反转法原理图 第1步:列线输出为全‘0’ ,随后输入行线电平如有‘0’,则 线输出为全‘ 随后输入行线电平如有‘ , 所在的行就是闭合的按键所在行; 则无键闭合。 ‘0’所在的行就是闭合的按键所在行;无‘0’则无键闭合。 所在的行就是闭合的按键所在行 则无键闭合 随后输入列线电平如有‘ , 第2步:行线输出为全‘0’ ,随后输入列线电平如有‘0’,则 线输出为全‘ 则无键闭合。 所在的列就是闭合的按键所在列; 则无键闭合 ‘0’所在的列就是闭合的按键所在列;无‘0’则无键闭合。 所在的列就是闭合的按键所在列 结合上述两步,可确定按键所在行和列。 结合上述两步,可确定按键所在行和列。
键盘扫描子程序---3 TEST2011.ASM 键盘扫描子程序--3 KN:MOV MOV MUL MOV JMP A,61H B,#05H AB DPTR,#K0 DPTR,#K0 @A+DPTR ;根据查表获得的键号00H~0FH之一转向相应处理程序 根据查表获得的键号00H~0FH之一转向相应处理程序 00H ;转移表中每个键号处理程序占 转移表中每个键号处理程序占5 ;转移表中每个键号处理程序占5个地址单元
键盘扫描子程序---1 TEST2011.ASM 键盘扫描子程序--1 KEY:MOV 键盘扫描子程序(反转法) KEY:MOV A,#81H ;键盘扫描子程序(反转法) MOV DPTR,#0FEFFH ;C口先初始化为高 位输出驱行线、 口先初始化为高4 MOVX @DPTR,A ;C口先初始化为高4位输出驱行线、低4位输入列线 MOV DPTR,#0FEFEH 键盘行线 行线( 输出驱动全 驱动全'0' MOV A,#00H ;键盘行线(高4位)输出驱动全'0' MOVX @DPTR,A A,@DPTR 输入键盘列线电平 列线电平( 60H单元 MOVX A,@DPTR ;输入键盘列线电平(低4位)存60H单元 MOV 60H,A ;C口改初始化为高 位输入行线、 口改初始化为高4 MOV A,#88H ;C口改初始化为高4位输入行线、低4位输出驱列线 MOV DPTR,#0FEFFH MOVX @DPTR,A MOV DPTR,#0FEFEH 键盘列线 列线( 输出驱动全 驱动全'0' MOV A,#00H ;键盘列线(低4位)输出驱动全'0' MOVX @DPTR,A 行线电平( 输入键盘行线电平 MOVX A,@DPTR ;输入键盘行线电平(高4位)在A中 ANL 60H,#0FH ;列线电平值保留所在的低4位 列线电平值保留所在的低4 行线电平值保留所在的高4 ANL A,#0F0H ;行线电平值保留所在的高4位 ;两次输入的列线电平值 行线电平值组合成 两次输入的列线电平值、 合成8 ORL 60H,A ;两次输入的列线电平值、行线电平值组合成8位行列码
矩阵键盘的接口与控制
完整程序实例
#include <reg51.h> #define uchar unsigned char
void keyscan(void); void dlms(void); uchar keyvalue=0xff; void main(void) { while(1) { keyscan(); P2=~keyvalue; } } void dlms(void) { uchar i; for(i=200;i>0;i--); }
STEP5:将得到的行号和列号进行译码,得到键值
P3.0 ) if(recode==0xfb { switch(sccode) { P3.1 case 0xfe: keyvalue=16;break; case 0xfd:keyvalue=17;break; case 0xfb:keyvalue=18;break; P3.2 case 0xf7:keyvalue=19;break; case 0xef:keyvalue=20;break; case 0xdf:keyvalue=21;break; case 0xbf:keyvalue=22;break; case 0x7f:keyvalue=23;break; P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 default:break; } }
STEP1: 检测是否有键按下 void keyscan( ) 向单片机的行扫描口输出全0,检测列输出口的状态是否全为“ 1” { unsigned char temp_key; P1=0xff; P3=0xf8; temp_key=P1; if(temp_key!=0xff) { … P3.0 } } “0”
STEP6: 松手检测
矩阵式键盘的接口设计与编程
;<--------------------------判断是否真的有键按下--------------------->
T_KEY:
ACALL
DL_20MS
;调用延时子程序
ACALL
P_KEY
;再次调用“有无按键按下子程序”
JNZ
IN_SCAN
;若有键按下,则执行逐行扫描程序
AJMP
SCAN
;若无键按下,则不断查询
;<--------------------------扫描数据初始化----------------------->
单片机原理及应用技术
—1—
one 矩阵式键盘接口设计——基于行反转法
4×4矩阵式键盘接 口设计如图所示
—2—
图中P1口的低4位作为行线,P2口的低4位作为列线。行线通过74LS21进行逻辑与操作后作为单 片机的外部中断源输入,当有键按下时以中断形式去执行相应的按键处理程序。
行反转法因判键时将输入与输出线反转互换而得名,步骤如下:
PB口作为扫描口需要设为输出,PA口设为读入。 逐行扫描时,PB口的状态为:
PB7 PB6 PB5 PB4 111 1 111 1 111 1 111 1 111 0 110 1 101 1 011 1
PB3 PB2 PB1 PB0 1 110 1 101 1 011 0 111 1 111 1 111 1 111 1 111
—3—
【例9-3】 行反转法判断按键编号,并存入40H单元,程序如下
ORG
0000H
LJMP
MAIN
ORG
0003H
LJMP
INT0
ORGБайду номын сангаас
单片机与键盘接口
第二讲 单片机与键盘接口1.键盘结构● 键盘结构:独立式键盘;行列式键盘。
● 按键识别法:扫描工作方式。
由程序调用键盘扫描子程序,读取按键值。
缺点是可能会丢失按键值。
中断式工作方式。
当按键有闭合时即产生中断请求,CPU 响应中断,读取按键值。
● 消抖动措施:双稳态消抖动电路;滤波消抖动电路;软件消抖动。
按键触点的机械抖动双稳态去抖电路VCC (+5 V)2. 独立式键盘接口设计独立式键盘是直接用I/O口线构成单个按键电路,每个按键占用1根I/O口线。
按键多时不宜采用。
上拉电阻保证按键断开后,I/O口线有确定的高电平。
当I/O口内部有上拉电阻时,外电路可以不接上拉电阻。
例题1:;S1键按下,P1.0连接的LED灯亮,再次按下,LED灯灭。
6MHz晶振,无按键释放判别。
(S1按键接P2.2口)ORG 0000HSETB P2.2NOPBEGIN: JB P2.2,BEGINACALL DL10MSJB P2.2,BEGINCPL P1.0AJMP BEGIN;----------------------------------DL10MS: MOV R6,#10 ;10mSDL1: MOV R7,#7DHDL0: NOPNOPDJNZ R7,DL0DJNZ R6,DL1RET;-----------------------------------END实验证明:该按键可靠性不高,工作不稳定。
例题2:;S1键按下,P1.0连接的LED灯亮,再次按下,LED灯灭。
6MHz晶振,有按键释放判别。
(S1按键接P2.2口)ORG 0000HSETB P2.2NOPBEGIN: JB P2.2,BEGINACALL DL10MSJB P2.2,BEGINL1: JNB P2.2,L1ACALL DL10MSJNB P2.2,L1CPL P1.0AJMP BEGIN;----------------------------------DL10MS: MOV R6,#10 ;10mSDL1: MOV R7,#7DHDL0: NOPNOPDJNZ R7,DL0DJNZ R6,DL1RET;-----------------------------------END实验证明:加入按键释放程序后该按键可靠性显著提高,工作稳定可靠。
实验3行列式键盘
一.实验目的
1、了解行列式键盘的工作原理
2、掌握行列式键盘的程序设计方法
二.实验器材
单片机开发板、电脑
三.实验任务
编写行列式键盘的驱动程序,在液晶显示屏上边显示所按键的编号
四.实验原理
1、行列式键盘的硬件电路
4×4的行列式键盘由行线和列线组成。行线对应的接口为P10~P13,列线对应的接口为P14~P17。利用单片机编程扫描是否有按键按下的时候,将行线P10~P13设为高电平1(即输出数字1)。列线P14~P17设为0,再读回行线P10~P13的数值,就可以知道是否有按键按下。如果有键按下,则行线输入的信号就不全为1,例如,K5按下,则行线输入的信号就会变成1101。在行列式的键盘中,通常分三个步骤处来检测、识别和处理键盘的事件。
K13键
11010111
0xd7
K14键
10110111
0xb7
K15键
01110111
0x77
2.键盘识别流程
五.实验步骤
1.建立工程文档key.uv2
2.新建key.c文件,并加入工程项目中。
3.在key.c中加入下列程序代码。如下页所示。
#include "reg52.h"
#defineuintunsignedint
#defineucharunsigned char
/*LCD端口定义*/
//LCD端口要根据实际的连接情况分配IO
#define busy 0x80
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
sfr LCDData=0x80;//0x80--P0,0X90--P1,0xa0--P2,0xb0--P3
矩阵键盘
FPGA学习心得——矩阵键盘1、行列式键盘概述为了减少键盘与单片机接口时所占用I/O口线的数目,在键数较多时,通常都将键盘排列成行列矩阵式,行列式键盘又叫矩阵式键盘。
用带有I/O口的线组成行列结构,按键设置在行列的交点上。
例如用2*2的行列结构可以构成4个键的键盘,4*4的行列结构可以构成有16个键的键盘。
这样,当按键数量平方增长时,I/O口线只是线性增长,这样就可以节省I/O口线。
2、行列式键盘原理教研室已有薄膜矩阵键盘,其实物图如图所示。
其电路原理图如下图所示。
由行列式键盘的原理可以知道,要正确地完成按键输入工作必须有按键扫描电路产生keydrv3~keydrv0信号。
同时还必须有按键译码电路从keydrv3~keydrv0信号和keyin3~keyin0信号中译码出按键的键值。
此外,一般还需要一个按键发生标志信号用于和其他模块接口,通知其它模块键盘上有按键动作发生,并可以从键盘模块中读取按键键值。
由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。
因此得到键盘接口电路的结构如图2所示。
图2 键盘接口电路结构图行列式键盘电路的FPGA实现主要解决三个问题,一是如何检测是否有按键按下并防止采集到干扰信号;二是在按键闭合时如何防止抖动;三是如何判断为哪一个按键位动作,并对其进行译码。
因此,为了解决这些问题,程序中使用不同的进程分别实现键盘扫描信号的产生、键盘去抖以及键盘的译码。
3、源程序[plain]view plaincopy1.----------------------------------------------------------------------------------2.-- Company:3.-- Engineer:4.--5.-- Create Date: 08:46:57 07/31/20126.-- Design Name:7.-- Module Name: MatrixKeyboard - Behavioral8.-- Project Name:9.-- Target Devices:10.-- Tool versions:11.-- Description:12.--13.-- Dependencies:14.--15.-- Revision:16.-- Revision 0.01 - File Created17.-- Additional Comments:18.--19.----------------------------------------------------------------------------------20.library IEEE;e IEEE.STD_LOGIC_1164.ALL;e IEEE.STD_LOGIC_ARITH.ALL;e IEEE.STD_LOGIC_UNSIGNED.ALL;24.25.---- Uncomment the following library declaration if instantiating26.---- any Xilinx primitives in this code.27.--library UNISIM;28.--use UNISIM.VComponents.all;29.30.entity MatrixKeyboard is31. Port ( Clk : in STD_LOGIC;32. Reset : in STD_LOGIC;33. KeyIn : in STD_LOGIC_VECTOR (3 downto 0);34. KeyScan : out STD_LOGIC_VECTOR (3 downto 0);35. LED : out STD_LOGIC_VECTOR (3 downto 0)36. );37.end MatrixKeyboard;38.39.architecture Behavioral of MatrixKeyboard is40.41.Signal Clk_scan : STD_LOGIC := '0';42.Signal Clk_5ms : STD_LOGIC := '0';43.Signal Clk_2ms : STD_LOGIC := '0';44.Signal Key_Scan : STD_LOGIC_VECTOR(3 downto 0);45.Signal Key_Decode : STD_LOGIC_VECTOR(7 downto 0);46.47.Type State_Key is(st_key1,st_key2,st_key3,st_key4);48.Signal Current_Key : State_Key := st_key1;49.50.Type State_Scan is(st_scan1,st_scan2,st_scan3,st_scan4);51.Signal Current_Scan : State_Scan := st_scan1;52.53.begin54.55. Proc_Clk_5ms : process(Clk)56. variable cnt_clk : integer range 0 to 250000 := 0;57. begin58. if(rising_edge(Clk)) then59. if(cnt_clk < 125000) then60. cnt_clk := cnt_clk + 1;61. Clk_scan <= '0';62. elsif(cnt_clk < 249999) then63. cnt_clk := cnt_clk + 1;64. Clk_scan <= '1';65. else66. cnt_clk := 0;67. end if;68. Clk_5ms <= Clk_scan;69. end if;70. end process Proc_Clk_5ms;71.72. Proc_Clk_2ms : process(Clk)73. variable cnt_clk : integer range 0 to 100000 := 0;74. begin75. if(rising_edge(Clk)) then76. if(cnt_clk < 50000) then77. cnt_clk := cnt_clk + 1;78. Clk_2ms <= '0';79. elsif(cnt_clk < 99999) then80. cnt_clk := cnt_clk + 1;81. Clk_2ms <= '1';82. else83. cnt_clk := 0;84. end if;85. end if;86. end process Proc_Clk_2ms;87.88.89. Proc_Scan:process(Clk_5ms)90. begin91. if(rising_edge(Clk_5ms)) then92. case Current_Scan is93. when st_scan1 =>94. Key_Scan <= "1110";95. Current_Scan <= st_scan2;96. when st_scan2 =>97. Key_Scan <= "1101";98. Current_Scan <= st_scan3;99. when st_scan3 =>100. Key_Scan <= "1011";101. Current_Scan <= st_scan4;102. when st_scan4 =>103. Key_Scan <= "0111";104. Current_Scan <= st_scan1;105. end case;106. end if;107.108. end process Proc_Scan;109.110. KeyScan <= Key_Scan;111. Key_Decode <= Key_Scan & Keyin;112.113. Proc_Keyboard:process(Clk_2ms,Reset)114. variable cnt_btn : integer range 0 to 50000 := 0;115. begin116. if(Reset = '1') then117. LED <= x"1";118. Current_Key <= st_key1;119. elsif(falling_edge(Clk_2ms)) then120. case Current_Key is121. when st_key1 => --Check whether any keys are p ressed122. if((Keyin and "1111") = "1111") then123. Current_Key <= st_key1;124. else125. Current_Key <= st_key2;126. end if;127. when st_key2 => --keys debouncing128. if((Keyin and "1111") = "1111") then129. Current_Key <= st_key1;130. else131. case Key_Decode is132. when "11101110" => LED <= "0001";133. when "11101101" => LED <= "0010";134. when "11101011" => LED <= "0011";135. when "11100111" => LED <= "1010";136. when "11011110" => LED <= "0100";137. when "11011101" => LED <= "0101";138. when "11011011" => LED <= "0110";139. when "11010111" => LED <= "1011";140. when "10111110" => LED <= "0111";141. when "10111101" => LED <= "1000";142. when "10111011" => LED <= "1001";143. when "10110111" => LED <= "1100";144. when "01111110" => LED <= "1110";145. when "01111101" => LED <= "0000";146. when "01111011" => LED <= "1111";147. when "01110111" => LED <= "1101";when others => null;148. end case;149. end if;150. Current_Key <= st_key3;151. when st_key3 => --Check whether the pressed keys a re released152. if((Keyin and "1111") /= "1111") then153. Current_Key <= st_key3;154. else155. Current_Key <= st_key4;156. end if;157. when st_key4 => --keys debouncing158. if((Keyin and "1111") /= "1111") then159. Current_Key <= st_key3;160. else161. LED <= x"0";162. Current_Key <= st_key1;163. end if;164. end case;165. end if;166. end process Proc_Keyboard;167.168.end Behavioral;169.薄膜键盘矩阵键盘4x4 ,单片机开发配件,机械手按键。
单片机实验报告实验5行列式键盘实验
学号姓名专业电气工程及其自动化班级实验5 行列式键盘实验一、实验目的(1)、学习掌握行列式键盘接口方法(2)、学习掌握行列式键盘编程方法。
二、实验内容用单片机P1口接4*4键盘,P0口接共阳数码管,编程实现键字的显示。
P1.0-P1.3为行,P1.4-P1.7为列。
先给端口设处置FEH,相当于给第一行置0,然后分写列值,如果对应的列值为0,说明该行与该列交叉处的键是按下的,接下来扫描第二行,与第一行的操作相同。
这就是行列式键盘扫描原理。
当扫描到某行的键按下时,就退出扫描,然后取键值,再将键值对应的额编码送P0端口显示。
三、实验设备计算机(已安装Keil和Proteus软件)元器件:A T89C51, CAP, CAP-ELEC, CRYSTAL, RES, 7SEG-COM-AN-GRN, RESPACK-7, BUTTON四、实验硬件电路实验源程序:#include<reg51.h>charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x7 1};charkey_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x 77};char getkey(void){char key_scan[]={0xef,0xdf,0xbf,0x7f};char i=0,j=0;for(i=0;i<4;i++){P1=key_scan[i];if((P1&0x0f)!=0x0f){for(j=0;j<16;j++){if(key_buf[j]==P1)return j;}}}return -1;}void main(void){char key=0;P0=0x00;while(1){key=getkey();if(key!=1)P0=~led_mod[key]; }}五、实验要求(1)、根据实验内容设计相应的调试程序,并通过仿真,运行正确。
矩阵式键盘接口技术及程序设计
矩阵式键盘接口技术及程序设计在单片机系统中键盘中按钮数量较多时,为了减少I/O口的占用,常常将按钮排列成矩阵形式,如图1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按钮加以连接。
这样,一个端口(如P1口)就能组成4*4=16个按钮,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就能组成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
《单片机矩阵式键盘接口技术及编程接口图》矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按钮没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
具体的识别及编程办法如下所述。
矩阵式键盘的按钮识别办法确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按钮识别办法,如上图所示键盘,介绍过程如下。
判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按钮之中。
若所有列线均为高电平,则键盘中无键按下。
判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其办法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按钮就是闭合的按钮。
下面给出一个具体的例程:图仍如上所示。
8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。
单片机与键盘或按键接口设计与实现方法
单片机与键盘或按键接口设计与实现方法单片机与键盘或按键接口设计是嵌入式系统开发中常见的任务,它可以实现通过键盘或按键输入控制单片机的功能。
本文将介绍单片机与键盘或按键接口设计的基本原理和实现方法。
一、基本原理单片机与键盘或按键接口设计的基本原理是通过将键盘或按键连接到单片机的IO口,利用IO口的输入功能来获取输入信号,并进行相应的处理。
在接口设计中,常见的有行列式键盘接口和矩阵式键盘接口两种方式。
1. 行列式键盘接口行列式键盘接口是一种常见的键盘接口设计方式。
它将键盘的行线和列线通过矩阵的方式连接到单片机的IO口。
当按下某个键时,单片机通过扫描每一行或每一列的电平变化,来检测按键的触发信号。
通过扫描方式,可以确定按下的键是哪一个。
行列式键盘接口的设计步骤如下:(1)将键盘的行线和列线分别连接到单片机的IO口。
(2)将行线接入IO口的输出引脚,并设置为高电平输出状态。
(3)将列线接入IO口的输入引脚,并设置为上拉输入状态。
(4)单片机通过改变行线的输出状态,逐行扫描键盘。
具体方法是将某一行的输出引脚设置为低电平,然后扫描各列的输入引脚,检测是否有低电平表示某个键被按下。
2. 矩阵式键盘接口矩阵式键盘接口是另一种常见的键盘接口设计方式。
它将键盘的每一个按键连接到单片机的IO口,通过设置IO口的输入输出模式和状态来检测按键的触发信号。
矩阵式键盘接口的设计步骤如下:(1)将键盘的每一个按键分别连接到单片机的IO口。
(2)将IO口的输入输出模式设置为相应的模式,如输入模式或输出模式。
(3)设置IO口的状态,如上拉输入状态或输出高电平状态。
(4)根据需要,单片机不断扫描每一个IO口,检测按键的触发信号。
二、实现方法实现单片机与键盘或按键接口可以使用各种软件开发工具,如Keil、IAR等,配合相应的编程语言,如C语言或汇编语言。
下面分别介绍两种接口设计的实现方法。
1. 行列式键盘接口实现方法在行列式键盘接口设计中,需要设置IO口的输入输出状态和扫描方法。
实验四 键盘接口设计
实验四:矩阵式键盘接口设计一、实验目的1.掌握独立式按键和矩阵式键盘结构和工作原理。
2.掌握矩阵式键盘的按键识别和扫描方法。
3.掌握独立式按键和矩阵式键盘的接口电路及其编程应用。
二、实验说明键盘的接口形式有两种:独立式按键接口和矩阵式键盘接口。
独立式按键是直接用I/O口构成的单个按键电路,其特点是每个按键单独占用一根I/O 口,每个按键的工作不会影响其它I/O口的状态。
独立式按键电路配置灵活,程序设计简单,但这种键盘占用硬件资源多,每个按键必须占用一根I/O口,因此,在按键较多时,I/O 口浪费较大,不宜采用。
矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。
一个4×4的行、列结构可以构成一个含有16个按键的键盘,显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V 上。
当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。
这是识别按键是否按下的关键。
然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。
识别按键的方法很多,其中,最常见的方法是扫描法。
按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平。
显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平。
只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。
CPU根据行电平的变化,便能判定相应的行有键按下。
在单片机应用系统中,键盘是人机对话不可缺少的组件之一。
在按键比较少时,我们可以一个单片机I/O口接一个按键,但当按键需要很多,I/O资源又比较紧张时,使用矩阵式键盘无疑是最好的选择。
常用键盘接口
常用键盘接口
常用按键接口可分为独立式按键接口、行列式按键接口和专用芯片式等。
具体采用哪种方式,可根据所设计系统的实际情况而定。
下面分别介绍这几种接口方式的优缺点及适用场合。
1.独立式按键接口
独立式按键接口设计优点是电路配置灵活,软件实现简单。
但缺点也很明显,每个按键需要占用一根口线,若按键数量较多,资源浪费将比较严重,电路结构也变得复杂。
因此本方法主要用于按键较少或对操作速度要求较高的场合。
软件实现时,可以采用中断方式,也可以采用查询方式,示意图如图所示。
图独立式键盘接口
2.行列式按键接口
行列式按键接口示意图如图(a)所示,其使用原理将在下节详细讲述。
行列式按键接口适应于按键数量较多,又不想使用专用键盘芯片的场合。
这种方式的按键接口由行线和列线组成,按键位于行、列的交叉点上。
这种方式的优点就是相对于独立接口方式可以节省很多I/O 资源,相对于专用芯片键盘可以节省成本,且更为灵活。
缺点就是需要用软件处理消抖、重键等。
行列式按键接口是一种老式的键盘接口,其键扫描方法是几乎所有PC 键盘所采用的方法。
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
第2章 键盘接口技术
第2章 键盘接口技术
1. 按键 2. 简单键盘接口 3. 矩阵式键盘接口 4. 可编程键盘接口
键盘接口技术
键盘由一组规则排列的按键组成,一个按键 实际上是一个开关元件,也就是说键盘是一组规则排 列的开关。单片机使用的按键是一种常开型的开关, 平时按键的两个触点处于断开状态,按下键时它们才 闭合。
中断扫描方式
当无键按下时,CPU处理自己的工作,当有键按 下时,产生中断请求,CPU转去执行键盘扫描子程序, 并识别键号。中断扫描方式可以提高CPU工作效率 。
图中的4输入与门用于产生按键中断,其输入 图中的 输入与门用于产生按键中断, 输入与门用于产生按键中断 端与各列线相连,再通过上拉电阻接至+5V电源, 电源, 端与各列线相连,再通过上拉电阻接至 电源 输出端接至8051的外部中断输入端。具体工作如 的外部中断输入端。 输出端接至 的外部中断输入端 当键盘无键按下时,与门各输入端均为高电平, 下:当键盘无键按下时,与门各输入端均为高电平, 保持输出端为高电平;当有键按下时,端为低电平, 保持输出端为高电平;当有键按下时,端为低电平, 申请中断, 开放外部中断, 向CPU申请中断,若CPU开放外部中断,则会响应 申请中断 开放外部中断 中断请求,转去执行键盘扫描子程序。 中断请求,转去执行键盘扫描子程序。
UpDown StartEnd LAMPCODE
;上下行标志 ;启动及停止标志 ;存放流动的数据代码
键盘接口技术
程序分析与思考
这里介绍的键盘处理程序比较简单,实 际上,键盘的处理是很复杂的,但这种复杂 并不来自于单片机的本身,而是来自于操作 者的习惯等问题,因此,在编写键盘处理程 序之前,最好先把它从逻辑上理清,然后用 适当的算法表示出来,最后再去写代码,这 样,才能快速有效地写好代码。
第10章行列式(矩阵式)键盘接口
DB
8FH,0BFH,8CH,0FFH,0FFH
;0,1,2,3,4 ;5,6,7,8,9 ;A,B,C,D,E ;F,-,P,暗
键盘扫描子程序: KEYI:MOV MOV A,#00H SBUF,A ;判有无键按下,使所有列线为0 ;的编码送A ;扫描键盘的(8)号74LS164输 ;出为00H,使所有列线为0 ;串行输出完否? ;串行输出完毕,清TI ;第1行有闭合键吗?如有,跳 ;PK1进行处理 ;在第2行键中有闭合键吗?无闭 ;合键跳KL1 ;调用延时10ms子程序DL10,软 ;件消除抖动
(1)行列式键盘工作原理 无键按下,该行线为高电平,当有键按下时, 行线电平有列线的电平来决定。 由于行、列线为多键共用,各按键彼此将相互发 生影响,必须将行、列线信号配合起来并作适当的处 理,才能确定闭合键的位置。
(2)按键的识别方法
a. 扫描法 图10-10(b)中3号键被按下为例,来说明此键 时如何被识别出来的。
ACALL KS1 JNZ POP RET LK3 A
NEXT:INC
R4
;列计数器加1,为下一列扫描作准备
MOV JNB
RL MOV AJMP KND: AJMP KS1: MOV “0”→ MOV MOVX
A,R2 ;判是否已扫到最后一列(最右一列) Acc.7,KND ;键扫描已扫到最后一列,跳KND,
; 右边的下一位LED亮位选码
MOV R3,A AJMP LD0 ;送R3中保存 ;
LD1: RET ; DSEG: DB 3FH,06H,5BH,4FH,66H,6DH ;共阴极段码表 DB DB 7DH,07H,7FH,6FH,77H,7CH 39H,5EH,79H,71H,73H,3EH
基于RS232行列式矩阵键盘接口的设计方案
基于RS232行列式矩阵键盘接口的设计方案
一、引言
本方案是用VHDL语言来实现的基于RS232按位串行通信总线的行列式矩阵键盘接口电路,具有复位和串行数据的接收与发送功能,根据发光二极管led0-led2的显示状态可判断芯片的工作情况;实现所有电路功能的程序均是在美国ALTERA公司生产的具有现场可编程功能的芯片
EPM7128SLC84-15上调试通过的。
能通过动态扫描来判有键按下、将键值转换成对应的ASCII码值,在时钟脉冲的作用实现串行数据的接收与发送。
二、设计方案
1.芯片引脚定义
reset复位输入端;clk时钟输入端;rxd串行数据接收端;retn0-retn7。
键盘接口技术
POP
RETI WZD01: MOV JNB
PSW
MOV A,#01H P1,#0FEH P3.2,KEYR1
;置S1键的键值为1 ;扫描P1.0 ;是S1键则转移
第8章
AT89C51系统接口技术
INC
A
;不是S1键,键值加1 ;扫描P1.1,以下同P1.0类似
MOV P1,#0FDH JNB INC
第8章
AT89C51系统接口技术
键扫描程序如下:
BOAD:LCALL BOADD JNZ BOAD1 ;无键按下转BOAD
LCALL DELAY
AJMP BOAD BOAD1:LCALL DELAY
;调延时子程序
;继续扫描键盘
;消除键抖动(延时子程序略)
LCALL BOADD
JNZ BOAD2 LCALL DELAY
AT89C51系统接口技术
BEGIN:
ORG 0100H MOV SP,#60H ;设置堆栈
MOV R1,#00H
SETB IT1 SETB SETB SETB
;R1存放键值
;设INT0、INT1为边沿触发 IT0 EA EX0 ;开中断
SETB
MOV
EX1
P1,#00H
第8章
AT89C51系统接口技术
MOV P1,#0FH
MOV A,P1
;置行线为0
MOV 30H,A MOV P1,#0F0H MOV A,P1 ;置列线为0
MOV 31H,A
ANL 30H,#0FH ;取列值
第8章
AT89C51系统接口技术
MOV
A,30H
ANL 31H,#0F0H ;取行值 ADD A,31H CPL RET A ;行值加列值 ;A全0无键按下
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
4、键盘接口的操作功能
从按一个键到键的功能被执行主要包括 两项工作: 第一项:键的识别,即在键盘中找出被按的 是哪个键。 第二项:键功能的实现。 第一项工作使用接口电路实现,第二项 工作是通过执行查询/中断服务程序来完成。 我们先讨论第一项,即键盘接口问题。
12
键盘接口的操作功能: ① 键盘扫描,以判定是否有键被按下 (称之为“闭合键”)。 ② 键识别,以确定闭合键的行列位置。 ③ 产生闭合键的键码。 ④ 排除多键、窜键(复按)及去抖动。
13
二 MCS-51对非编码键盘的接口
非编码键盘有两种形式: 独立式键盘接口: 单片机系统中,如只需要几个功能键, 此时,可采用独立式按键结构。 矩阵式(行列式)键盘接口: 单片机系统中,若使用按键较多时,通 常采用矩阵式键盘。
14
1、独立式键盘接口
①按键硬件结构
独立式按键是直接用I/O口线构成的单 个按键电路,其特点是每个按键单独 占用一根I/O口线,每个按键的工作不 会影响其它I/O口线的状态。 独立式按键电路配置灵活,软件结构 简单,但每个按键必须占用一根I/O口 线,因此,在按键较多时,I/O口线浪 费较大,不宜采用。
17
图3-4
18
③独立式按键的软件结构
常采用查询式结构: 先逐位查询每根 I/O 口线的输入状 态,如某一根I/O口线输入为低电平, 则可确认该I/O口线所对应的按键已 按下; 然后,再转向该键的功能处理程序。
19
独 立 式 键 盘 处 理 程 序 流 程
有按键信号? Y
延时等待10ms 仍有按键信号? Y 键盘处理 按键释放? Y
§10.2 键盘接口原理
一、键盘基础知识 二、MCS-51对非编码键盘的接口 三、键盘的工作方式
1
一 键盘基础知识
1、什么是键盘?
键盘是一组按键的组合,它是 最常用的单片机输入设备,操作人 员可以通过键盘输入数据或命令, 实现简单的人机对话。
2
2、按键的分类
按键按照结构原理可分为两类: 触点式开关按键:如机械式开关等。 无触点式开关按键:如磁感应按键。 前者造价低,后者寿命长。 目前,微机系统中最常见的是: 触点式开关按键
23
③矩阵式按键的识别方法
a. 扫描法
b. 线反转法
24
a. 扫描法
第1步:识别键盘有无键按下。 把所有列线置0,检查各行线电平是否 有变化,如有变化,说明有键按下,如 无变化,则无键按下。 第2步:如有键被按下,识别出具体的按键。 先把某一列置低电平,其余各列为高电平, 检查各行线电平的变化,如果某行线电平为 低,可确定此行列交叉点处的按键被按下。
15
MCS-51对独立式非编码键盘的接口
+5V
R╳8
8031
I/O P1
图3-3
此种接口适于键数较少或操作速度较高的场合。
16
②工作原理:
当任何一个键被按下时,与其相连 的输入线被置成 “0”,平时该线为 “ 1”。 工作方式:
图(a)为中断方式的独立式键盘工作电路 图(b)为查询方式的独立式键盘工作电路
8
为什么键盘要考虑去抖动?
一般常用去抖动的方法有几种?
常用的消抖措施有硬件消抖和软件消抖。 硬件方法就是在键盘中附加去抖动电路, 从根本上消除抖动产生的可能性; 软件方法则是采用时间延迟以躲过抖动(大
约延时10~30ms即可),待行线上状态稳
定之后,再进行状态输入。
9
◆软件消抖
25
过程:1.先判断有无键按下
列线输出0000,然后输入行线状态: 若没有键按下,则行线状态为全1(1111); 若有任一键按下,则行线状态不为全1。
26
输出口
P1.3 P1.2 P1.1 P1.0
0
0
0
0
+5 V 0 1 2 3
0
P1.7
1 5 9
2 6
3 7
输 1 4 P1.6 入 1
P1.5 口
图3-5
N
N
N
20
2、矩阵式(行列式)键盘接口
①按键硬件结构
用于按键数目较多的场合,由行线和列 线组成,按键位于行、列的交叉点上。 行列式键盘与独立式键盘相比,要节省很多的I/OFra bibliotek线。21
22
②矩阵式键盘工作原理
• 无键按下,该输入(行)线为高电平,当 有键按下时,输入(行)线电平由输出(列) 线的电平来决定。 • 由于行、列线为多键共用,各按键彼此 将相互发生影响,必须将行、列线信号配 合起来并作适当的处理,才能确定闭合键 的位置。
3
键盘按其结构形式可分为两种: 编码键盘:由硬件逻辑自动提供与键对 应的编码。使用方便,但电路复杂,价 格较贵,在单片机应用系统中较少采用。 非编码键盘:由软件来实现键盘的定义 与识别。结构简单、成本低廉,在单片 机应用系统中被普遍采用。
4
3、按键去抖动处理
由于通常的按键所用的开关是机械开关, 当开关闭合、断开时并不是马上稳定地 接通和断开,而是在闭合与断开瞬间均 伴随有一连串的抖动。 当扫描表明有键被按下之后,紧接着应 进行去抖动处理。抖动时间长、短与键 的机械特性有关,一般为5~l0ms。
就是在第一次检测到有键按下时先不动 作,延时一段时间(一般为10ms),再次 检测按键的状态,如果仍保持闭合状态, 则确认真正有键按下。 当检测到按键释放后,也要给 5ms~10ms的延时,待后沿抖动消失后 才能转入按键的处理程序。
10
对于两个或多个按键同时按下的重键 问题,可以采用“先入有效”或“后 留有效”的原则加以处理。 “先入有效”:指当多个按键同时按 下时,只有第一个按下的键有效,其 它键无效。 “后留有效”:指当多个按键同时按 下时,只有最后松开的按键有效,其 它键均无效。
5
如图所示:
键按下 闭合稳定 键释放
前沿抖动
后沿抖动
图3-1
按键抖动波形示意图
6
★请思考
什么是键抖动? 为什么键盘要考虑去抖动?
一般常用去抖动的方法有哪些?
7
什么是键抖动?
由于通常的按键所用的开关是机械开 关,被按下时,由于机械触点的弹性及 电压突跳等原因,触点闭合或断开的瞬 间会出现电压抖动。 键抖动可能导致计算机将人工按一次 键操作识别为多次,为了消除干扰,保 证在按键闭合稳定状态下读取键值,需 要对键盘进行消抖处理。