矩阵键盘电路设计.docx

上传人:b****3 文档编号:5227753 上传时间:2022-12-14 格式:DOCX 页数:12 大小:85.37KB
下载 相关 举报
矩阵键盘电路设计.docx_第1页
第1页 / 共12页
矩阵键盘电路设计.docx_第2页
第2页 / 共12页
矩阵键盘电路设计.docx_第3页
第3页 / 共12页
矩阵键盘电路设计.docx_第4页
第4页 / 共12页
矩阵键盘电路设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

矩阵键盘电路设计.docx

《矩阵键盘电路设计.docx》由会员分享,可在线阅读,更多相关《矩阵键盘电路设计.docx(12页珍藏版)》请在冰豆网上搜索。

矩阵键盘电路设计.docx

矩阵键盘电路设计

学号:

200730410130

课程设计

 

题目

矩阵键盘电路设计

教学院

计算机学院

专业

计算机应用技术

班级

应用

(1)班

姓名

曹晨

指导教师

缪贤浩

 

2010

01

12

 

前言....................................................................

第一章需求分析.........................................................

功能描述.........................................................

功能分析.........................................................

第二章系统的原理及分析.................................................

用到的知识点的介绍,知识点使用的总体思路

第三章详细设计.........................................................

硬件设计

系统结构图,元器件的选择等

软件设计

所设计的软件关键模块的程序流程

第四章测试............................................................

运行结果分析等

第五章总结.............................................................

参考文献................................................................

附录

关键程序代码........................................................

 

前言

矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。

在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4*4个。

一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:

P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

面板是微机仪器的重要组成部分。

面板主要包括显示器和键盘,通过面板对系统进行操作。

一般的单片机控制仪表的面板均含有数码管、发光管和按键,本文的仪器面板就是针对这个领域而开发的。

在仪器面板的设计中,键盘显示电路的设计一般采用三种方式,第一种为并行口动态扫描方式,该方式硬件简单、软件编程方便,与主板的信号连线多;第二种为串行口静态扫描方式,此方式使用串行芯片多,与主板的信号连线少;第三种为串行口动态扫描方式,此方式具有硬件简单、与主板信号连线少的优点,一般采用专用的串行口键盘显示芯片设计。

考虑到专用芯片成本较高,我们用普通芯片设计了串行口动态扫描方式的仪器面板。

每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:

确定有无键按下,判断哪一个键按下,键的功能是什么?

还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。

实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。

 

第一章需求分析

功能描述:

行线P1.0~P1.3为输出线,列线P1.4~P1.7为输入线。

一开始单片机将行线(P1.0~P1.3)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。

延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。

最后一步确定键值。

现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?

当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。

首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。

转到S5键功能处理子程序就可以达到目的。

功能分析:

4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,看门狗,两个数据指针,两个16计时器,一个5向量两级中断结构,一个全双工串行通讯口,片内振荡器及时时钟电路,同时A789S51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式,空闲方式停止工作并紧张其他所有部分工作直到下一个硬件复位。

如果给P3一个扫描初值的话:

如0x0F,则没有键按下时为:

P3.1~P3.3为1,P3.4~P3.7为0。

如果有键按下,则情况发生变化:

高电平接入低电平:

如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。

则P3此时为:

00000111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。

通过去抖操作,即一个delay,可以得到低四位内容。

这里设为:

h=P3&0x0F;如果再得到高四位内容,则可以组成一个数,来定位哪个键了。

当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。

如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。

即:

01110111,&F0之后,得到01110000,这样的话,我们得到高四位的值了,用高四位+低四位,就可以得到一个数值,确定一个键。

其扫描输出端口Pm.x不是直接与输入端口Pn.y交叉的,而是经过用于数码显示位驱动的反相组件后再与入端口Pn.y交叉的。

为此,其扫描输出有效端口不是低电平了,而是输出高电平经反相组件后再成为低电平,通过按键同样将与之交叉的输入端口线拉低。

所以,在查询输入端口时与图2所示的是相同的,而在查询扫描输出有效端口时与图2的就有所不同了。

为保证键每闭合一次MCU只作一次处理,每一次键解读后都将置键解读标志位为逻辑对于键解读标志位的置位,可以在每一个键解释处理完毕后进行,也可在消抖动延时后就进行一次总置。

不管键有多少个,键解读标志位用的却是同一个。

其实,引入了键解读标志位,不只是控制键每闭合一次MCU只作一次处理,还可对那些持久按着的键有控地进行多次处理(如用于对一些数据递进、或递减的连续设置等)。

需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。

行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

具体的识别及编程方法如下所述。

矩阵式键盘的按键识别方法:

确定矩阵式键盘上何键被按下介绍一种“行扫描法”。

行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。

判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:

依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。

在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

 

第二章系统的原理及分析

用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P1.0-P1.3各管脚作输入线,以单片机的P1.4-P1.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。

矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

在行线和列线的每一个交叉点上,设置一个按键。

这样键盘中按键的个数是4×4个。

这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。

数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。

若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。

所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。

矩阵键盘驱动的主要作用就是实时监测外部按键中断,一旦发现外部有键按下就向内核发送键盘消息实现键盘输入功能。

键盘驱动创建了中断服务线程和4个键盘中断事件,每行按键对应一个键盘中断事件。

有键被按下时,中断服务例程得到对应的中断标识符并报告给系统任务调度进程,同时产生键盘中断事件,键盘中断服务线程响应键盘中断事件,开始扫描矩阵键盘。

根据产生的中断事件类型不同,可以首先确定被按下键的行位置。

由于键盘被按下后,该键对应的行和列被连通,因此根据判断各列对应的I/O口的电平,可以得到被按下键的列位置;得到按键的准确位置后,通过向操作系统发送键盘消息KEYBD_EVENT,实现一次键盘输入。

循环扫描键盘,直到按键被弹起则发送KEYEVENTF_KEYUP事件。

 

总体思路

键盘扫描方法:

行线p1.0^p1.3为输入线,列线p1.4^p1.7为输出线。

一开始单片机将行线(p1.0^p1.3)全部输出低电平,此时读入线数据,若列线全部为高电平则没有键按下,当列线有出线低电平时调用延时程序以此来去除键抖动,延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。

最后一步确定键值。

现在我们以第二行的s5键为例,若按下s5后我们应该怎么得到这个键值呢?

当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。

首先,单片机将p1.0输出为低电平,其他p1.1^p1.3输出高电平,此时读取列线的数据全高电平,说明没有在第一行有键按下;其次,单片机将p1.1输出低电平,其他p1.0,p1.2.p1.3仍为高低电平,此时再来读取列线数据,发现列线读到数据低电平,数值为1011,如果我们的键盘布局已经确定,那么就代表s5的值了。

转到s5键功能处理子程序就可以达到目的。

在键盘矩阵扫描时,首先检查有否键按动。

若无键按动,则清零一次键解读标志位就返回;若有键按下,则再查询键解读标志位是逻辑0还是逻辑1。

如果是逻辑1,表明本次按键已解读过,可直接从键扫描处理程序中返回;如果是逻辑0,说明本次按键尚未解读过,则启用消抖动延时。

经消抖动延时后即查询键盘矩阵输入口线的各端口是否有拉低。

若一个端口也没被拉低,则说明本次按键无效,那可能是某种干扰引起的“抖动”,立即从键扫描处理程序中返回;若查询到其中之一端口的电平被拉低了,则表明本次按键盘是有效的,将跳转查询与之相交的那个扫描有效输出口线,进而确定具体是哪一个键按下,并跳转赋予其相应的解释处理。

解释处理后,置键解读标志位为逻辑1再返回,即完成一次键盘矩阵的扫描解读。

 不管键盘矩阵有多少个键,其扫描确定一个具体键所需位查询的总次数S不会大于行数x与列数y之和;但也不少于2次,即2≤S≤x+y。

如上述的6×5矩阵,最多所需位查询总次数S=5+6=11。

当第30号键按下,查询到最后一列Pn.4端口电平被拉低,继而跳转查询到有效扫描输出是最后一行Pm.5端口;但至少所需位查询总次数S=1+1=2。

当1号键按下,先查询到第1列Pn.0端口电平被拉低,继而跳转查询到有效扫描输出是第1行Pm.0端口。

检测当前是否有键被按下。

检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。

去除键抖动。

当检测到有键按下后,延时一段时间再做下一步的检测判断。

 

第三章详细设计

硬件设计

矩阵式键盘识别电路原理图

4*4矩阵键盘的显示

  

(1)在“单片机系统”区域中,把单片机的P1.0-P1.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

  

(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:

P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

 

软件设计

4×4矩阵式键盘识别程序流程图

 

第四章测试

1、测试仪器

5v直流稳压电流

2、指标测试

各部分测试的指标,由于此设计的单片机复位时上电自动复位,每次给点偏激送电都会是单片机复位,给单片机输入5v大小的电压,数码管显示的初值是“0”,按后按键盘,在数码管上则显示出相应的数值。

显示结果为:

“0----9”,“a----f”。

仿真结果如下:

a.数字“5”显示c.字母“F”显示

系统实现的功能

1、基本功能:

通过键盘输入,在数码管上显示相应的数值;

2、功能优势:

键盘输入,单片机控制,数码管显示,在数码管连接方面克服了共阳极数码管显示不清晰的困难。

 

第五章总结

结论:

由于使用的是单片机作为核心的控制元件,本设计采用89c51单片机作为主控器,结合微动按键和数码管实现了4*4矩阵键盘显示,并采用9012对数码管进行驱动,实现了数码管的显示。

4*4矩阵键盘具有功能强、性能可靠、电路简单、成本低等特点,加上经过优化的程序,使其有很高的智能化水平。

为了使我们设计的系统更具人性化,使测试方便,我们将电源线直接引出,测试起来非常方便。

但是在我们设计和调试的过程中,也发现了一些问题,譬如在测试初期,由于单片机烧写过程出现问题,导致单片机不能正常工作。

最终经过测试,排除困难。

本设计成功的完成了题目的设计要求。

随着嵌入式设备应用的日益广泛,特别是微软的嵌入式操作系统WindowsCE.NET的普及,WindowsCE.NET下矩阵键盘设计得到了越来越多开发者的重视。

本文所讨论的WindowsCE.NET下矩阵键盘设计方案简单、高效、实用。

特别适合于I/O口资源充足的嵌入式PDA上,现已成功应用于某卫星定位系统的键盘设计上。

 

参考文献

【1】罗朝霞.《单片机系统与实践》北京:

人民邮电出版社,2000年(第一版)

【2】黄继业.《单片机高级教程》北京:

科学出版社,2002年(第二版)

【3】杨家德.《单片机设计与制作》北京:

人民邮电出版社.2001年(第一版)

【4】梅遂生.《单片机基础知识》北京:

北航出版社,2003年(第二版)

【5】楼然苗.《51单片机系列设计实例》北京:

北航出版社2006年(第二版)

【6】桑楠.《嵌入式系统原理及应用开发技术》北京:

高等教育出版社2008年(第二版)

 

附录

关键程序代码

#include

voidkeyscan();

voiddelay();

voiddisplay(unsignedchari);

voidmain(){

while

(1){

keyscan();

}

}

voidkeyscan(){

unsignedcharn;

P1=0xfe;

n=P1;

n&=0xf0;

if(n!

=0xf0){

delay();

P1=0xfe;

n=P1;

n&=0xf0;

if(n!

=0xf0){

switch(n){

case(0xe0):

display(0);break;

case(0xd0):

display

(1);break;

case(0xb0):

display

(2);break;

case(0x70):

display(3);break;

}

}

}

P1=0xfd;

n=P1;

n&=0xf0;

if(n!

=0xf0){

delay();

P1=0xfd;

n=P1;

n&=0xf0;

if(n!

=0xf0){

switch(n){

case(0xe0):

display(4);break;

case(0xd0):

display(5);break;

case(0xb0):

display(6);break;

case(0x70):

display(7);break;

}

}

}

P1=0xfb;

n=P1;

n&=0xf0;

if(n!

=0xf0){

delay();

P1=0xfb;

n=P1;

n&=0xf0;

if(n!

=0xf0){

switch(n){

case(0xe0):

display(8);break;

case(0xd0):

display(9);break;

case(0xb0):

display(10);break;

case(0x70):

display(11);break;

}

}

}

P1=0xf7;

n=P1;

n&=0xf0;

if(n!

=0xf0){

delay();

P1=0xf7;

n=P1;

n&=0xf0;

if(n!

=0xf0){

switch(n){

case(0xe0):

display(12);break;

case(0xd0):

display(13);break;

case(0xb0):

display(14);break;

case(0x70):

display(15);break;

}

}

}

}

voiddisplay(unsignedchari){

unsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

P2=0xfe;

P0=table[i];

}

voiddelay(){

unsignedchari,j;

for(i=0;i<20;i++){

for(j=0;j<250;j++){

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1