第10章行列式(矩阵式)键盘接口

合集下载

矩阵键盘的工作原理

矩阵键盘的工作原理

矩阵键盘的工作原理矩阵键盘是一种常见的输入设备,它的工作原理是通过矩阵排列的按键和电路来实现输入信号的传输。

在我们日常生活中,矩阵键盘被广泛应用于计算机、手机、电子游戏机等设备中,它的工作原理对于我们了解和使用这些设备都至关重要。

矩阵键盘的工作原理主要包括按键输入、行列扫描和编码传输三个部分。

首先,当我们按下键盘上的某一个按键时,按键会闭合对应的电路,产生一个电信号。

这个电信号会被传送到键盘的控制电路中,进行处理和编码。

控制电路会根据按键的位置,将按键所在的行和列进行扫描,确定按键的具体位置。

然后,控制电路会将按键的位置信息转换成数字编码,通过数据线传输给计算机或其他设备,完成按键输入的过程。

矩阵键盘的按键排列采用了行列交叉的矩阵结构,这种结构可以大大减少按键和控制电路之间的连接线,使得键盘的布线更加简洁和紧凑。

在实际应用中,矩阵键盘的按键数量可以很大,但是由于采用了矩阵结构,所以只需要相对较少的引脚就可以完成对所有按键的扫描和编码,这样就大大降低了成本和复杂度。

值得一提的是,矩阵键盘的工作原理也决定了它的一些特点。

首先,由于采用了矩阵排列,所以在按下多个按键的情况下,可能会出现按键冲突的现象。

这是因为在矩阵键盘中,每一个按键都对应着一个唯一的行列交叉点,当同时按下多个按键时,就会出现多个交叉点闭合的情况,这就导致了按键冲突。

为了解决这个问题,矩阵键盘通常会采用一些消抖和排除冲突的算法,来确保按键输入的准确性和稳定性。

另外,矩阵键盘的工作原理也决定了它的扩展性和灵活性。

通过改变矩阵的行列排列方式,可以实现不同大小和形状的键盘设计,满足不同设备的需求。

同时,矩阵键盘的按键编码方式也可以根据实际情况进行定制,使得键盘可以适配不同的输入接口和通信协议。

总的来说,矩阵键盘的工作原理是通过矩阵排列的按键和电路来实现输入信号的传输。

它的工作原理决定了键盘的特点和应用范围,同时也为我们使用这些设备提供了便利和效率。

9 接口技术II键盘接口

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位行列码

矩阵式键盘的接口设计与编程

矩阵式键盘的接口设计与编程

;<--------------------------判断是否真的有键按下--------------------->
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. 引言矩阵键盘是一种常见的输入设备,广泛应用于各种电子产品中。

本文将介绍矩阵键盘的使用流程,包括连接矩阵键盘、矩阵键盘的工作原理以及如何进行按键操作。

2. 连接矩阵键盘连接矩阵键盘的步骤如下:1.确认矩阵键盘的接口类型:矩阵键盘通常使用USB或者PS/2接口。

查看键盘背面标签或者说明书,确认键盘的接口类型。

2.准备相应的连接线:根据键盘接口类型准备相应的连接线,如USB线或者PS/2转接器。

3.将键盘与计算机连接:将键盘的接口与计算机的相应接口进行连接。

如果使用USB接口,直接将USB线插入计算机的USB接口;如果使用PS/2接口,将PS/2转接器插入计算机的PS/2接口,然后将键盘的接口插入转接器。

4.等待操作系统自动识别:计算机会自动识别新连接的键盘,并进行适配。

稍等片刻,操作系统会完成键盘的安装。

3. 矩阵键盘的工作原理矩阵键盘的工作原理是基于一种矩阵排列的按键结构。

它将键盘按键分为行列交叉的网格,行对应按键上的触点,列则对应键盘电路中的控制信号。

当按下某个按键时,该按键所在的行和列会产生接触,触点与控制信号连接,信息传递给计算机,实现按键的输入。

4. 按键操作矩阵键盘的按键操作非常简单,只需按照以下步骤进行:1.先确认你要按下的按键所在的行和列位置。

可以参考键盘的布局图或者记住按键的位置。

2.将手指放在预定的按键上,稍微用力按下。

注意不要按错位置,避免误操作。

3.松开手指后,可以观察到键盘上对应的字符会在屏幕上显示出来。

或者,按键可能会触发电脑中的某个功能,如音量控制、页面切换等。

5. 常见问题及解决方法在使用矩阵键盘过程中,可能会遇到一些问题。

以下是一些常见问题及其解决方法:1.按键无法正常输入字符:检查键盘连接是否松动,重新连接键盘,或者尝试使用其他USB接口或者PS/2转接器进行连接。

2.按键反应迟缓:可能是键盘连接出现问题,重新连接一次或者更换连接线尝试,或者检查计算机的处理器负载情况。

矩阵键盘

矩阵键盘

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 ,单片机开发配件,机械手按键。

行列式矩阵键盘工作原理

行列式矩阵键盘工作原理

行列式矩阵键盘工作原理行列式矩阵键盘是一种常见的电子键盘输入设备,它的工作原理涉及到行列式和矩阵的相关知识。

在本文中,我们将详细介绍行列式矩阵键盘的工作原理。

一、行列式和矩阵的基本概念行列式是线性代数中的一种重要概念,它是一个由数按照一定规则排列成的方阵,并且可以通过一系列的运算得到一个标量值。

矩阵是由数按照一定规则排列成的矩形阵列,是线性代数中的另一个重要概念。

二、行列式矩阵键盘的结构和原理行列式矩阵键盘通常由多个按键组成,每个按键都与一个特定的数字或字符相关联。

按下某个按键时,键盘会发送一个信号给计算机,告诉它哪个按键被按下。

这个信号是通过行列式矩阵键盘的结构和原理实现的。

行列式矩阵键盘的结构通常由多行多列的按键组成,每个按键都有一个独特的行列位置。

键盘的每一行和每一列都与计算机的输入接口相连。

当按下某个按键时,该按键所在的行和列会形成一个连通电路,通过这个电路可以识别出按下的是哪个按键。

行列式矩阵键盘的工作原理是基于行列式和矩阵的特性。

通过设置每个按键的行列位置,可以将键盘的输入映射为一个矩阵。

每个按键的行列位置可以用一个数字来表示,这个数字就是矩阵中的一个元素。

当按下某个按键时,可以通过行列位置得到该按键的数字或字符,并将其发送给计算机。

三、行列式矩阵键盘的扫描过程行列式矩阵键盘的扫描过程是指键盘不断地检测按键的状态,以便及时响应用户的输入。

这个过程通常包括两个步骤:行扫描和列扫描。

行扫描是指逐行检测按键的状态。

键盘会依次选取每一行,并检测该行中的所有按键是否被按下。

如果有按键被按下,键盘会记录下该按键的行列位置,并将其发送给计算机。

如果没有按键被按下,键盘会继续进行下一行的扫描。

列扫描是指逐列检测按键的状态。

键盘会依次选取每一列,并检测该列中的所有按键是否被按下。

如果有按键被按下,键盘会记录下该按键的行列位置,并将其发送给计算机。

如果没有按键被按下,键盘会继续进行下一列的扫描。

通过不断地进行行扫描和列扫描,行列式矩阵键盘可以实时监测按键的状态,并将按下的按键发送给计算机进行处理。

矩阵键盘程序设计

矩阵键盘程序设计

矩阵键盘程序设计矩阵键盘程序设计概述矩阵键盘是一种常见的输入设备,常用于电子产品和计算机系统中。

它由多个按键组成,采用矩阵排列的方式连接到计算机系统中。

在本篇文章中,我们将讨论矩阵键盘的程序设计。

程序设计步骤步骤一:硬件连接,我们需要将矩阵键盘与计算机系统进行连接。

通常情况下,矩阵键盘的每一行和每一列都通过引脚与计算机系统中的GPIO(通用输入输出)引脚相连接。

步骤二:引脚控制接下来,我们需要使用程序控制GPIO引脚的输入输出状态。

对于矩阵键盘而言,我们通常会将一行的引脚设置为输出,将一列的引脚设置为输入,然后将输出引脚设置为高电平,输入引脚设置为上拉或下拉电阻。

步骤三:按键扫描在第二步的基础上,我们可以进行按键的扫描操作。

具体方法是,先将某一行的引脚设置为低电平,然后读取每一列的引脚状态。

如果某一列引脚为低电平,则表示该按键被按下。

步骤四:按键处理一旦我们检测到某个按键被按下,就可以执行相应的按键处理操作。

这可能包括记录按键信息、执行某些特定的功能或触发一些事件。

步骤五:循环扫描,我们需要将以上步骤放入一个循环中进行不断的扫描。

这样可以实现对整个矩阵键盘的实时检测和响应。

示例代码下面是一个简单的矩阵键盘程序设计的示例代码,使用C语言编写:cinclude <stdio.h>include <wiringPi.h>define ROWS 4define COLS 4int rows[ROWS] = { 2, 3, 4, 5 };int cols[COLS] = { 6, 7, 8, 9 };char keyMap[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'', '0', '', 'D'}};void init() {wiringPiSetup();for (int i = 0; i < ROWS; i++) {pinMode(rows[i], OUTPUT);digitalWrite(rows[i], HIGH);}for (int i = 0; i < COLS; i++) {pinMode(cols[i], INPUT);pullUpDnControl(cols[i], PUD_UP);}}char getKey() {while (1) {for (int i = 0; i < ROWS; i++) {digitalWrite(rows[i], LOW);for (int j = 0; j < COLS; j++) {if (digitalRead(cols[j]) == LOW) { return keyMap[i][j];}}digitalWrite(rows[i], HIGH);}}}int mn() {init();while (1) {char key = getKey(); printf(\。

矩阵式键盘实验报告

矩阵式键盘实验报告

矩阵式键盘实验报告矩阵键盘设计实验报告南京林业大学实验报告基于AT89C51单片机4x4矩阵键盘接口电路设计课程院系班级学号姓名指导老师机电一体化设计基础机械电子工程学院杨雨图2013年9月26日一、实验目的1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

3、掌握利用Keil51软件对程序进行编译。

4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。

5、会根据实际功能,正确选择单片机功能接线,编制正确程序。

对实验结果能做出分析和解释,能写出符合规格的实验报告。

二、实验要求通过实训,学生应达到以下几方面的要求:素质要求1.以积极认真的态度对待本次实训,遵章守纪、团结协作。

2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。

能力要求1.模拟电路的理论知识2.脉冲与数字电路的理念知识3.通过模拟、数字电路实验有一定的动手能力4.能熟练的编写8951单片机汇编程序5.能够熟练的运用仿真软件进行仿真三、实验工具1、软件:Proteus软件、keil51。

2、硬件:PC机,串口线,并口线,单片机开发板四、实验内容1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格元器件的作用。

2、用keil51测试软件编写AT89C51单片机汇编程序3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。

4、运用仿真软件对电路进行仿真。

五.实验基本步骤1、用Proteus绘制“矩阵键盘扫描”电路原理图。

2、编写程序使数码管显示当前闭合按键的键值。

3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状态和按键开关的对应关系。

4、用keil51软件编写程序,并生成HEX文件。

5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。

6、用通用编程器或ISP下载HEX程序到MCU。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AJMP
LKP
LTW0:JB MOV AJMP LTHR:JB MOV LKP: ADD PUSH LK3: ACALL
A.2,LTHR A,#10H LKP Acc.3,NEXT A,#18H A,R4 A DIR
;2行线为高,无键闭合,跳LTHR, ;转判3行 ;2行有键闭合,首键号10H→A ;跳LKP,计算键号 ;3行线为高,无键 ;闭合,跳NEXT,准备下一列扫描 ;3行有键闭合,首键号18H→A ;计算键号:首键号+列号=键号 ;键号进栈保护 ;调用显示子程序,延时6ms ;调用判有无键闭合子程序,延时 ;6ms ;判键释放否,未释放,则循环 ;键已释放,键号出栈→A
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,
(2)按键的识别方法
a. 扫描法 图10-10(b)中3号键被按下为例,来说明此键 时如何被识别出来的。
识别键盘有无键被按下的方法,分两步进行: 第1步:识别键盘有无键按下; 第2步:如有键被按下,识别出具体的按键。 把所有列线置0,检查各行线电平是否有变化,如 有变化,说明有键按下,如无变化,则无键按下。 上述方法称为扫描法,即先把某一列置低电平, 其余各列为高电平,检查各行线电平的变化,如果某 行线电平为低,可确定此行列交叉点处的按键被按 下。 b. 线反转法
原则:即要保证能及时响应按键操作,又不要过多占 用CPU的工作时间。 通常,键盘工作方式有3种,即编程扫描、定时扫 描和中断扫描。 1. 编程扫描方式 只有当单片机空闲时,才调用键盘扫描子程序, 扫描键盘。 工作过程:
(1)在键盘扫描子程序中,先判断有无键按下。
方法:PA口8位输出全0,读PC口低4位状态,若PC0~ PC3为全1,则说明键盘无键按下;若不全为1,则说明 键盘可能有键按下。
键盘子程序如下:
KEYI:ACALL JNZ NI: ACALL AJMP LK1: ACALL ACALL ACALL JNZ ACALL AJMP KS1 LK1 DIR KEYI DIR DIR KS1 LK2 DIR KEYI ;调用判有无键闭合子程序 ;有键闭合,跳LK1 ;无键闭合,调用显示子程序,延 ;迟6ms后,跳KEYI ;可能有键闭合,延迟12ms,软件去抖 ;调用判有无键闭合子程序 ;经去抖,判键确实闭合,跳LK2处理 ;调用显示子程序延迟6ms ;抖动引起,跳KEYI
31H,6EH,1CH,23H,40H,03H 18H,00H ;延时1ms子程序
MOV R7,#02H MOV R6,#0FFH DJNZ R6,DL6 DJNZ R7,DL RET
2.键盘程序设计
(1)判别键盘上有无键闭合 (2)去除键的机械抖动 (3)判别闭合键的键号 (4)使CPU对键的一次闭合仅作一次处理 键盘程序的流程如图10-16。
A ;重新进行整个键盘扫描 ;键扫描未扫到最后一列,,位选码左移 ;一位 R2,A ;位选码→R2 LK4 ; KEYI ; DPTR ,#7F01H;判有无键闭合子程序,全 A,#00H @DPTR,A ;扫描口(PA口) ;即列线全为低电平 ;
INC
DPTR
;DPTR增2,指向PC口
INC MOVX CPL ANL RET
8031外扩一片8155H。RAM地址为7E00H~7EFFH。 I/O口地址为7F00H~7F05H。 PA口为输出口,控制键盘列线的扫描,同时又是6 位共阴极显示器的位扫描口。 PB口作为显示器段码输出口,PC口作为键盘的行 线状态的输入口。
75452:反相驱动器,7407:同相驱动器。
1.动态显示程序设计 8031内部RAM设置6个显示缓冲单元79H~7EH,存 放要显示的6位数据。 8155H的PB口输出相应位的段码,依次的改变PA口 输出为高的位使某一位显示某一字符,其它位为暗。 动态地显示出由缓冲区中显示数据所确定的字符。 程序流程如图10-15 。
74LS164(0)~74LS164(7):作为8位LED的段码输出,
8031的P3.4、P3.5:两行键的行状态输入 P3.3(TXD):同步移位脉冲输出控制线,
优点:亮度大,容易做到显示不闪烁,且CPU不必 频繁的为显示服务,从而使单片机有更多的时间处理 其它事务。 显示子程序:
DIR: SETB P3.3 MOV R7,#08H ;P3.3=1允许TXD脚同步移位 ;脉冲输出 ;送出的段码个数,R7为段 ;码个数计数器
; 右边的下一位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,7L: DL6:
KL0: JNB TI,KL0 CLR TI KL1: JNB JB P3.4,PK1 P3.5,KL1
PK1: ACALL DL10
JNB
P3.4,PK2
;判是否抖动引起的?
JB PK2: MOV MOV
P3.5,KL1 R7,#08H R6,#0FEH
;不是抖动引起的 ;判别是哪一个键按下,FEH为最 ;左一列为低 ;R3为列号寄存器 ; ;列扫描码从串行口输出 ;等待串行口发送完 ;串行口发送完毕,清TI标志 ;读第1行线状态,第1行有键闭 ;合,跳PKONE处理 ;读第2行状态,是第2行某键否? ;第2行键中有键被按下,行首键 ;号08H送R4 ;
DPTR A,@DPTR A A,#0FH
;指针增1,指向PC口 ;从PC口读行线的状态 ;行线取反,如无键按下,则A为0; ;屏蔽无用的高4位
10.3.2 利用8031的串行口实现键盘/显示器接口 串行口未作它用,可用来外扩键盘/显示器。 串行口为方式0输出,串行口外接移位寄存器74LS164。 接口电路如图10-17。
LK2: MOV MOV
R2,#0FEH ;列选码→R2 R4,#00H ;R4为列号计数器
LK4: MOV
DPTR,#7F01H ;列选码→8155H的PA口
MOV MOVX INC INC MOVX JB
MOV AJMP
A,R2 @DPTR,A DPTR DPTR A,@DPTR Acc.0,LONE
(2)用软件来消除按键抖动的影响。如有键按下,则 进行下一步。 (3)求按下键的键号。
(4)等待按键释放后,再进行按键功能的处理操作。
2. 定时扫描工作方式
利用单片机内的定时器,产生10ms的定时中断,对 键盘进行扫描。
3.中断工作方式 只有在键盘有键按下时,才执行键盘扫描程序,如 无键按下,单片机将不理睬键盘。
MOV MOV KL5: MOV KL2: JNB CLR JNB
R3,#00H A,R6 SBUF,A TI,KL2 TI P3.4,PKONE
JB P3.5,NEXT MOV R4,#08H AJMP PK3
PKONE:MOV R4,#00H ;第1行有键按下,行首键号00H送R4 PK3: MOV SBUF,#00H ;等待键释放,发送00H使所有列 ;线为低 KL3: JNB TI,KL3 ;
TI,DL1 TI R0 R7,DL0 P3.3
;输出段码,查询TI状态,1个字节 ;的段码输出完否? ;1个字节的段码输出完,清TI标志 ;指向下一个显示数据单元 ;段码个数计数器R7是否为0, 如不 ; 为0,继续送段码 ;8个段码输出完毕,关显示器输出 ;返回 ;共阳极段码表,
0C0H,0F9H,0A4H,0B0H,99H 92H,82H,0F8H,90H 88H,83H,0C6H,0A1H,86H
MOVC
A,@A+PC
;根据显示数据来查表取段码
DIR1:
MOVX @DPTR,A ACALL DL1ms INC R0 MOV A,R3 JB Acc.5,LD1 RL A
;段码→8155HPB口 ;该位显示1ms ;指针指向下一个数据单元 ;位选码送入A中 ;判断是否扫描到最右边的 ; LED,如到最右边则返回 ;位选码向左移一位,准备让
A,#00H LKP
; ; ;数据指针增2,指向PC口 ; ;读8155H PC口 ;0行线为高,无键闭合,跳 LONE,转判1行
;0行有键闭合,首键号0→A ;跳LKP,计算键号
LONE:JB
MOV
Acc.1,LTW0
A,#08H
;1行线为高,无键闭合,跳LTW0, ;转判2行
;1行有键闭合,首键号8→A
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,软 ;件消除抖动
键盘所做的工作分为三个层次,如图10-13。
第1层:单片机如何来监视键盘的输入。三种工作方 式:①编程扫描②定时扫描③中断扫描。
第2层:确定具体按键的键号。体现在按键的识别方 法上就是:①扫描法;②线反转法。 第3层:执行键处理程序。 10.3 键盘/显示器接口设计实例 一般把键盘和显示器放在一起考虑。 10.3.1 利用并行I/O芯片实现键盘/显示器接口 图10-14:8031用扩展I/O接口芯片8155H实现的 6位LED显示和32键的键盘/显示器接口电路。图中的 8155H也可用8255A来替代。
相关文档
最新文档