《非编码键盘的扫描程序设计.doc》由会员分享,可在线阅读,更多相关《非编码键盘的扫描程序设计.doc(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 TOC O 1-3 H Z U 摘 要 PAGEREF _TOC297482771 H 11设计方案21.1 设计任务21.2 设计方案22系统硬件设计32.1最小应用系统32.2 8155扩展电路42.3 矩阵键盘接口电路62.4 LCD1602接口电路62.5 主电路设计83系统软件设计83.1主程序设计93.2 延时程序设计93.3 键盘扫描子程序设计103.4 显示子程序设计114 系统调试及结果134.1 调试内容及问题解决134.2 运行结果及分析13小结15参考文献16附录17摘 要计算机控制技术是一门以电子技术、自动控制原理、计算机应用技术为基础,以计算机控制技术为核心,综合
2、可编程控制技术、单片机技术、计算机网络技术,从而实现生产技术精密化、生产设备信息化、生产过程自动化及机电控制系统最佳化专门学科。企业对具备较强计算机控制技术应用能力专门人才需求很大。本文在proteus7.5软件上利用8155芯片来扩展8031单片机I/O接口,在keil软件下采用C语言编程,生成.hex文件,可以仿真实现6*6矩阵键盘按键识别与消除按键抖动,将识别到按键更人性化在lcd1602液晶显示,主要由方案设计、硬件电路设计、系统软件设计与系统调试四部分组成。关键词:8031单片机 8155芯片 矩阵键盘 I/O口扩展 1602液晶非编码键盘扫描程序设计1设计方案1.1 设计任务通过8
3、155扩展8031微控制器I/O口组成66行列式键盘行列式键盘。设计非编码键盘扫描硬件系统,画出电路图;对键盘按键能够正确识别,去抖动;键盘扫描;撰写设计说明书。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所示。 80
4、31单片机6*6矩阵键盘 8155芯片复位电路LCD1602 晶振 图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还可工作于低功耗模式,可通过两种软件选择空闲与掉电模式。在空闲模
5、式下冻结CPU而RAM定时器、串行口与中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。本次设计采用80C31PDIP(40pin)封装形式,管脚图如图2-1所示。 图2-1 8031管脚图80c31单片机40根管脚,若要单片机正常工作必须满足:1. 电源线2根 Vcc:编程与正常操作时电源电压,接+5V。 Vss:地电平。 2. 晶振:2根 XTAL1:振荡器反相放大器输入。使用外部震荡器是必须接地。 XTAL2:振荡器反相放大器输出与内部时钟发生器输入。当使用外部振荡器时用于输入外部振荡信号。 所以可以得到单片机最小应用系统如图2-2所示。图2-2 80
6、31最小应用系统2.2 8155扩展电路8155芯片介绍关于Intel8155/8156:是一多功能可编程外围接口芯片, 40脚双列直插封装,有A口、B口、C口与定时器/计数器低8位以及定时器/计数器高8位五个端口,另外8155内部还有一个命令/状态寄存器,所以8155内部共有6各端口。对它们只需要使用即可实现编址,如表1-1所示。表1-1 8155端口地址编码AD7AD6AD5AD4AD3AD2AD1AD0对应端口000命令/状态寄存器001A口010B口011C口100定时器/计数器低8位101定时器/计数器高8位8155A口有输入与输出两种工作方式,B口也有输入与输出两种工作方式,而C口
7、有输入方式(ALT1),输出方式(ALT2),A口控制端口方式(ALT3)以及A口 与B口控制端口方式(ALT4)四种工作方式。这些端口工作方式是由8155内部命令寄存器(命令字)来控制。命令字除了规定端口工作方式还规定了定时器/计数器工作方式。命令字只能进行写操作。其格式如图2-3所示。图2-3 8155命令字结合8031与8155芯片结构与特点,可设计出如图2-4所示扩展电路。图2-4 8155扩展电路2.3 矩阵键盘接口电路编码键盘及单片机接口单片机系统所用键盘有编码键盘与非编码键盘两种。非编码键盘是由一些按键排列成一个行列矩阵。按键作用,只是简单地实现接点接通与断开,但必须有一套相应程
8、序及之配合,才能产生出相应键码。非编码键盘几乎不需要附加什么硬件电路,目前,在微型计算机控制系统中使用比较普遍。本次设计有一个6行6列非编码键盘,按行依次为1-36,键盘行线接8155C口六条线PB5PB0,键盘列线则接8155C口6条线,而且在C口接下拉电阻。如图2-5所示。图2-5 矩阵键盘接口电路2.4 LCD1602接口电路LCD1602字符型液晶显示模块是一种专门用于可以显示16列*2行显示字母、数字、符号等点阵式LCD, 16*2等模块。其管脚介绍如下: 第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高
9、,对比度过高时会产生“鬼影”,使用时可以通过一个10K电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS与R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。图2-6 LCD1602接口电路第15脚:背光源正极。第16脚:背光源负极。综合可设计液晶及8031单片机及8155芯片接口电路如图2-
10、6所示。2.5 主电路设计综上各子模块电路设计,可设计出主电路图如图2-7所示图2-7 主电路图3系统软件设计3.1主程序设计主程序主要包括三个部分:初始化程序,调用判断子程序与调用检测子程序,其中显示子程序被调用在检测子程序中。其流程图如图3-1所示。开始初始化调用判断子程序 有键闭合?Y N Y 调用检测子程序 结束图3-1 主程序流程图3.2 延时程序设计延时程序是采用双重for语句循环自减方法,将i赋值t,j赋值110运用循环重复t遍110自减到0。延时时间计算方法:振荡器频率为12MHz,一个振荡器周期为1/12微秒,一个机器周期为12/12=1微秒 计算机执行每步就需要1微秒,延时
11、时间就是执行步数*1微秒。子程序流程图如图3-2所示。开 始i赋初值tj赋初值110j自减一是否为零i 自减一是否为零NNY 结 束 图3-2 延时子程序流程图3.3 键盘扫描子程序设计设置8155PA、PB与PC口依次设为输出、输出与输入,这样在没有任何键按下时,所有键盘行线成高电平,列线上信号都是低电平。按键识别有各种方法,此系统只 “行扫描”法:(1)确定是否有按键按下。PB口输出111111到键盘行线,然后检测键盘列线信号。若没有键按下,则为00000。若有任一个按键按下,则有某一条列线为0,也就是当PB5PB0不为000000时,就表示有键按下。(2)通过“行扫描”确定已按键行、列位
12、置。所谓行扫描就是依次给每条行线输入1信号,而其余各行都输入0,并检测每次扫描时所对应列信号。并检测每次所对应C口输入。只有在某行上有键按下时,在这一行上输入1,在列输出上才能检测到1信号。若是输入为1这一行上没有按键按下,则收到列信号仍然全是0。因此,只要记下列信号不全为0时B口输出及C口输入,就能确定以按键位置。这样,通过行扫描,就可以确定按键行、列坐标。(3)消除键抖动。一般按键在按下时候有抖动问题,即键簧片在按下时会有轻微弹跳,需经过一个短暂时间才会可靠地接触。若在簧片抖动时进行扫描就可能得出不正确结果。因此,在程序中要考虑防抖动问题。最简单办法是在检测到有键按下时,等待(延迟)一段时
13、间再进行“行扫描”,延迟时间为1020ms,这可通过调用子程序来消除抖动。扫描子程序流程图如图3-3所示。开 始扫描键盘是否有按键?消除抖动是否有按键?读按键结 束 图3-3 扫描子程序流程图3.4 显示子程序设计1602液晶模块读写操作,屏幕与光标操作都是通过指令编程来实现。指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H指令3:光标与显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。指令4:显示开关控制。D:控制整体显示开及关,高电平表示开显示,低电平表示关显示。C:控制
14、光标开及关,高电平表示有光标,低电平表示无光标 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 系统调试及结果
15、4.1 调试内容及问题解决软件及硬将件连接,仿真运行时,发现液晶光标移动但是不显示初始化字符,经检查发现液晶控制线及单片机接线出现了错误,改正后可显示初始化字符。当按下按键时,发现液晶显示及按键不对应,不能正确显示按键,甚至有按键不能按下去没有反应,经检查是扫描子程序逻辑发生错误,出现死循环,修改后可正确运行。4.2 运行结果及分析仿真运行开始,初始化后液晶显示器上出现预设字符串“PLEASE ENTER”,如图4-1所示图4-1 初始化界面当按下第一行,第二列按键时,液晶上出现了行与列标号,别且计算出是2,如图4-2所示。图4-2 按键2显示当按下第4行,第3列时,液晶上也正确显示了按键位置
16、并且计算出为21,图4-3所示。图4-3 按键21显示依次按下每个键,并且检查液晶显示,发现36个按键都能正确识别显示,所以本设计合理、正确。小结在现代科学技术众多领域中,计算机控制技术起着越来越重要作用,因此做好微型计算机控制技术这门课程课程设计是非常有必要,从中可以讲课本中知识运用到实际运用中,也让我深刻体会到了实践艰巨性与挑战性,在一周课程设计中,我不断改进自己方法,通过查阅参书与网上资料,对于自己在知识上不足进行了非常好补充与完善,使得我在短短两个星期对于这门业课有了有了更切实理解,更深掌握,也学会了通过自己努力挑战未知领域!通过这次课设我才知道我们每个人潜能是远远超过我们想象,刚开始
17、拿到课设题目听说可以设计成几百行程序都有点恐惧,因为之前写汇编程序最多才几十行,用C语言写单片机程序最多也才写过几百行,但是通过查阅资料,一步一步来发现程序越写越长,写完才发现我们编程水平比我们想象要高,但是离社会需求还远。这次课设我对程序差错与调试也有很多新想法,虽然我编译器不能单步运行,但是我可以在程序中添加一些延时程序与输出“*”语句,这样就可以知道程序运行大致步骤,是否运行我们需要语句了。事实在我调试与查错时确起到了很大作用。最后,在排版美观方面,也有了较强意识。在撰写实验报告时候,格式要求非常严格,字体大小要求,段距,行距也都有统一要求,开始时候没有注意到这一点,后来发现了,需要全部
18、更改,工作量很大。改正后,看着自己美观排版,心中还是非常欣慰。参考文献1.李朝清.单片机原理及接口技术北京航天航空大学出版社.1994年2.何立民.单片机高级教程北京航天航空大学出版社.2000年3.杨光友,朱宏辉等单片机微型计算机原理及接口技术中国水利水电出版社.2002年 4. 于海生. 计算机控制技术. 机械工业出版社,20105. 郑学坚,周斌. 微型计算机原理及应用. 清华大学出版社6 何立民. 单片机应用系统设计. 北京航空航天大学出版社7. 姚燕南,薛钧义. 微型计算机原理. 西安电子科技大学出版社8. 沙占友等. 新编实用数字化测量技术. 国防工业出版社9. 宋春荣等. 通用集
19、成电路手册. 山东科技出版社附录#include /头文件#include /XBYTE 宏定义#include#include#define uchar unsigned char #define uint unsigned int#define ulong unsigned long#define com XBYTE0x7FF0 /8155命令状态寄存器地址#define pa XBYTE0x7FF1 /8155A口地址#define pb XBYTE0x7FF2 /8155B口地址#define pc XBYTE0x7FF3 /8155C口地址sbit lcdrs=P30;sbit lc
20、den=P32;sbit lcdrw=P31;uchar table1=HANG ;uchar table2= LIE ;uchar table3=WE GET ;uchar table4=PLEASE ENTER ;int x,y,z,hang,lie;void delay(uchar t);void wcom(uint co);void wdate(uchar date);void wdate1(ulong date);void panduan();void jiance();void xianshi();void wcom(uint co)/液晶写控制字子程序 lcdrs=0; pa=c
21、o; delay(2); lcden=1; delay(2); lcden=0;void wdate(uchar date)/液晶显示单字符子程序 lcdrs=1; pa=date; delay(2); lcden=1; delay(2); lcden=0;void wdate1(ulong date)/液晶显示多字符子程序 uchar m; wcom(0x80+0x40+9); wcom(0x04); wcom(0x0C); if(date) while(date) m=date%10; wdate(0x30+m);date/=10;void xianshi()/显示按键子程序 uchar
22、m; wcom(0x01); wcom(0x80); wcom(0x0c); for(m=0;m5;m+) wdate(table1m); delay(2); wdate(0x30+x+1); for(m=0;m5;m+) wdate(table2m); delay(2); wdate(0x30+y); wcom(0x80+0X40); for(m=0;m8;m+) wdate(table3m); delay(2); wdate1(z);void panduan()/判断是否有键按下子程序 int flag=1;hang=0xff;pb=hang;lie=0;while(!lie&flag)d
23、elay(10);lie=pc;if(lie)flag=0;void jiance()/检测按键子程序 int aa;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);void init()/初始化子程序 int m; 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;m0;j-) for(i=110;i0;i-);void main() /主程序 init(); while(1) panduan(); jiance();第 13 页
限制150内