<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[单片机4x4键盘设计]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[产品管理]]></category>
<pubDate>Wed, 26 Jun 2013 14:54:29 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	矩阵键盘是单片机编程中所使用的键盘.<br/>1.矩阵式键盘的结构与工作原理<br/>　　在键盘中按键数量较多时，为了减少I/O口的占用，通常将按键排列成矩阵形式，如图1所示。在矩阵式键盘中，每条水平线和垂直线在交叉处不直接连通，而是通过一个按键加以连接。这样，一个端口（如P1口）就可以构成4*4=16个按键，比之直接将端口线用于键盘多出了一倍，而且线数越多，区别越明显，比如再多加一条线就可以构成20键的键盘，而直接用端口线则只能多出一键（9键）。由此可见，在需要的键数比较多时，采用矩阵法来做键盘是合理的。<br/>　　矩阵式结构的键盘显然比直接法要复杂一些，识别也要复杂一些，上图中，列线通过电阻接正电源，并将行线所接的单片机的I/O口作为输出端，而列线所接的I/O口则作为输入。这样，当按键没有按下时，所有的输出端都是高电平，代表无键按下。行线输出是低电平，一旦有键按下，则输入线就会被拉低，这样，通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。<br/><br/>　　2、矩阵式键盘的按键识别方法 <br/>　　确定矩阵式键盘上何键被按下介绍一种“行扫描法”。<br/>　　行扫描法 行扫描法又称为逐行（或列）扫描查询法，是一种最常用的按键识别方法，如上图所示键盘，介绍过程如下。<br/>　　1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平，然后检测列线的状态。只要有一列的电平为低，则表示键盘中有键被按下，而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平，则键盘中无键按下。 <br/>　　2、判断闭合键所在的位置 在确认有键按下后，即可进入确定具体闭合键的过程。其方法是：依次将行线置为低电平，即在置某根行线为低电平时，其它线为高电平。在确定某根行线位置为低电平后，再逐行检测各列线的电平状态。若某列为低，则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 <br/>　　下面给出一个具体的例子：<br/>　　图仍如上所示。8031单片机的P1口用作键盘I/O口，键盘的列线接到P1口的低4位，键盘的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V，并把列线P1.0-P1.3设置为输入线，行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。<br/>　　1、检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”，读取P1.0-P1.3的状态，若P1.0-P1.3为全“1”，则无键闭合，否则有键闭合。 <br/>　　2、去除键抖动。当检测到有键按下后，延时一段时间再做下一步的检测判断。 <br/>　　3、若有键被按下，应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出： <br/>　　　P1.7 1 1 1 0<br/>　　　P1.6 1 1 0 1<br/>　　　P1.5 1 0 1 1<br/>　　　P1.4 0 1 1 1<br/>　　在每组行输出时读取P1.0-P1.3，若全为“1”，则表示为“0”这一行没有键闭合，否则有键闭合。由此得到闭合键的行值和列值，然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值<br/>　　4、为了保证键每闭合一次CPU仅作一次处理，必须却除键释放时的抖动。 <br/><br/>　　键盘扫描程序：<br/>　　从以上分析得到键盘扫描程序的流程图如图2所示。程序如下<br/>SCAN: MOV P1,#0FH<br/>MOV A,P1<br/>ANL A,#0FH<br/>CJNE A,#0FH,NEXT1<br/>SJMP NEXT3<br/>NEXT1: ACALL D20MS<br/>MOV A,#0EFH<br/>NEXT2: MOV R1,A<br/>MOV P1,A<br/>MOV A,P1<br/>ANL A,#0FH<br/>CJNE A,#0FH,KCODE;<br/>MOV A,R1<br/>SETB C<br/>RLC A<br/>JC NEXT2<br/>NEXT3: MOV R0,#00H <br/>RET<br/>KCODE: MOV B,#0FBH<br/>NEXT4: RRC A<br/>INC B<br/>JC NEXT4<br/>MOV A,R1<br/>SWAP A<br/>NEXT5: RRC A<br/>INC B<br/>INC B<br/>INC B<br/>INC B<br/>JC NEXT5<br/>NEXT6: MOV A,P1<br/>ANL A,#0FH<br/>CJNE A,#0FH,NEXT6<br/>MOV R0,#0FFH<br/>RET <br/>　　键盘处理程序就作这么一个简单的介绍，实际上，键盘、显示处理是很复杂的，它往往占到一个应用程序的大部份代码，可见其重要性，但说到，这种复杂并不来自于单片机的本身，而是来自于操作者的习惯等等问题，因此，在编写键盘处理程序之前，最好先把它从逻辑上理清，然后用适当的算法表示出来，最后再去写代码，这样，才能快速有效地写好代码。<br/>　　键盘是由一组规则排列的按键组成，一个按键实际上是一个开关元件，也就是说键盘是一组规则排列的开关。<br/><br/>    键盘工作原理<br/><br/>    1．按键的分类<br/>按键按照结构原理可分为两类，一类是触点式开关按键，如机械式开关、导电橡胶式开关等；另一类是无触点开关按键，如电气式按键，磁感应按键等。前者造价低，后者寿命长。目前，微机系统中最常见的是触点式开关按键。<br/>按键按照接口原理可分为编码键盘与非编码键盘两类，这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别，非编码键盘主要是由软件来实现键盘的定义与识别。<br/>全编码键盘能够由硬件逻辑自动提供与键对应的编码，此外，一般还具有去抖动和多键、窜键保护电路，这种键盘使用方便，但需要较多的硬件，价格较贵，一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵，其它工作均由软件完成。由于其经济实用，较多地应用于单片机系统中。下面将重点介绍非编码键盘接口。 <br/>2．键输入原理<br/>在单片机应用系统中，除了复位按键有专门的复位电路及专一的复位功能外，其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时，计算机应用系统应完成该按键所设定的功能，键信息输入是与软件结构密切相关的过程。<br/>    对于一组键或一个键盘，总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入并检查是哪一个键按下，将该键号送入累加器ACC，然后通过跳转指令转入执行该键的功能程序，执行完后再返回主程序。<br/>3．按键结构与特点<br/>微机键盘通常使用机械触点式按键开关，其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说，它能提供标准的TTL逻辑电平，以便与通用数字系统的逻辑电平相容。<br/>机械式按键再按下或释放时，由于机械弹性作用的影响，通常伴随有一定时间的触点机械抖动，然后其触点才稳定下来。其抖动过程如图7.2所示，抖动时间的长短与开关的机械特性有关，一般为5~10ms。<br/><br/>左图  按键触点的机械抖动<br/>在触点抖动期间检测按键的通与断状态，可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作，这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判，必须采取去抖动措施，可从硬件、软件两方面予以考虑。在键数较少时，可采用硬件去抖，而当键数较多时，采用软件去抖。<br/>在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路，图7.3是一种由R-S触发器构成的去抖动电路，当触发器一旦翻转，触点抖动不会对其产生任何影响。<br/>电路工作过程如下：按键未按下时，a = 0，b = 1，输出Q = 1，按键按下时，因按键的机械弹性作用的影响，使按键产生抖动，当开关没有稳定到达b端时，因与非门2输出为0反馈到与非门1的输入端，封锁了与非门1，双稳态电路的状态不会改变，输出保持为1，输出Q不会产生抖动的波形。当开关稳定到达b端时，因a = 1，b = 0，使Q = 0，双稳态电路状态发生翻转。当释放按键时，在开关未稳定到达a端时，因Q = 0，封锁了与非门2，双稳态电路的状态不变，输出Q保持不变，消除了后沿的抖动波形。当开关稳定到达b端时，因a = 0，b = 0，使Q = 1，双稳态电路状态发生翻转，输出Q重新返回原状态。由此             右图 双稳态去抖电路<br/>可见，键盘输出经双稳态电路之后，输出已变为规范的矩形方波。<br/>软件上采取的措施是：在检测到有按键按下时，执行一个10ms左右（具体时间应视所使用的按键进行调整）的延时程序后，再确认该键电平是否仍保持闭合状态电平，若仍保持闭合状态电平，则确认该键处于闭合状态；同理，在检测到该键释放后，也应采用相同的步骤进行确认，从而可消除抖动的影响。<br/>    4．按键编码<br/>一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同，采用不同的编码。无论有无编码，以及采用什么编码，最后都要转换成为与累加器中数值相对应的键值，以实现按键功能程序的跳转。<br/>5．编制键盘程序<br/>一个完善的键盘控制程序应具备以下功能：<br/>（1）检测有无按键按下，并采取硬件或软件措施，消除键盘按键机械触点抖动的影响。<br/>（2）有可靠的逻辑处理办法。每次只处理一个按键，其间对任何按键的操作对系统不产生影响，且无论一次按键时间有多长，系统仅执行一次按键功能程序。<br/>（3）准确输出按键值（或键号），以满足跳转指令要求。<br/><br/>    独立式按键<br/>   <br/>单片机控制系统中，往往只需要几个功能键，此时，可采用独立式按键结构。<br/>1．独立式按键结构<br/>独立式按键是直接用I/O口线构成的单个按键电路，其特点是每个按键单独占用一根I/O          <br/>               左图   独立式按键电路<br/><br/><br/>口线，每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。<br/>独立式按键电路配置灵活，软件结构简单，但每个按键必须占用一根I/O口线，因此，在按键较多时，I/O口线浪费较大，不宜采用。<br/>图7.4中按键输入均采用低电平有效，此外，上拉电阻保证了按键断开时，I/O口线有确定的高电平。当I/O口线内部有上拉电阻时，外电路可不接上拉电阻。<br/>2．独立式按键的软件结构<br/>独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态，如某一根I/O口线输入为低电平，则可确认该I/O口线所对应的按键已按下，然后，再转向该键的功能处理程序。图7.4中的I/O口采用P1口，请读者自行编制相应的软件。<br/>7．1．3  矩阵式按键<br/>单片机系统中，若使按键较多时，通常采用矩阵式（也称行列式）键盘。<br/>1．矩阵式键盘的结构及原理<br/>矩阵式键盘由行线和列线组成，按键位于行、列线的交叉点上，其结构如下图所示。                                          <br/><br/>由图可知，一个4×4的行、列结构可以构成一个含有16个按键的键盘，显然，在按键数量较多时，矩阵式键盘较之独立式按键键盘要节省很多I/O口。<br/>矩阵式键盘中，行、列线分别连接到按键开关的两端，行线通过上拉电阻接到＋5V上。当无键按下时，行线处于高电平状态；当有键按下时，行、列线将导通，此时，行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而，矩阵键盘中的行线、列线和多个键相连，各按键按下与否均影响该键所在行线和列线的电平，各按键间将相互影响，因此，必须将行线、列线信号配合起来作适当处理，才能确定闭合键的位置。<br/>2．矩阵式键盘按键的识别<br/>识别按键的方法很多，其中，最常见的方法是扫描法。下面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。<br/>    按键按下时，与此键相连的行线与列线导通，行线在无键按下时处在高电平，显然，如果让所有的列线也处在高电平，那么，按键按下与否不会引起行线电平的变化，因此，必须使所有列线处在低电平，只有这样，当有键按下时，该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化，便能判定相应的行有键按下。8号键按下时，第2行一定为低电平，然而，第2行为低电平时，能否肯定是8号键按下呢？回答是否定的，因为9、10、11号键按下同样使第2行为低电平。为进一步确定具体键，不能使所有列线在同一时刻都处在低电平，可在某一时刻只让一条列线处于低电平，其余列线均处于高电平，另一时刻，让下一列处在低电平，依此循环，这种依次轮流每次选通一列的工作方式称为键盘扫描。采用键盘扫描后，再来观察8号键按下时的工作过程，当第0列处于低电平时，第2行处于低电平，而第1、2、3列处于低电平时，第2行却处在高电平，由此可判定按下的键应是第2行与第0列的交叉点，即8号键。<br/>    3．键盘的编码<br/>对于独立式按键键盘，因按键数量少，可根据实际需要灵活编码。对于矩阵式键盘，按键的位置由行号和列号唯一确定，因此可分别对行号和列号进行二进制编码，然后将两值合成一个字节，高4位是行号，低4位是列号。如图7.5中的8号键，它位于第2行，第0列，因此，其键盘编码应为20H。采用上述编码对于不同行的键离散性较大，不利于散转指令对按键进行处理。因此，可采用依次排列键号的方式对安排进行编码。以图7.5中的4×4键盘为例，可将键号编码为：01H、02H、03H…0EH、0FH、10H等16个键号。编码相互转换可通过计算或查表的方法实现。<br/>4．键盘的工作方式<br/>在单片机应用系统中，键盘扫描只是CPU的工作内容之一。CPU对键盘的响应取决于键盘的工作方式，键盘的工作方式应根据实际应用系统中CPU的工作状况而定，其选取的原则是既要保证CPU能及时响应按键操作，又不要过多占用CPU的工作时间。通常，键盘的工作方式有三种，即编程扫描、定时扫描和中断扫描。<br/>    1）编程扫描方式<br/>编程扫描方式是利用CPU完成其它工作的空余调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时，CPU不再响应键输入要求，直到CPU重新扫描键盘为止。<br/>键盘扫描程序一般应包括以下内容：<br/>（1）判别有无键按下。<br/>（2）键盘扫描取得闭合键的行、列值。<br/>（3）用计算法或查表法得到键值。<br/>（4）判断闭合键是否释放，如没释放则继续等待。<br/>（5）将闭合键键号保存，同时转去执行该闭合键的功能。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 单片机4x4键盘设计]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>