3.1.2键盘工作原理与接口电路按照与主机连接方式的不同,键盘可以分为独立式键盘、非编码矩阵式键盘和编码矩阵式键盘三类。独立式键盘、非编码矩阵式键盘通常采用软件的方法,逐行逐列检查键盘状态,当发现有键按下时,用计算或查表的方式获得该键的键值。这类键盘价格低廉,因此得到了广泛的应用。编码矩阵式键盘内部设有键盘编码器,被按下键的键值由编码器直接给出,同时具有防抖和解决连击的功能,处理速度快。1、独立式键盘独立式键盘的结构特点是一键占用一条接口线,每个按键电路是独立的,如图3-4所示。它们可以直接与单片机(以常用的AT89C51为例)I/O口线相接,如图3-4(a)所示,也可以通过输入接口芯片与单片机数据线相接,如图3-4(b)所示。图中的上位电阻保证按键断开时检测线上有稳定的高电平,图3-4(a)单片机P2口内部有上位电阻,故可以不接上拉电阻。当某一按键被按下时,对应的检测线就变成了低电平,据此可以很容易地识别被按下的键。这种连接方式的优点是键盘结构简单,所以按键识别容易,一旦检测到某一根接口线为低电平,便可直接转到相应的键功能处理程序进行处理。缺点是占用较多的I/O口线,不便于组成大型键盘。独立式键盘处理软件通常会用到的程序扫描方式、定时扫描方式和中断扫描方式。(a)直接连接(b)通过输入接口芯片连接图3-4独立式键盘电路(1)程序扫描方式程序扫描方式下的键盘接口电路如图3-4(a)所示。系统首先判断有无键按下,若检测到有键按下,则延时10ms消除抖动,再查询是哪一个键按下并执行有关的操作,然后再用软件查询按键直到按下的键释放。为防止按键释放时触点抖动和连击的影响,再用软件延时10ms结束本次操作,其程序流程图如图3-5所示。图3-5独立式键盘程序扫描方式流程图(2)定时扫描方式定时扫描方式是利用定时器产生定时(如10ms)中断,CPU响应中断后对键盘进行扫描,并在有键闭合时转入该键的功能处理程序。定时扫描的键盘电路与程序扫描方式相同,其流程图如图3-6所示。定时扫描程序可以设置两个标志:去抖动标志KM和处理标志KP。键扫描时若无键闭合,仅将KM和KP置0,返回。当有键闭合时,先检查KM标志。若KM=0,表示尚未做去抖动处理,则将KM置1后中断返回。中断返回后要经过10ms才能再次中断,利用此延时实现了软件去拌动。若KM=1,说明已经做过软件去抖动,则接着检查KP标志。如KP=0,说明还没有做该键的功能处理,因此进行此按键的处理;判断闭合键盘值,转入键功能处理程序,并将KP置1后返回。若KP=1,说明已做过键功能处理,所以为了避免重复处理,直接返回。(3)中断扫描方式在程序扫描和定时扫描方式下,CPU可能空扫描或不能及时响应键输入。为了克服这个缺点,可以采用中断扫描方式。图3-7所示为中断扫描方式下的键盘接口电路。如果键盘中无键闭合,则外部中断请求信号INT0为高电平,因而不会产生中断,CPU执行当前程序。当有键闭合时,INT0为低电平,向CPU发出中断请求,CPU在中断服务程序中完成键扫描和执行键功能程序。中断扫描既能及时处理键输入,又能提高CPU运行效率。图3-6独立式键盘定时扫描方式流程图图3-7中断扫描方式下的键盘接口电路2、非编码矩阵式键盘非编码矩阵式键盘应用在按键数量较多的系统或仪器中,图3-8所示为4行4列矩阵式键盘。键盘由行线(D0~D3)和列线(D4~D7)组成,按键设置在行、列线的交叉点上,行、列线分别连在按键开关的两端。列线通过上拉电阻至正电源,以使无键按下时列线处于高电平状态。当采用矩阵式键盘时,为了编程方便,常将矩阵式键盘中的每一个键按一定的顺序编号,这种按顺序的编号称为顺序码,也称为键值。为了求得矩阵式键盘中被按下键的键值,常用的方法有扫描法和线反转法。线反转法识别键值的速度较快,但必须借助于可编程的通用接口芯片,目前多数采用扫描法来识别按键。图3-84行4列矩阵式键盘(1)扫描法图3-9所示为由4×8矩阵组成的32键键盘与单片机的接口电路。8155的端口PC工作于输出方式,用于行扫描。端口PA工作于输入方式,用来读入列值。采用程序扫描工作方式,扫描法步骤如下。⚫判断键盘上有无键闭合。使PC口输出扫描字OOH,读PA口状态。若PA0~PA7都为1,则无键闭合;若不都为1,则有键闭合。图3-9矩阵式键盘与单片机的接口电路⚫消除键抖动影响。在检测到有键闭合后,软件延时10~20ms后再检测有无键闭合。如有键闭合则予以确认。⚫若有键闭合,则确定闭合键的键值。从PC口依次使键盘的一根行线为0,输出不同的扫描字。例如,先令PC0为0,PC1~PC3为1,即扫描字为FEH,然后读取PA0~PA7的值。若其中某位为0,则这次扫描到有键闭合;若PA0~PA7都为1,则无键闭合,再从PC口输出扫描字FDH,即PC1为0,对下一行进行扫描……对应X0~X3行的扫描字分别为FEH、FDH、FBH和F7H。闭合键的键号=行号×8+列号例如,当PC口输出扫描字FBH时(PC2为0,PC口其余口线为1),若检测到PA0为0,则闭合键的键值为2*8+0=10H;若检测到PA7=0,则闭合键的键值为2*8+7=17H。⚫为了保证键每闭合一次,CPU仅做一次处理,在程序中需要等待闭合键释放以后再转去执行相应的键处理程序。键扫描子程序流程图如图3-10所示。图3-10键扫描子程序流程图(2)线反转法扫描法要逐行扫描查询,当按下的键是在最后一行时,则要经过多次扫描才能获得键值,而如果采用线反转法,则只需经过两个步骤即可。线反转法的原理如图3-11所示,反转法两个步骤如下:图3-11线反转法原理图⚫将P1.7~P1.4作为输出线,将P1.3~P1.0作为输入线,并使P1口输出为0FH(即P1.7~P1.4为0000)。若无键按下,则输入口线P1.3~P1.0为1111;若有键按下,则输入口线P1.3~P1.0上的数据不全(若图中1键按下,则P1.3~P1.0为1110),将该数据存入内存某一单元N中。⚫将第一步I/O口线的传送方向反转过来,则原来作为输出的P1.7~P1.4口线作为输入线,原来作为输入的P1.3~P1.0口线作为输出线。使输出口线输出0000,然后读入输入口线的数据(若图中1键按下,则P1.7~P1.4为1101),将该数据存入内存某一单元N+1中,最后将N+1单元的数和N单元的数据拼接起来,就是按下键的特征码。图3-11中1键的特征码为11011110=DEH。表3-1列出了键盘各键的特征码。由于特征码的离散性很大,不便于程序处理,故可以对按键按顺序编码,得到顺序码。编程时可通过按下键的特征码查出对应的顺序码,以便于反转处理。表3-2所示为键码转换表。表3-1键特征码0111101111011110011177H7BH7DH7EH1011B7HBBHBDHBEH1101D7HDBHDDHDEH1110E7HEBHEDHEEH表3-2键码转换表键号特征码顺序码键号特征码顺序码0EEH00H8EBH08H1DEH01H9DBH09H2BEH02H10BBH0AH37EH03H117BH0BH4EDH04H12E7H0CH5DDH05H13D7H0DH6BDH06H14B7H0EH77DH07H1577H0FH行线特征码列线