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

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

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

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

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

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

 

摘要

计算机控制技术是一门以电子技术、自动控制原理、计算机应用技术为基础,以计算机控制技术为核心,综合可编程控制技术、单片机技术、计算机网络技术,从而实现生产技术精密化、生产设备信息化、生产过程自动化及机电控制系统最佳化专门学科。

企业对具备较强计算机控制技术应用能力专门人才需求很大。

本文在proteus7.5软件上利用8155芯片来扩展8031单片机I/O接口,在keil软件下采用C语言编程,生成.hex文件,可以仿真实现6*6矩阵键盘按键识别和消除按键抖动,将识别到按键更人性化在lcd1602液晶显示,主要由方案设计、硬件电路设计、系统软件设计和系统调试四部分组成。

关键词:

8031单片机8155芯片矩阵键盘I/O口扩展1602液晶

非编码键盘扫描程序设计

1设计方案

1.1设计任务

通过8155扩展8031微控制器I/O口组成6×6行列式键盘行列式键盘。

设计非编码键盘扫描硬件系统,画出电路图;对键盘按键能够正确识别,去抖动;键盘扫描;撰写设计说明书。

1.2设计方案

首先,将用8155芯片扩展8031单片机I/O口,然后需要检测6*6矩阵键盘12根导线可分别接在8155PB0-PB6和PC口,LCD16028根数据线可接在8155PA0口,控制线接在单片机P2.0-P2.3,由于8155是可编程芯片,所以将PA、PB和PC口依次设为输出、输出和输入,通过编写键盘扫描程序来识别按键并返回按键值,最后判断将识别到按键值形象显示在LCD1602液晶上。

主电路结构框图如图1-1所示。

 

 

图1-1系统结构图

2系统硬件设计

2.1最小应用系统

80C31单片机,它是8位高性能单片机。

属于标准MCS-51HCMOS产品。

它结合了HMOS高速和高密度技术及CHMOS低功耗特征,标准MCS-51单片机体系结构和指令系统。

80C31内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

但80C31片内并无程序存储器,需外接ROM。

此外,80C31还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。

在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。

掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。

本次设计采用80C31PDIP(40pin)封装形式,管脚图如图2-1所示。

 

 

图2-18031管脚图

80c31单片机40根管脚,若要单片机正常工作必须满足:

  1.电源线2根

  Vcc:

编程和正常操作时电源电压,接+5V。

  Vss:

地电平。

  2.晶振:

2根

  XTAL1:

振荡器反相放大器输入。

使用外部震荡器是必须接地。

XTAL2:

振荡器反相放大器输出和内部时钟发生器输入。

当使用外部振荡器时用于输入外部振荡信号。

所以可以得到单片机最小应用系统如图2-2所示。

图2-28031最小应用系统

2.28155扩展电路

8155芯片介绍关于Intel8155/8156:

是一多功能可编程外围接口芯片,40脚双列直插封装,有A口、B口、C口和定时器/计数器低8位以及定时器/计数器高8位五个端口,另外8155内部还有一个命令/状态寄存器,所以8155内部共有6各端口。

对它们只需要使用 

 即可实现编址,如表1-1所示。

表1-1  8155端口地址编码

AD7

AD6

AD5

AD4

AD3

AD2

AD1

AD0

对应端口

×

×

×

×

×

0

0

0

命令/状态寄存器

×

×

×

×

×

0

0

1

A口

×

×

×

×

×

0

1

0

B口

×

×

×

×

×

0

1

1

C口

×

×

×

×

×

1

0

0

定时器/计数器低8位

×

×

×

×

×

1

0

1

定时器/计数器高8位

8155A口有输入和输出两种工作方式,B口也有输入和输出两种工作方式,而C口有输入方式(ALT1),输出方式(ALT2),A口控制端口方式(ALT3)以及A口和B口控制端口方式(ALT4)四种工作方式。

这些端口工作方式是由8155内部命令寄存器(命令字)来控制。

命令字除了规定端口工作方式还规定了定时器/计数器工作方式。

命令字只能进行写操作。

其格式如图2-3所示。

图2-38155命令字

结合8031和8155芯片结构和特点,可设计出如图2-4所示扩展电路。

图2-48155扩展电路

2.3矩阵键盘接口电路

编码键盘及单片机接口单片机系统所用键盘有编码键盘和非编码键盘两种。

非编码键盘是由一些按键排列成一个行列矩阵。

按键作用,只是简单地实现接点接通和断开,但必须有一套相应程序及之配合,才能产生出相应键码。

非编码键盘几乎不需要附加什么硬件电路,目前,在微型计算机控制系统中使用比较普遍。

本次设计有一个6行×6列非编码键盘,按行依次为1-36,键盘行线接8155C口六条线PB5~PB0,键盘列线则接8155C口6条线,而且在C口接下拉电阻。

如图2-5所示。

图2-5矩阵键盘接口电路

2.4LCD1602接口电路

LCD1602字符型液晶显示模块是一种专门用于可以显示16列*2行显示字母、数字、符号等点阵式LCD,16*2等模块。

其管脚介绍如下:

第1脚:

VSS为地电源。

第2脚:

VDD接5V正电源。

第3脚:

VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

图2-6LCD1602接口电路

第15脚:

背光源正极。

第16脚:

背光源负极。

综合可设计液晶及8031单片机及8155芯片接口电路如图2-6所示。

2.5主电路设计

综上各子模块电路设计,可设计出主电路图如图2-7所示

图2-7主电路图

3系统软件设计

3.1主程序设计

主程序主要包括三个部分:

初始化程序,调用判断子程序和调用检测子程序,其中显示子程序被调用在检测子程序中。

其流程图如图3-1所示。

YN

Y

图3-1主程序流程图

3.2延时程序设计

延时程序是采用双重for语句循环自减方法,将i赋值t,j赋值110运用循环重复t遍110自减到0。

延时时间计算方法:

振荡器频率为12MHz,一个振荡器周期为1/12微秒,一个机器周期为12/12=1微秒计算机执行每步就需要1微秒,延时时间就是执行步数*1微秒。

子程序流程图如图3-2所示。

 

图3-2延时子程序流程图

3.3键盘扫描子程序设计

设置8155PA、PB和PC口依次设为输出、输出和输入,这样在没有任何键按下时,所有键盘行线成高电平,列线上信号都是低电平。

按键识别有各种方法,此系统只“行扫描”法:

(1)确定是否有按键按下。

PB口输出111111到键盘行线,然后检测键盘列线信号。

若没有键按下,则为00000。

若有任一个按键按下,则有某一条列线为0,也就是当PB5~PB0不为000000时,就表示有键按下。

(2)通过“行扫描”确定已按键行、列位置。

所谓行扫描就是依次给每条行线输入1信号,而其余各行都输入0,并检测每次扫描时所对应列信号。

并检测每次所对应C口输入。

只有在某行上有键按下时,在这一行上输入1,在列输出上才能检测到1信号。

若是输入为1这一行上没有按键按下,则收到列信号仍然全是0。

因此,只要记下列信号不全为0时B口输出及C口输入,就能确定以按键位置。

这样,通过行扫描,就可以确定按键行、列坐标。

(3)消除键抖动。

一般按键在按下时候有抖动问题,即键簧片在按下时会有轻微弹跳,需经过一个短暂时间才会可靠地接触。

若在簧片抖动时进行扫描就可能得出不正确结果。

因此,在程序中要考虑防抖动问题。

最简单办法是在检测到有键按下时,等待(延迟)一段时间再进行“行扫描”,延迟时间为10~20ms,这可通过调用子程序来消除抖动。

扫描子程序流程图如图3-3所示。

 

图3-3扫描子程序流程图

3.4显示子程序设计

1602液晶模块读写操作,屏幕和光标操作都是通过指令编程来实现。

指令1:

清显示,指令码01H,光标复位到地址00H位置。

指令2:

光标复位,光标返回到地址00H

指令3:

光标和显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:

屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。

指令4:

显示开关控制。

D:

控制整体显示开及关,高电平表示开显示,低电平表示关显示。

C:

控制光标开及关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时显示移动文字,低电平时移动光标

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时为双行显示,F:

低电平时显示5X7点阵字符,高电平时显示5X10显示字符。

指令7:

字符发生器RAM地址设置。

指令8:

DDRAM地址设置。

指令9:

读忙信号和光标地址BF:

忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙。

读写操作时序如图3-4、3-5所示

              图3-4读时序图

图3-5读时序图

4系统调试及结果

4.1调试内容及问题解决

软件及硬将件连接,仿真运行时,发现液晶光标移动但是不显示初始化字符,经检查发现液晶控制线及单片机接线出现了错误,改正后可显示初始化字符。

当按下按键时,发现液晶显示及按键不对应,不能正确显示按键,甚至有按键不能按下去没有反应,经检查是扫描子程序逻辑发生错误,出现死循环,修改后可正确运行。

4.2运行结果及分析

仿真运行开始,初始化后液晶显示器上出现预设字符串“PLEASEENTER”,如图4-1所示

图4-1初始化界面

当按下第一行,第二列按键时,液晶上出现了行和列标号,别且计算出是2,如图4-2所示。

图4-2按键2显示

当按下第4行,第3列时,液晶上也正确显示了按键位置并且计算出为21,图4-3所示。

图4-3按键21显示

依次按下每个键,并且检查液晶显示,发现36个按键都能正确识别显示,所以本设计合理、正确。

小结

在现代科学技术众多领域中,计算机控制技术起着越来越重要作用,因此做好《微型计算机控制技术》这门课程课程设计是非常有必要,从中可以讲课本中知识运用到实际运用中,也让我深刻体会到了实践艰巨性和挑战性,在一周课程设计中,我不断改进自己方法,通过查阅参书和网上资料,对于自己在知识上不足进行了非常好补充和完善,使得我在短短两个星期对于这门业课有了有了更切实理解,更深掌握,也学会了通过自己努力挑战未知领域!

通过这次课设我才知道我们每个人潜能是远远超过我们想象,刚开始拿到课设题目听说可以设计成几百行程序都有点恐惧,因为之前写汇编程序最多才几十行,用C语言写单片机程序最多也才写过几百行,但是通过查阅资料,一步一步来发现程序越写越长,写完才发现我们编程水平比我们想象要高,但是离社会需求还远。

这次课设我对程序差错和调试也有很多新想法,虽然我编译器不能单步运行,但是我可以在程序中添加一些延时程序和输出“*”语句,这样就可以知道程序运行大致步骤,是否运行我们需要语句了。

事实在我调试和查错时确起到了很大作用。

最后,在排版美观方面,也有了较强意识。

在撰写实验报告时候,格式要求非常严格,字体大小要求,段距,行距也都有统一要求,开始时候没有注意到这一点,后来发现了,需要全部更改,工作量很大。

改正后,看着自己美观排版,心中还是非常欣慰。

参考文献

1.李朝清.《单片机原理及接口技术》北京航天航空大学出版社.1994年

2.何立民.《单片机高级教程》北京航天航空大学出版社.2000年

3.杨光友,朱宏辉等《单片机微型计算机原理及接口技术》中国水利水电出版社.2002年

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

5.郑学坚,周斌.微型计算机原理及应用.清华大学出版社

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

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

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

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

附录

#include//头文件

#include//XBYTE宏定义

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlong

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

#definepaXBYTE[0x7FF1]//8155A口地址

#definepbXBYTE[0x7FF2]//8155B口地址

#definepcXBYTE[0x7FF3]//8155C口地址

sbitlcdrs=P3^0;

sbitlcden=P3^2;

sbitlcdrw=P3^1;

uchartable1[]="HANG";

uchartable2[]="LIE";

uchartable3[]="WEGET";

uchartable4[]="PLEASEENTER";

intx,y,z,hang,lie;

voiddelay(uchart);

voidwcom(uintco);

voidwdate(uchardate);

voidwdate1(ulongdate);

voidpanduan();

voidjiance();

voidxianshi();

voidwcom(uintco){//液晶写控制字子程序

lcdrs=0;

pa=co;

delay

(2);

lcden=1;

delay

(2);

lcden=0;

}

voidwdate(uchardate){//液晶显示单字符子程序

lcdrs=1;

pa=date;

delay

(2);

lcden=1;

delay

(2);

lcden=0;

}

voidwdate1(ulongdate){//液晶显示多字符子程序

ucharm;

wcom(0x80+0x40+9);

wcom(0x04);

wcom(0x0C);

if(date){

while(date){

m=date%10;

wdate(0x30+m);

date/=10;

}

}

}

voidxianshi(){//显示按键子程序

ucharm;

wcom(0x01);

wcom(0x80);

wcom(0x0c);

for(m=0;m<5;m++){

wdate(table1[m]);

delay

(2);

}

wdate(0x30+x+1);

for(m=0;m<5;m++){

wdate(table2[m]);

delay

(2);

}

wdate(0x30+y);

wcom(0x80+0X40);

for(m=0;m<8;m++){

wdate(table3[m]);

delay

(2);

}

wdate1(z);

}

voidpanduan(){//判断是否有键按下子程序

intflag=1;

hang=0xff;

pb=hang;

lie=0;

while(!

lie&&flag){

delay(10);

lie=pc;

if(lie)flag=0;

}

}

voidjiance(){//检测按键子程序

intaa;

x=-1;

y=1;

hang=0x01;

do{

x++;

pb=hang;

lie=pc;

hang*=2;

}while(!

lie);

aa=0x01;

hang=0xff;

pb=hang;

lie=pc;

while(!

(lie&aa)){

aa*=2;

y++;

lie=pc;

}

z=x*6+y;

xianshi();

while(pc);

delay(5);

while(pc);

}

voidinit(){//初始化子程序

intm;

pa=0;

pb=0;

pc=0;

lcdrs=lcdrw=lcden=0;

com=0x03;//

wcom(0x38);

wcom(0x0f);

wcom(0x06);

wcom(0x01);

wcom(0x80);

for(m=0;m<12;m++){

wdate(table4[m]);

delay

(2);

}

}

voiddelay(uchart){//延时tms子程序

uinti,j;

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

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

}

voidmain(){//主程序

init();

while

(1){

panduan();

jiance();

}

}

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

当前位置:首页 > 人文社科 > 法律资料

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

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