单片机课程设计4X4矩阵键盘显示.docx

上传人:b****8 文档编号:9495967 上传时间:2023-05-19 格式:DOCX 页数:21 大小:86.38KB
下载 相关 举报
单片机课程设计4X4矩阵键盘显示.docx_第1页
第1页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第2页
第2页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第3页
第3页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第4页
第4页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第5页
第5页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第6页
第6页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第7页
第7页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第8页
第8页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第9页
第9页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第10页
第10页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第11页
第11页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第12页
第12页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第13页
第13页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第14页
第14页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第15页
第15页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第16页
第16页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第17页
第17页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第18页
第18页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第19页
第19页 / 共21页
单片机课程设计4X4矩阵键盘显示.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机课程设计4X4矩阵键盘显示.docx

《单片机课程设计4X4矩阵键盘显示.docx》由会员分享,可在线阅读,更多相关《单片机课程设计4X4矩阵键盘显示.docx(21页珍藏版)》请在冰点文库上搜索。

单片机课程设计4X4矩阵键盘显示.docx

单片机课程设计4X4矩阵键盘显示

 

长沙学院

 

《单片机原理及应用》

课程设计说明书

题目

液晶显示4*4矩阵键盘按键号程序设计

系(部)

电子与通信工程系

专业(班级)

电气1班

姓名

龙程

学号

2011024109

指导教师

刘辉、谢明华、王新辉、马凌云

起止日期

2014.5.19—2014.5.30

 

长沙学院课程设计鉴定表

姓名

龙程

学号

2011024109

专业

电子信息工程

班级

01

设计题目

液晶显示4*4矩阵键盘按键号程序设计

指导教师

刘辉、谢明华、王新辉

指导教师意见:

 

评定成绩:

教师签名:

日期:

答辩小组意见:

 

评定成绩:

     答辩小组长签名:

     日期:

    

教研室意见:

 

最终评定等级:

     教研室主任签名:

     日期:

    

说明

课程设计成绩分“优秀”、“良好”、“中等”、“及格”、“不及格”五等。

《单片机技术及应用》课程设计任务书

系(部):

电子与电气工程系专业:

11级电子一班指导教师:

谢明华、刘辉

课题名称

液晶显示4*4矩阵键盘按键号程序设计

设计内容及要求

(1)课题内容:

设计一个基于单片机的液晶显示4*4矩阵键盘按键号程序

功能要求:

用AT89S52单片机并行口P1接4*4矩阵键盘,以P1.0、P1.3作输入线;以P1.4、P1.7作输出线,按下任意键,都会在在LCD12864的第一行上显示每个按键的0-F序号,同时12864的第二行显示本行姓名、班级,第三行显示本人学号。

(2)要求:

完成该系统的硬件和软件的设计,在proteus软件上仿真通过,提交一份课程设计说明书。

计工作量

1、汇编或C51语言程序设计;

2、程序调试,在Proteus上进行仿真;

3、提交一份完整的课程设计说明书,包括封面,中文摘要,目录,正文(正文主要包括:

设计原理、程序设计、程序分析、仿真分析、调试过程,调试结果等部分),参考文献、设计总结等。

进度安排

起止日期(或时间量)

设计内容(或预期目标)

备注

第一天

课题介绍,答疑,收集材料,C51介绍

第二天

设计方案论证,练习编写C51程序

第三天~第六天

程序设计

第六天~第八天

程序调试、仿真

第九天~第十天

系统测试并编写设计说明书

教研室

意见

 

年月日

系(部)主管领导意见

 

年月日

 

前言

单片机,全称单片微型计算机(英语:

Single-ChipMicrocomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。

与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。

它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。

由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。

现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。

手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。

汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作!

单片机的数量不仅远超过PC机和其他计算机的总和,甚至比人类的数量还要多。

液晶显示器(英语:

LiquidCrystalDisplay,缩写:

LCD)为平面薄型的显示设备。

它的主要原理是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。

由一定数量的彩色或黑白像素组成,放置于光源或者反射面前方。

液晶显示器功耗低,因此倍受工程师青睐,适用于使用电池的电子设备。

英国科学家在上世纪制造了第一块液晶显示器即LCD。

而第一台可操作的LCD基于动态散射模式(DynamicScatteringMode,DSM),是RCA公司乔治·海尔曼带领的小组开发的。

LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。

LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组.。

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。

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

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

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

 

一、课程设计目的

设计一个基于单片机的4*4矩阵键盘设计,用AT89S52单片机并行口P1接4*4矩阵键盘,以P1.0、P1.3作为输入线,以P1.4、P1.7作为输出线,在LCD12864上的第一行显示每个按键的0—F序号,同时12864的第二行显示本人姓名、班级,第三行显示本人学号。

主要内容如下:

1.矩阵式键盘的特点,进行键盘控制系统的整体研究与设计;

2.ED实时显示按键信息;

3.软件编程的方法实现按键信息的提取和显示。

二、设计内容及原理

2.1单片机控制系统原理

 

2.2阵键盘识别显示系统概述

矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。

显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。

并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。

矩阵式键盘简介:

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

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

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

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

最常见的键盘布局如图1-1所示。

一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。

图1键盘布局

2.3键盘电路

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

实际电路图连接如图2所示。

图2矩阵式键盘电路

2.412864显示器

12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。

每个显示点对应一位二进制数,1表示亮,0表示灭。

存储这些点阵信息的RAM称为显示数据存储器。

要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。

图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。

由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8bits显示数据RAM。

左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。

显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。

512*8bitsRAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。

每个存储单元存储8个液晶点的显示信息。

为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。

每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。

(注意:

二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。

即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。

因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。

例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。

2.5整体电路图

图3液晶显示4*4矩阵键盘按键号整体电路

2.6仿真结果

以下是通过preteus仿真后得到的部分结果截图

图4仿真结果图

三、实验心得与体会

通过为期两周的单片机课程设计,不仅加深了对单片机理论知识的理解,而且锻炼了我们的动手能力以及创新精神,让我意思到理论和实践结合的重要性。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

而且要对自己有耐心和信心,这样就可以从中找到问题,并且解决问题。

把理论知识和实际设计的结合锻炼了我的综合运用所学专业知识的能力,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使得我的能力得到了锻炼,实战经验得到丰富。

这次课程设计让我学到许多课堂学不到的东西,独立思考解决问题的能力,出现差错时及时应变的能力,而且通过和同学的交流和合作,增强了团队精神,给了大家一起学习,一起享受学习的机会,让大家都受益匪浅,为以后不管遇到什么问题都能很好的处理打下了良好的基础。

本次设计也运用到了proteus以及KEIL软件,通过实际的操作和不断地学习,加深了对这两个软件的了解,也学到了许多更加复杂的操作和用法,虽然全英文的界面对我这样英语不太好的人来说是挺麻烦的,但是只要肯努力,终究还是能够学好的。

这次设计过程中。

遇到了许多困难,也很感谢老师和同学的悉心帮助,使得我能顺利完成这次课程设计。

四、实验程序

#include

#include

sbitE=P3^0;

sbitRW=P3^1;

sbitDI=P3^2;

sbitCS2=P3^3;

sbitCS1=P3^4;

#defineucharunsignedchar

unsignedcharcons,cont;

ucharcode

 

l[]=

{0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x10,0x11,0x16,0xD0,0x10,0x10,

0x00,0x80,0x40,0x20,0x18,0x06,0x41,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x40,0x78},

c[]=

{0x00,0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0x3E,0x22,0x22,0x22,0x22,0x22,0x3E,0x00,

0x00,0x08,0x06,0x01,0xFF,0x01,0x06,0x40,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x41},

dian[]=

{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,

0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},

qi[]=

{0x20,0x10,0x4C,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x04,0x04,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00},

ban[]=

{0x84,0x84,0xFC,0x84,0x84,0x00,0xF8,0x00,0xFF,0x00,0x84,0x84,0xFC,0x84,0x84,0x00,

0x10,0x30,0x1F,0x08,0x88,0x42,0x21,0x18,0x07,0x00,0x20,0x20,0x3F,0x20,0x20,0x00};

ucharcodeshuzi[16][32]={{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",0*/

{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",1*/

{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",2*/

{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",3*/

{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",4*/

{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",5*/

{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",6*/

{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",7*/

{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",8*/

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",9*/

{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",0*/

{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",1*/

{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",2*/

{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",3*/

{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",4*/

{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};/*"f",5*/

unsignedchari;

delay()

{

unsignedchari;

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

}

voidkeycan(void)

{

for(i=0;i<4;i++)

switch(i)

{

case0:

P2=0x7f;

delay();

switch(P2|0xf0)

{

case0xfe:

cont=0;break;

case0xfd:

cont=1;break;

case0xfb:

cont=2;break;

case0xf7:

cont=3;break;

default:

break;

}

case1:

P2=0xbf;

delay();

switch(P2|0xf0)

{

case0xfe:

cont=4;break;

case0xfd:

cont=5;break;

case0xfb:

cont=6;break;

case0xf7:

cont=7;break;

default:

break;

}

case2:

P2=0xdf;

delay();

switch(P2|0xf0)

{

case0xfe:

cont=8;break;

case0xfd:

cont=9;break;

case0xfb:

cont=10;break;

case0xf7:

cont=11;break;

default:

break;

}

case3:

P2=0xef;

delay();

switch(P2|0xf0)

{

case0xfe:

cont=12;break;

case0xfd:

cont=13;break;

case0xfb:

cont=14;break;

case0xf7:

cont=15;break;

default:

break;

}

default:

break;

}

}

voidreadbusy(void)/*判断最高位是否为1,为0才读写数据*/

{

P0=0x00;

cons=P0;

DI=0;

RW=1;

E=1;

while(cons&0x80);

E=0;

}

voidSelect(uchari)

{

switch(i)

{

case0:

CS1=0;CS2=0;break;

case1:

CS1=0;CS2=1;break;

case2:

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2