行列式键盘接口
- 格式:ppt
- 大小:544.00 KB
- 文档页数:42
键盘接口设计键盘接口设计摘要:本文主要介绍了键盘的工作原理和六种键盘接口电路的结构及其按键的识别方法,可以满足各种应用场合对于键盘的要求。
关键词:独立式行列式阶梯式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,且电路结构繁杂,故此种键盘适用于按键较少或操作速度较高的场合。
第二讲 单片机与键盘接口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实验证明:加入按键释放程序后该按键可靠性显著提高,工作稳定可靠。
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 行列式键盘实验一、实验目的(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)、根据实验内容设计相应的调试程序,并通过仿真,运行正确。