⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 键盘接口与编程1.htm

📁 单片机快速入门
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.onestudy.net/download/elec/dpj26.htm -->
<!-- saved from url=(0048)http://www.21icsearch.com/pmcu/dpjjx/dpjjx28.htm --><HTML><HEAD><TITLE>键盘接口与编程</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY background="">
<OL><FONT lang=ZH-CN face=宋体 size=3>
  <P align=justify>
  <LI>矩阵式键盘接口技术及编程 
  <P></P></FONT></LI></OL>
<OL><FONT lang=ZH-CN face=宋体 size=3>
  <P align=justify>
  <LI>矩阵式键盘的结构与工作原理: 
  <P></P></FONT>
  <P align=justify><FONT lang=ZH-CN face=宋体 size=3>在键盘中按键数量较多时,为了减少</FONT><FONT 
  size=3>I/O</FONT><FONT lang=ZH-CN face=宋体 
  size=3>口的占用,通常将按键排列成矩阵形式,如图</FONT><FONT size=3>1</FONT><FONT lang=ZH-CN 
  face=宋体 
  size=3>所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如</FONT><FONT 
  size=3>P1</FONT><FONT lang=ZH-CN face=宋体 size=3>口)就可以构成</FONT><FONT 
  size=3>4*4=16</FONT><FONT lang=ZH-CN face=宋体 
  size=3>个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成</FONT><FONT 
  size=3>20</FONT><FONT lang=ZH-CN face=宋体 
  size=3>键的键盘,而直接用端口线则只能多出一键(</FONT><FONT size=3>9</FONT><FONT lang=ZH-CN 
  face=宋体 size=3>键)。由此可见,在</FONT></P>
  <TABLE cellSpacing=2 cellPadding=2 width=300 border=0>
    <TBODY>
    <TR>
      <TD><IMG height=333 src="键盘接口与编程1.files/dpj281.gif" 
    width=308></TD></TR></TBODY></TABLE>
  <P align=justify><FONT lang=ZH-CN face=宋体 
  size=3>需要的键数比较多时,采用矩阵法来做键盘是合理的。</FONT></P>
  <P align=justify><FONT lang=ZH-CN face=宋体 
  size=3>矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的</FONT><FONT 
  size=3>I/O</FONT><FONT lang=ZH-CN face=宋体 size=3>口作为输出端,而列线所接的</FONT><FONT 
  size=3>I/O</FONT><FONT lang=ZH-CN face=宋体 
  size=3>口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。</FONT></P><FONT 
  lang=ZH-CN face=宋体 size=3>
  <P align=justify></P>
  <LI>矩阵式键盘的按键识别方法 
  <P></P></FONT></LI></OL><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>确定矩阵式键盘上何键被按下介绍一种“行扫描法”。</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>行扫描法</FONT><FONT size=3> 
</FONT><FONT lang=ZH-CN face=宋体 
size=3>行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。</FONT></P>
<OL><FONT lang=ZH-CN face=宋体 size=3>
  <P align=justify></FONT>
  <LI><FONT lang=ZH-CN face=宋体 size=3>判断键盘中有无键按下</FONT><FONT size=3> 
  </FONT><FONT lang=ZH-CN face=宋体 size=3>将全部行线</FONT><FONT 
  size=3>Y0-Y3</FONT><FONT lang=ZH-CN face=宋体 
  size=3>置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与</FONT><FONT 
  size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>根行线相交叉的</FONT><FONT 
  size=3>4</FONT><FONT lang=ZH-CN face=宋体 
  size=3>个按键之中。若所有列线均为高电平,则键盘中无键按下。</FONT><FONT lang=ZH-CN face=宋体 size=3> 
  <P></P>
  <P align=justify></FONT></P>
  <LI><FONT lang=ZH-CN face=宋体 size=3>判断闭合键所在的位置</FONT><FONT size=3> 
  </FONT><FONT lang=ZH-CN face=宋体 
  size=3>在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。</FONT><FONT 
  lang=ZH-CN face=宋体 size=3> 
  <P></P></FONT></LI></OL><FONT lang=ZH-CN face=宋体 size=3>
<DIR>
<P align=justify>下面给出一个具体的例子:</P></DIR></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>图仍如上所示。</FONT><FONT 
size=3>8031</FONT><FONT lang=ZH-CN face=宋体 size=3>单片机的</FONT><FONT 
size=3>P1</FONT><FONT lang=ZH-CN face=宋体 size=3>口用作键盘</FONT><FONT 
size=3>I/O</FONT><FONT lang=ZH-CN face=宋体 size=3>口,键盘的列线接到</FONT><FONT 
size=3>P1</FONT><FONT lang=ZH-CN face=宋体 size=3>口的低</FONT><FONT 
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>位,键盘的行线接到</FONT><FONT 
size=3>P1</FONT><FONT lang=ZH-CN face=宋体 size=3>口的高</FONT><FONT 
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>位。列线</FONT><FONT 
size=3>P1.0-P1.3</FONT><FONT lang=ZH-CN face=宋体 size=3>分别接有</FONT><FONT 
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>个上拉电阻到正电源</FONT><FONT 
size=3>+5V</FONT><FONT lang=ZH-CN face=宋体 size=3>,并把列线</FONT><FONT 
size=3>P1.0-P1.3</FONT><FONT lang=ZH-CN face=宋体 size=3>设置为输入线,行线</FONT><FONT 
size=3>P1.4-P.17</FONT><FONT lang=ZH-CN face=宋体 size=3>设置为输出线。</FONT><FONT 
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>根行线和</FONT><FONT 
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>根列线形成</FONT><FONT 
size=3>16</FONT><FONT lang=ZH-CN face=宋体 size=3>个相交点。</FONT></P>
<OL><FONT lang=ZH-CN face=宋体 size=3>
  <P align=justify></FONT>
  <LI><FONT lang=ZH-CN face=宋体 size=3>检测当前是否有键被按下。检测的方法是</FONT><FONT 
  size=3>P1.4-P1.7</FONT><FONT lang=ZH-CN face=宋体 size=3>输出全“</FONT><FONT 
  size=3>0</FONT><FONT lang=ZH-CN face=宋体 size=3>”,读取</FONT><FONT 
  size=3>P1.0-P1.3</FONT><FONT lang=ZH-CN face=宋体 size=3>的状态,若</FONT><FONT 
  size=3>P1.0-P1.3</FONT><FONT lang=ZH-CN face=宋体 size=3>为全“</FONT><FONT 
  size=3>1</FONT><FONT lang=ZH-CN face=宋体 size=3>”,则无键闭合,否则有键闭合。</FONT> <FONT 
  lang=ZH-CN face=宋体 size=3>
  <P></P>
  <P align=justify></P>
  <LI>去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。 
  <P></P>
  <P align=justify></FONT></P>
  <LI><FONT lang=ZH-CN face=宋体 
  size=3>若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。</FONT><FONT 
  size=3>P1.4-P1.7</FONT><FONT lang=ZH-CN face=宋体 size=3>按下述</FONT><FONT 
  size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>种组合依次输出:</FONT> <FONT 
  lang=ZH-CN face=宋体 size=3>
  <P></P></FONT><FONT size=3>
  <P align=justify>P1.7 1 1 1 0</P>
  <P align=justify>P1.6 1 1 0 1</P>
  <P align=justify>P1.5 1 0 1 1</P>
  <P align=justify>P1.4 0 1 1 1</P></FONT>
  <P align=justify><FONT size=3></FONT><FONT lang=ZH-CN face=宋体 
  size=3>在每组行输出时读取</FONT><FONT size=3>P1.0-P1.3</FONT><FONT lang=ZH-CN face=宋体 
  size=3>,若全为“</FONT><FONT size=3>1</FONT><FONT lang=ZH-CN face=宋体 
  size=3>”,则表示为“</FONT><FONT size=3>0</FONT><FONT lang=ZH-CN face=宋体 
  size=3>”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值</FONT></P><FONT 
  lang=ZH-CN face=宋体 size=3>
  <P align=justify></FONT></P>
  <LI><FONT lang=ZH-CN face=宋体 size=3>为了保证键每闭合一次</FONT><FONT 
  size=3>CPU</FONT><FONT lang=ZH-CN face=宋体 size=3>仅作一次处理,必须却除键释放时的抖动。</FONT> 
  <TABLE cellSpacing=2 cellPadding=2 width=300 border=0>
    <TBODY>
    <TR>
      <TD height=328><IMG height=324 src="键盘接口与编程1.files/DPJ282.gif" width=362 
        align=bottom> </TD></TR>
    <TR>
      <TD><IMG height=296 src="键盘接口与编程1.files/DPJ283.gif" 
    width=362></TD></TR></TBODY></TABLE><FONT lang=ZH-CN face=宋体 size=3>
  <P></P></FONT></LI></OL><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>键盘扫描程序:</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 
size=3>从以上分析得到键盘扫描程序的流程图如图</FONT>2<FONT lang=ZH-CN face=宋体 
size=3>所示。程序如下</FONT></P><FONT size=3>
<P align=justify>SCAN: MOV P1,#0FH</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3></FONT><FONT size=3>MOV 
A,P1</FONT></P><FONT size=3>
<P align=justify>ANL A,#0FH</P>
<P align=justify>CJNE A,#0FH,NEXT1</P>
<P align=justify>SJMP NEXT3</P>
<P align=justify>NEXT1: ACALL D20MS</P>
<P align=justify>MOV A,#0EFH</P>
<P align=justify>NEXT2: MOV R1,A</P>
<P align=justify>MOV P1,A</P>
<P align=justify>MOV A,P1</P>
<P align=justify>ANL A,#0FH</P>
<P align=justify>CJNE A,#0FH,KCODE;</P>
<P align=justify>MOV A,R1</P>
<P align=justify>SETB C</P>
<P align=justify>RLC A</P>
<P align=justify>JC NEXT2</P>
<P align=justify>NEXT3: MOV R0,#00H </P>
<P align=justify>RET</P>
<P align=justify>KCODE: MOV B,#0FBH</P>
<P align=justify>NEXT4: RRC A</P>
<P align=justify>INC B</P>
<P align=justify>JC NEXT4</P>
<P align=justify>MOV A,R1</P>
<P align=justify>SWAP A</P>
<P align=justify>NEXT5: RRC A</P>
<P align=justify>INC B</P>
<P align=justify>INC B</P>
<P align=justify>INC B</P>
<P align=justify>INC B</P>
<P align=justify>JC NEXT5</P>
<P align=justify>NEXT6: MOV A,P1</P>
<P align=justify>ANL A,#0FH</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3></FONT><FONT size=3>CJNE 
A,#0FH,NEXT6</FONT></P><FONT size=3>
<P align=justify>MOV R0,#0FFH</P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify></FONT><FONT size=3>RET 
<P></P>
<P></P>
<P></P>
<P></P>
<P></P>
<P></P>
<P></P>
<P>键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。</P>
<P></P></FONT>
<P>到本课为止,本站教程暂告一个段落!感谢大家的关心和支持!</P>
<P align=center><A href="http://www.onestudy.net/"><FONT 
face=黑体>返回“一学网</FONT><FONT face="Times New Roman" color=#000000> </FONT><FONT 
face="Times New Roman"><FONT color=#000000>www.</FONT><FONT 
color=#ff0000>one</FONT><FONT color=#008000>study</FONT>.net</FONT><FONT 
face=黑体> ”首页</FONT></A></P>
<P> </P></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -