1、滁州学院本科学年设计 学 年 设 计 报 告 设计题目 基于 AT89S52单片机实现 128*64液晶屏显示 作者姓名 所学专业 网络工程 指导教师 2010年 9 月 12 日 滁州学院本科学年设计 学年设计任务书 学年设计题目 基于 AT89S52单片机实现 128*64液晶屏显示 组长 学号 班级 2班 组别 第二组 专业 网络工程 组员 指导教师 学年设计目的 学习并掌握基于 C语言的单片机编程原理 学年设计所需环境 Microsoft Windows XP、 Proteus软件 学年设计任务要求 实现基于单片机对于 128*64液晶屏的控制,以及文字显示 学年设计工作进度计划 序号
2、 起止日期 工 作 内 容 分工情况 1 2010-7-2 2010-7-5 商讨问题的解决路径和初步实施方案。 本小组组员根据个 人所学情况,对问题认真分析,想出自己特色的实施方案,为下次会议的方案选择做准备 2 2010-7-6 2010-9-5 暑期时间个成员在家对课程设计进行分析。 小组人员对课程设计进行具体的分析 3 2010-9-5 2010-12 对个人工作进行分析并对最后的进行检验 小组成员对最后程序进行研究、检验并发表自己的见解 4 2010-9-12 对已经完成的实验在实验室中老师进行知道分析 小组成员根据老师的指导,进行实验报告的完成。 教研室审核意见: 教研室主任签字
3、: 年 月 日 滁州学院本科学年设计 目 录 1 绪论 .1 1.1 研究背景 .1 1.2 主要工作 .1 1.3 本文结构 .1 2 硬件的设计 .1 2.1 要求 .1 2.2 电路的设计 .2 2.2.1 平台搭建 .2 2.2.2 模块设计 .2 2.3 单片机 的选择 .2 2.4 LCD 模块的结构 .3 2.4.1 模块接口引脚 .3 3 软件设计 .5 3.1 字符的显示 .5 3.2 显示模块函数的设计 .6 3.2.1 LCD 底层接口驱动程序 .6 3.2.2 用户接口驱动程序 .6 4. 系统测试与调试 .7 5.致谢 .8 6.学年设计总结与体会 .8 7.结束语
4、.8 1 基于 AT89S52单片机实现 128*64液晶屏显示 摘要 :本文介绍以 AT89S52单片机为控制核心,利用四位按键输入,以 128*64液晶作为屏幕的显示模块。该模块硬件结构结单、功能齐全,工作稳定,可完成目前绝大部分设备的显示。 关键词 : AT89S52单片机;液晶;中文显示 1 绪论 1.1 研究背景 液晶是现在电子产品中使用越来越多的一种显示器件。我们经常会在各种各样的电子产品和仪器上 看到液晶显示器的存在。这些液晶品种繁多,功能不一。有的是字符型, 有的是点阵型。常常用来显示各种参数。包括电压、电流、温度及各种电气参数和一些特定信息。液晶不但用来显示各种文字还可以被设
5、计成各种图案、通过改变里面特定显示 RAM的内容。还还可以动态的显示各种图案及画面。液晶的使用打破了以往单一的声光显示功能,为人们提供了更多丰富多彩的显示信息。 许多学校研究了 基于 128 64点阵液晶显示的智能温度控 制器的设计与实现及相关研究。本次设计就是 基于 AT89S52单片机实现 128*64液晶屏 显示 。 1.2 主要工作 首先 是每个成员通过看书和上网找资料以便对 AT89S52单片机有所了解,然后 再 开始进行设计。在用 AT89S52单片机实现 128*64液晶屏菜单显示时主要用的方法是 C语言单片机原理, 及 数字逻辑的 相 关知识。 进行实验时 先进行平台搭建,之后
6、在电脑上先仿真设计,成功后再实际进行电路的连接。 1.3 本文结构 本文的第一部分主要是对题目和该实现目标的分析,以及本文的主要大意,第二部分是对设计步骤的描述和有关的需求分 析,第三部分则是对该程序的详细设计。该系统在认真分析可行性的基础上,提出了功能模块的构想,通过各个功能模块的有机结合,在单片机的有效调用下,实现 128*64液晶屏的显示。 2 硬件的设计 2.1 要求 深入理解液晶屏显示原理及字符显示原理实现基于 AT89S52的单片机对于 128*64液晶屏的控制,实现中文显示。 2 2.2 电路的设计 2.2.1 平台搭建 整个设计首先是在 protues软件中进行硬件的搭建及仿真
7、的。因为通过 protues软件能仿真模拟电路、数字电路、数模混合电路;能绘制原理图、 PCB图;几乎包括实际 中所有使用的仪器等。而其最大的 优点 在还是 于能够对单片机进行实物级的仿真,可自行设计电路从程序的编写,编译到调试,目标版的仿真一应俱全。支持汇编语言和 C语言的编程。还可配合 Keil C实现程序的联合调试,将 Proteus中绘制的原理图作为实际中的目标板,而用 Keil C集成环境实现对目标板的控制,与实际中通过硬件仿真器对目标板的调试几乎完全相同,并且支持多显示器的调试,即 Proteus运行在一台计算机上,而 Keil C运行在另一台计算机上,通过网络连接实现远程的调试。
8、因此,本次设计选择在 protues软件中进 行仿真设计。 2.2.2 模块设计 整个设计的核心部件是 AT89S52单片机、 128*64的液晶屏及周边的晶振和按键等原件。 2.3 单片机的选择 本设计选用 AT89S52系列单片机是因为其管脚排列如 图 1。 AT89S52,8位单片机是 MSC-51系列产品的升级版,有世界著名半导体公司 ATMEL在购买 MSC-51设计结构后,利用自身优势技术(掉电不丢数据)闪存生产技术对旧技术进行改进和扩展,同时使用新的半导体生产工艺,最终得到成型产品。与此同时,世界上其他的著名公司也通过基本的 51内核,结合公司自身技术进行改进 生产 1。 AT8
9、9S52片内集成 256字节程序运行空间、 8K字节 Flash存储空间,支持最大 64K外部存储扩展。根据不同的运行速度和功耗的要求,时钟频率可以设置在 0-33M之间。片内资源有 4组 I/O控制端口、 3个定时器、 8个中断、软件设置低能耗模式和断电保护。可以在 4V到 5.5V宽电压范围内正常工作。不断发展的半导体工艺也让该单片机的功耗不断降低。同时,该单片机支持计算机并口下载,简单的数字芯片就可以制成下载线,仅仅几块钱的价格让该型号单片机畅销 10年不衰。根据不同场合的要求,这款单片机提供了多种封装, 本次设计根据最小系统有时需要更换单片机的具体情况,使用双列直插 DIP-40的封装
10、。 3 图 1 AT89S52引脚排列图 2.4 LCD 模块的结构 通常所见的 LCD 模块分为: LCM(玻璃)、背光、 PCB 板;而背光和 PCB板部分其实是可有可无的,视具体的 LCD 模块而定。点阵的 LCD 模块按照驱动控制器的集成方式,大可分为两种: COB 和 COG.。 MzL02-12864 为一块 128*64 点阵的 LCD 显示模块,模块上的 LCM 采用 COG 技术将控制(包括显存)、驱动器集成在 LCM 的玻璃上, 2接口简单、操作方便;为方便用户的使用,在 LCM 的基础上设计了 MzL02-12864 模块,将模块所必需的外围电容电阻集成到模块上,并引出多
11、种形式的引线接口方便用户使用。 MzL02-12864 模块与各种 MCU 均可进行方便简单的接口操作。 2.4.1 模块接口引脚 图 2.1 LCD接口引脚 4 其 具体功能如下 表 2.1 2.5连接方式 在实际应用中,液晶模块与单片机的连接方式很 多,从占用 I/O口线的多少来分有串行方式和并行方式,其中串行方式速度较慢,占用的口较少,并行方式分为 4线和 8线,速度较快,占用的 I/O口多,实际应用中以并行方式居多。 LCD12864的管脚共有 20个之多,但是连接的电路并不复杂。但是需要注意的是 LCD的电源共有 2组,一组是用于驱动 LCD显示,另一组用于背光显示。可将这两组连再一
12、起或者背光电源省略。 3另外有个输入管脚 V0需要接入 LCD调整电压来调节对比度。通常刚使用液晶时的问题是由此引起的,对比度过高于或过低均会使屏幕无法正常显示。它可接至 10K-20K电位器的调整端,电位器两端分别接至 VDD与 VEE。目前市场上某些 LCD12864的对比度可由单片机操作其寄存器调节,可根据不同的条件进行选择。其余的端口均连接至单片机。本文将 IO口DB0-DB7连接至 P2口, RS、 RW、 E、 CS1、 CS2、 RET分别连接至 P1.0至 P1.5。 4 其他硬件部分,四位按键分别连接 P3.2-P3.5,由于四位按键已能完成基本功能,操作简单,使用方便,分别
13、设置为左右选择键,上下选择键,且节省单片机 IO口,因此不采用矩阵键盘 目前 51系列单片机是国内外应用最广泛的一类单片机的 P0口 和 P3口的部份引脚与 DMC20261型液晶显示连接电路如图 2.2所示 5 序号 接口引脚名 说明 1 LEDK 背光负极输入 2 NC 空 3 C86 并行接口选择:高电平: 6800 总线低电平: 8080 总线 4 PS 串行 /并行接口选择,高电平 :并行总线接口 低电平:串行接口 5 EP 6800 系列 MPU 的时钟信号使能脚( EP),当选择总线接口为 8080 时,该线为 RD 信号 6 WR 6800 系列 MPU 的读 /写控制信号(
14、R/W); 8080 系列 MPU 总线的写使能信号 7 A0 数据命令选择脚 8 Reset(RST) 复位脚(低电平复位) 9 CS 片选(低电平有效) 10 LEDA 背光正极输入 11 GND 地 12-19 DB7DB 8位数据总线 5 图 2.2 单片机与液晶屏的连接 3 软件设计 3.1 字符的显示 在数字电路中,所有数据都是由 0和 1保存的,同样 LCD也利用了这一方法。在点阵 LCD上显示的只有两种颜色,因此可利用 0和 1来表示这两种颜色。假设空格是由 16*16个 0组成的,再显示 16*16的字体时,将其中某些点置为 1便可再视觉上形成一个汉字,这些二进制数称为代位码
15、。而这些由 0和 1转换而成的 16进制数据便是字模。不同的汉字有不同的字模,相同的汉字不同的字体也有不同 的字模。而将字模设为 16*16像素是因为这样基本可以将汉字显示清楚准确,更高像素则更为清楚准确,但是却更多地占用了 LCD的面积。与汉字不同的是,一个字符只需要 16*8的像素便即可。假设要在 LCD12864屏幕上准确正确的显示出汉字,则需要将 16*16的汉字分为两行,每行由 16列组成,这 16列每列存再 8个点,用 2位 16进制数( 8位二进制数)表示这 8个点, 16个 16进制数可表示 1行, 32个 16进制数则能表示整个汉字。通过 LCD12864,则可将这些字模信息
16、还原成汉字或图像。 6 MzL02-12864 液晶 显示模块的显示器(玻璃)上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;驱动控制芯片当中共有 65( 8 Page x 8 bit+1) X 132 个位的显示 RAM 区。而显示器的显示点阵大小为 64X128 点,所以实际上在液晶显示模块中有用的显示 RAM 区为128*64个位;按 byte 为单位划分,共分为 8 个 Page,每个 Page 为 8 行,而每一行为 128 个位(即128 列) 驱动控制芯片的显示 RAM 区每个 byte 的数据对应屏上的点的排列方式为:纵向排列,低位在上高位在下。 6 3.2 显示模块
17、函数的设计 3.2.1 LCD 底层接口驱动程序 首先是 LCD的初始化,包含对 LCD的复位与关开显示。利用 LCD的初始化函数 void LCD_Init(void),其中对液晶操作的延时为两个 _nop_();语句以确保时序的正确性。初始化完毕后执行 写命令函数 void LCD_WriteCmd(uchar CmdCode)和 写数据函数 void LCD_WriteData(uchar Data)。 空闲状态检测时利用读状态函数 uchar LCD_ReadStatus(void)读入的状态 BUSY与 RST位均为 0时即检 测到 LCD空闲,跳出 while循环,将 E置 0后跳
18、出函数。对于液晶的读写均用到空闲状态检测以保证液晶的正常显示 7 。 3.2.2 用户接口驱动程序 为了方便对 LCD的使用,本 设计 提供了多个对 LCD操作的子函数。使模块功能提升,方便屏幕显示界面的美化。 清屏函数 void LCD_Clear(void),其原理为将 DDRAM中所有数据置 0,则屏幕上所有显示内容被清除 。 图像显示函数 void LCD_Writeimage(uchar x,uchar y, uchar m,uchar n, uchar code *image)。该函数的功能为在第 x行第 y列为起始位置显示一张 m*n的图片 ( x范围 0-3, y范围 0-7,
19、 m、 n要求为 16的整数倍 ) 8 。 显示汉字函数 void LCD_Writehz(uchar x,uchar y,uchar n,uchar code *hanzi,uchar state)。该函数功能为在指定的屏幕位置显示 hanzi数组存放的汉字。其中参数表示第 x行第 y列显示 n个汉字 ( x范围 0-3, y范围 0-7, 屏幕显示 4行 8列汉字 ) 。 state参数为表示汉字的是否反色显示。由于该 LCD分为左右两 屏,因而该函数主要使文字能在两屏上正常显示。该函数可正确显示 16*8的字符型数据。其中 x,y代表字符显示位置( x范围 0-3, y范围 0-15,屏
20、幕显示 4行 16列字符)。参数 m为需要显示的数字或字母。该函数与显示汉字函数类似,内部运用 Case语句对 m进行判断并选择不同的字模写入到 LCD的 DDRAM中。 设置图形显示模式函数 void LCD_SetPaintMode(uint ModeCode)。参数 ModeCode可以是下列几种情况 : 为 0时 , 覆盖显示 , 图形所在位置的原有显示内容将被覆盖掉 ; 为 1时 , 叠加显示 ,图形 所在位置中原有的黑色点将被保留 ; 为 2时,擦除显示,图形反色显示,但图形所在位置中原有的白色点将被保留 ; 为 3时,异或显示,图形中每一个点与原有的点做异或,即如果图形中某点的颜
21、色与其所在位置原有的颜色相同,则该点显示白色,如果新颜色与原来颜色不同,则该点显示黑色。 ModeCode的值保存在全局变量 CurPaintMode中 9。 显示点函数 void LCD_PutPixel(uint x, uint y)。该函数功能为在屏幕坐标为 x, y的地方放置一点 ( x范围 0-127, y范围 0-6310) 具体工作的 流程 图如下: 7 4. 系统测试与调试 在 keilC中 编写程序并调试成功, 调试 结果如图 4.1: 图 4.1 程序调试 开始 结束 延时使 LCD 复位 脉冲函数 设置显示方式 设置地址指针 取消连续写方式 输送数据到显示器 设置成连续写方式 设置起始地址 写数据 输送命令到显示器 设置显 示屏列数 写完否? 可否连续写 N N Y Y