非编码键盘的扫描程序设计.docx

上传人:b****5 文档编号:7229512 上传时间:2023-01-22 格式:DOCX 页数:15 大小:199.28KB
下载 相关 举报
非编码键盘的扫描程序设计.docx_第1页
第1页 / 共15页
非编码键盘的扫描程序设计.docx_第2页
第2页 / 共15页
非编码键盘的扫描程序设计.docx_第3页
第3页 / 共15页
非编码键盘的扫描程序设计.docx_第4页
第4页 / 共15页
非编码键盘的扫描程序设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

非编码键盘的扫描程序设计.docx

《非编码键盘的扫描程序设计.docx》由会员分享,可在线阅读,更多相关《非编码键盘的扫描程序设计.docx(15页珍藏版)》请在冰豆网上搜索。

非编码键盘的扫描程序设计.docx

非编码键盘的扫描程序设计

摘要

计算机控制技术课程设计是在教学及实验基础上,对课程所学理论知识的深化和提高。

本次课程设的内容是利用8031微控制器,通过8155扩展I/O口行列式键盘。

要求通过8155扩展I/O口组成4×8行列式键盘,设计非编码键盘的扫描系统,并且能够对键盘的按键正确识别,去抖动。

关键词:

8155非编码去抖

 

目录

1课程设计目的1

2非编码键盘2

3芯片介绍3

3.18031芯片介绍3

3.28155芯片介绍4

4电路设计6

5程序设计7

6电路仿真10

7心得体会13

附录程序清单14

参考文献17

 

非编码键盘的扫描程序设计

1课程设计目的

(1)了解并掌握非编码键盘的工作原理;

(2)熟悉和掌握8155与8031的结构及工作原理;

(3)通过课程设计,掌握电路设计的基本方法和技术;

(4)掌握单片机的接口技术及相关外围芯片的外特性,控制方法,从而加深对计算机控制技术知识的理解;

(5)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

 

2非编码键盘

键盘可以分为编码式和非编码式两种。

编码式键盘是通过数字电路直接产生对应于按键的ASCⅡ码,这种方式目前很少使用。

非编码式键盘将案件排列成矩阵的形势,由硬件或软件随时对矩阵扫描,一旦某一键被按下,该键的行列信息即被转换为位置码并送入主机,再由键盘驱动程序查表,从而得到按键的ASCⅡ码,最后送入内存中的键盘缓冲区供主机分析执行。

非编码式键盘由于结构简单,按键重定义方便而成为目前最常采用的键盘类型。

由此,多姿多彩的多媒体键盘便应运而生,这些键盘通常出现在品牌机上,如联想、同方等,品牌机上的“单键上网”也是基于此原理。

非编码键盘又分为:

独立键盘和行列式(又称为矩阵式)键盘。

本次课程设计要求设计的是4×8行列式键盘。

 

3芯片介绍

3.18031芯片介绍

8031和8051一样是最常见的MCS51系列单片机,是inter公司早期的成熟的单片机产品,应用范围涉及到各行各业。

8031有40个引脚,采用双列直插封装,其引脚图如图3-1所示。

 

图3-18031引脚图

XTAL1:

内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。

当采用外部振荡器时,此引脚接地。

XTAL2:

内部振荡电路反相放大器的输出端。

是外接晶体的另一端。

当采用外部振荡器时,此引脚接外部振荡源。

RST:

当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位。

程序选通有效信号,当从外部程序存贮器读取指令时产生低电平时,指令寄存器的内容读到数据总线上。

ALE:

地址锁存有效信号,其主要作用是提供一个适当的定时信号,在它的下降沿用于外部程序存储器或外部数据存贮器的低8位地址锁存,使总线P0输出/输入口分时用作地址总线(低8位)和数据总线,此信号每个机器出现2次,只是在访问外部数据存储器期间才不输出ALE。

当保持TTL高电平时,如果指令计数器小于4096,8031执行内部ROM的指令;当使TTL为低电平时,从外部程序存贮器取出所有指令。

P0.0~P0.7:

通道0,它是8位漏极开路的双向I/O通道,当扩展外部存贮器时,这也是低八位地址和数据总线,在编程校验期间,它输入和输出字节代码,通道0吸收/发出二个TTL负载。

P1.0~P1.7:

通道1是8位拟双向I/O通道,在编程和校验时,它发出低8位地址。

通道1吸收/发出一个TTL负载。

P2.0~P2.7:

通道2是8位拟双向I/O通道,当访问外部存贮器时,用作高8位地址总线。

通道2能吸收/发出一个TTL负载。

P3.0~P3.7:

通道3准双向I/O通道。

通道3能吸收/发出一个TTL负载。

3.28155芯片介绍

8155是一多功能的可编程外围接口芯片,内部资源有256B的RAM,2个8位、1个6位的I/O口和1个14位的“减1”计数器。

8155有40个引脚,采用双列直插封装,总线型的8155引脚图如图3-2所示。

 

图3-2总线型8155引脚图

AD0~AD7:

三态地址/数据线,是低8位地址与数据复用线。

地址可以是8155片内RAM单元地址或I/O端口地址。

AD0~AD7上的地址由ALE的下降沿存到8155片内地址锁存器。

也就是由ALE信号来区别AD0~AD7上出现的地址信息还是数据信息。

ALE:

锁存允许信号。

在ALE信号的下降沿把ADO~AD7上的8位地址信息,

片选信号及IO/

信号都锁存到8155内部存储器中。

片选信号,低电平有效,由ALE信号的下降沿锁存到8155内部存储器。

读选通信号,低电平有效。

=0、

=0时,开启AD0~AD7的缓冲器,被选中的片内RAM单元或IO口的内容送到AD0~AD7上。

写选通信号。

低电平有效,当

都有效时,CPU输出到AD0~AD7上的信息送到8155片内RAM单元或I/O端口。

IO/

IO口/RAM选择。

0:

选内RAM;1:

选内IO口。

RES:

复位信号输入端,高电平有效。

复位后,3个I/O口均为输入方式。

PA0~PA7:

A口的I/O线,其输入、输出的流向可由程序控制。

PB0~PB7:

B口的I/O线,其输入、输出的流向可由程序控制。

PC0~PC5:

有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。

TIN:

定时器输入。

定时器输出。

 

4电路设计

总设计电路图如图4-1所示。

图4-1总设计电路图

如上图,8031的P0.0~P0.7分别与8155的AD0~AD7相连接,8155的PC口与PB口分别控制矩阵键盘的行与列,8031的P2.0口及P2.7口分别与8155的IO/

相连。

按照这种连线方式,8155的命令状态寄存器地址、A口地址、B口地址和C口地址分别是0X7FF0H、0X7FF1H、0X7FF2H和0X7FF3H。

在扫描键盘时,我们将8155的B口设置为输出口、C口设置为输入口,这样8155的命令状态寄存器地址赋值为0X02。

由图4-1可以看出,在矩阵键盘的行下面加了一排下拉电阻,因此我们采用的是将键盘电位拉高的扫描方式。

为了验证矩阵键盘扫描的正确性,我们在8031的P1口上加了一排发光二极管。

将键盘一次从左到右从上到下编号,可以从1编到32。

我们将发光二极管亮定义为“1”,灭定义为“0”。

因此根据发光二极管的亮灭,按照P1口由高位到低位的顺序排列,可以得到一个八位的二进制数,再将二进制数转化为十进制数。

我们定义:

当第一个键盘按下时,发光二极管显示“1”;当第二个键盘按下时,发光二极管显示“2”,以此类推。

5程序设计

在程序设计部分,我们采用模块化程序设计的方法,即将各功能模块化,编写成一段一段的子程序,最后在主程序中调用各子程序完成设计所需功能。

采用模块化程序设计的方法降低了程序复杂度,使程序设计、调试和维护等操作简单化。

首先,设计主程序,其流程图如图5-1所示。

在主程序一开始,我们要对各芯片初始化,例如:

给8031的P1口赋初值,使所有的发光二极管都熄灭;给8155的命令状态寄存器地址赋值,设置B口与C口的输入、输出方式等等。

接着,判断有无键盘按下,若有键盘按下,执行键盘扫描程序,并将返回值返回赋给8031的P1口;若没有键盘按下,则继续判断。

 

图5-1主程序流程图

键盘扫描时需要去抖动,键盘去抖动有两种方式,一种是软件去抖动,另一种是硬件去抖动,在这里我们采用软件去抖动的方式。

即在检测到有键盘按下时为了防止是抖动,需要在延迟一段时间后再检测是否有键盘按下。

因此,接下来要设计延时子程序,延时原理很简单,只要采用循环体进行即可。

由于程序很简单就不给程序流程图,延时子程序如下所示。

voiddelay(unsignedchart)

{

unsignedchari,j;

for(j=t;j>0;j--)

for(i=110;i>0;i--);

}

然后需要设计检测有无键盘按下子程序,在此程序中,先给8155的PB口赋值0XFF。

由于PC口上接有下拉电阻,因此都是低电平。

此时读回PC口上的电位值,若PC口的电位有变化,说明有键盘按下;若没有变化,说明没有键盘按下,继续检测。

此子程序的流程图如图5-2所示。

 

图5-2检测有无键盘按下子程序流程图

最后设计的就是键盘扫描程序。

先给PB口赋值0X01,检测PC口的值是否为零,若不为零,说明被按下的键盘在此列;若不为零,说明被按下的键盘不在此列,将PB左移一位继续检测。

知道被按下的键盘在哪一列之后,给PB口赋值0XFF,读回此时PC口的值,并将这个值与一个初值为0X01的变量a按位与,若此时的值为零,说明被按下的键盘不在这一行,将a左移一位,即到下一行去检测;若得到的值不为零,说明被按下的键盘就在这一行。

用键盘的行数乘以8再加上键盘的列数,则可以得到键盘的编号,将此编号返回。

最后是松手检测。

此段子程序的流程图如图5-3所示。

 

图5-3键盘扫描子程序流程图

6电路仿真

此次课程设计电路的仿真是基于Proteus的仿真。

Proteus软件是英国LabcenterElectronics公司出版的EDA工具软件。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

Proteus是世界上著名的EDA工具,鉴于其强大的功能及广泛的应用,我们选择了它作为此次课程设计电路的仿真工具。

仿真刚启动时,没有发光二极管亮,说明没有键盘按下,此时的仿真图如图6-1所示。

 

图6-1刚启动仿真时的仿真图

我们定义最上面的一行键盘是第零行,接下来一行是第一行,以此类推。

前面已经介绍过键盘的行数乘以8再加上键盘的列数,可以得到键盘的编号。

如果按下第零行第三列的键盘,即第三个键盘,发光二极管应该显示“3”,也就是最后一个和倒数第二个发光二极管亮。

此时的仿真图如图6-2所示。

 

图6-2按下第三个键盘时的仿真图

如果按下第二行第六列的键盘,即第二十二个键盘,发光二极管应该显示“22”,也就是第四、第六和第七个发光二极管亮。

此时的仿真图如图6-3所示。

 

图6-3按下第二十二个键盘时的仿真图

从仿真的结果看来,仿真的结果完全符合要求,能够正确识别键盘按键,完成了对非编码键盘的扫描及显示,并且有效的解决了抖动问题。

 

7心得体会

经过了这些天的课程设计我首先感觉到的是身心非常的疲惫,但我无怨无悔,因为当我查阅了大量的文献和参考资料后我发觉学到许多在课堂上和书本上所学不到的东西,是这些课外的知识使我更进一步地熟悉了一些芯片的结构以及掌握了各芯片的工作原理及其具体的使用方法,同时也使我也开拓了眼界对电子器件有了更进一步的了解和认识,对电子产品产生了浓厚的兴趣。

通过实践我增强了动手能力和操作能力,这对我以后进入社会参加工作是很有帮助的。

同时,经过这几天的努力,我对Proteus这款软件的使用也更加熟练,尤其是掌握了对总线的理解和使用。

Proteus是一款强大的软件,在以后的学习过程中,我将更加深入的去学习这款软件的使用方法和技巧。

另外通过这次课程设计,我对文档的编排也有了一定的掌握,这对于以后的毕业设计及工作需要都有很大的帮助,在完成课程设计的同时我也在复习一遍计算机控制技术这门课程,把以前很多没学懂的问题都学懂学透了。

所以课程设计是理论知识的升华。

整个课程设计过程中,由于理论知识的缺乏,课程设计还有很多不足之处,在以后的课程设计中,希望能有所改善。

 

附录程序清单

#include//头文件

#include//XBYTE宏定义

#defineCOMXBYTE[0x7FF0]//8155命令状态寄存器地址

#definePAXBYTE[0x7FF1]//8155的A口地址

#definePBXBYTE[0x7FF2]//8155的B口地址

#definePCXBYTE[0x7FF3]//8155的C口地址

intx,y,z,cord_h,cord_l;

voiddelay(unsignedchart)//延时

{

unsignedchari,j;

for(j=t;j>0;j--)

for(i=110;i>0;i--);

}

voidkey()//检测有无键盘按下

{

inta=1;

cord_h=0xff;

PB=cord_h;

cord_l=0;

while(!

cord_l&&a)

{

delay(10);

cord_l=PC;

if(cord_l)

a=0;

}

}

unsignedcharkeyscan()//扫描键盘并返回响应的键值

{

inta;

x=0;

y=0;

cord_h=0x01;

do

{

x++;

PB=cord_h;

cord_l=PC;

cord_h<<=1;

}while(!

cord_l);

a=0x01;

cord_h=0xff;

PB=cord_h;

cord_l=PC;

while(!

(cord_l&a))

{

a<<=1;

y++;

cord_l=PC;

}

z=x+y*8;

returnz;

while(PC);

delay(5);

while(PC);

}

voidmain()

{

COM=0x02;//8155的B口设置为输出口,C口设置为输入口

P1=0;

while

(1)

{

key();

P1=keyscan();

}

}

 

参考文献

[1]于海生.计算机控制技术.机械工业出版社,2010

[2]郑学坚,周斌.微型计算机原理与应用.清华大学出版社

[3]沈美明,温冬婵.IBM-PC汇编语言程序设计.清华大学出版社

[4]何立民.单片机应用系统设计.北京航空航天大学出版社

[5]姚燕南,薛钧义.微型计算机原理.西安电子科技大学出版社

[6]沙占友等.新编实用数字化测量技术.国防工业出版社

[7]宋春荣等.通用集成电路手册.山东科技出版社

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

当前位置:首页 > 高等教育 > 研究生入学考试

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

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