NANCHANG UNIVERSITY
学 士 学 位 论 文
THESIS OF BACHELOR
(2006 —2010年)
题 目 基于单片机的LCD图片与汉字显示
南 昌 大 学 学士学位论文原创性申明
本人郑重申明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究作出重要贡献的个人和集体,均已在文中以明确方式表明。本人完全意识到本申明的法律后果由本人承担。
作者签名: 日期:
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权南昌大学可以将本论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密□,在 年解密后适用本授权书。
本学位论文属于
不保密□。
(请在以上相应方框内打“√”)
作者签名: 日期:
导师签名: 日期:
摘 要
基于单片机的LCD图片与汉字显示
专业:电子信息工程 学号:6102106078 学生姓名:许 森 指导老师:陈根华
摘 要
本文回顾了目前的液晶显示技术并搭建硬件电路实现了液晶的图片与汉字显示,硬件电路的控制核心是AT89C51单片机,液晶显示部分是由基于控制器为ST7920的QY-12864液晶模块构成,实现了在并行数据传输方式下控制液晶模块QY-12864显示一幅128x64图片和四行16x16的汉字。由于目前液晶显示的普遍性,而且本研究的硬件电路有很大的扩展空间,所得到的研究结果具有重要的应用意义。
关键词: 单片机; 液晶图片与汉字显示 ;控制器ST7920
I
Abstract
Microcontroller-based image and character LCD display Abstract
This article briefly introduced modern LCD display technology and
established a hardware circuit to fulfill an image and charters display.The hardware circuit control core is AT89C51, LCD controller is based on the part of the ST7920 for QY-12864 LCD module composition, realized in parallel data transmission mode control QY-12864 shows a picture of LCD module 128x64 pictures and four rows of 16x16 characters.Because of the universality that liquid crystal using at present, the hardware circuit studying originally has very big expansion space and the result has important application meaning.
Keyword: MCU; Image and character display; Contronller ST7902
II
目 录
目 录
摘 要 ............................................................ I Abstract .......................................................... II 第一章 概述 ........................................................ 4
1.1 LCD显示原理 ................................................ 4 1.2 LCD显示技术 ................................................ 4 1.3 LCD优势 .................................................... 5 1.4 本文所作的工作 ............................................. 6 第二章 硬件设计 .................................................. 7
2.1方案设计与比较 .............................................. 7 2.2主要芯片介绍 ................................................ 8
2.2.1 单片机AT89C51 ....................................... 8 2.2.2 液晶模块QY-12864 ...................................... 8 2.3 模块电路设计 ............................................... 12
2.3.1电源部分 .............................................. 12 2.3.2晶振部分 .............................................. 12 2.3.3复位电路 .............................................. 13 2.3.4液晶模块 .............................................. 13
第三章 软件设计 .................................................. 15
3.1 程序流程设计 ............................................... 15 3.2 主要显示程序设计 ........................................... 15
3.2.1 命令数据的写入 ....................................... 15 3.2.2 命令数据的读出 ....................................... 16 3.2.3 汉字的显示 ........................................... 17 3.2.4 图片的显示 ........................................... 17 3.2.5 液晶初始化 ........................................... 19 3.3 图片数据的提取 ............................................. 20 3.4 软件仿真测试 ............................................... 20 3.5 PCB板的制作 ............................................... 22 第四章 硬件调试结果 .............................................. 25
4.1显示控制信息 ............................................... 25 4.2汉字显示 ................................................... 26 4.3图片显示 ................................................... 26 总 结 ........................................................... 27 参考文献(Perference) ............................................ 28 致 谢 .......................................................... 29 附录 程序代码 ..................................................... 30
III
第一章 概述
第一章 概述
1.1 LCD显示原理
液晶的物理特性是:当通电时导通,排列变的有秩序,使光线容易通过;不通电时排列混乱,阻止光线通过。让液晶如闸门般地阻隔或让光线穿透。从技术上简单地说,液晶面板包含了两片相当精致的无钠玻璃素材,称为Substrates,中间夹著一层液晶。当光束通过这层液晶时,液晶本身会排排站立或扭转呈不规则状,因而阻隔或使光束顺利通过。大多数液晶都属于有机复合物,由长棒状的分子构成。在自然状态下,这些棒状分子的长轴大致平行。将液晶倒入一个经精良加工的开槽平面,液晶分子会顺着槽排列,所以假如那些槽非常平行,则各分子也是完全平行的。
液晶显示器(LCD/Liquid Crystal Display)的显像原理,是将液晶置于两片导电玻璃之间,靠两个电极间电场的驱动,引起液晶分子扭曲向列的电场效应,以控制光源透射或遮蔽功能,在电源关开之间产生明暗而将影像显示出来,若加上彩色滤光片,则可显示彩色影像。在两片玻璃基板上装有配向膜,所以液晶会沿着沟槽配向,由于玻璃基板配向膜沟槽偏离90度,所以液晶分子成为扭转型,当玻璃基板没有加入电场时,光线透过偏光板跟着液晶做90度扭转,通过下方偏光板,液晶面板显示白色;当玻璃基板加入电场时,液晶分子产生配列变化,光线通过液晶分子空隙维持原方向,被下方偏光板遮蔽,光线被吸收无法透出,液晶面板显示黑色。液晶显示器便是根据此电压有无,使面板达到显示效果。
1.2 LCD显示技术
目前液晶显示器可分成三大种类,分别是扭转向列型(Twisted Nematic;简称TN)、超扭转向列型(Super Twisted Nematic简称STN)和彩色薄膜型(Thin Film Transistors;简称TFT)。 TN-LCD
TN是继DSM型的液晶材料後,所发展的新液晶材料,TN-LCD的最大特点就如同其名称「扭转向列」一般,其液晶分子从最上层到最下层的排列方向恰好是呈90度的3D螺旋状。TN-LCD的出现奠定了现今LCD发展的主要方式,但是由於TN-LCD具有两个重大缺点,那就是无法呈现黑、白两色以外色调,以及当液晶显示器越做越大时其对比会越来越差,使得各种新的技术陆续出现。 STN-LCD
4
第一章 概述
STN-LCD的出现是为了改善TN-LCD对比不佳的问题,最大差别点在於液晶分子扭转角度不同以及在玻璃基板的配合层有预倾角度,其液晶分子从最上层到最下层的排列方向恰好是180度至260度的3D螺旋状。但是,STN-LCD虽然改善了TN-LCD的对比问题,其颜色的表现依然无法获得较好的解决,STN-LCD的颜色除了黑、白两个色调外,就只有橘色和黄绿色等少数颜色,对於色彩的表达仍然无法达到全彩的要求,因此仍然不是一个完善的解决方式。 TFT-LCD
为了改善对於色彩的要求,又发明了TSTN(Triple Super Twisted Nematic)和FSTN(Film Super Twisted Nematic)两种新技术。TSTN和FSTN的基本构造原理与STN相同,差别在於TSTN在两片玻璃上加上两片色补偿用薄膜,而FSTN则是加上一片色补偿用薄膜。TSTN和FSTN具有高解析度和全彩的优点,完全改善TN的比对问题和STN的色彩问题。但可惜的是,TSTN和FSTN却有液晶分子的反应较慢的问题,在放映数量较大的资料时,会造成无法负荷的缺点,因此也不是完善的解决方式。
1.3 LCD优势 1. 低压、微功耗
液晶显示器的工作电压极低,而工作电流也仅几个微安,这是其他任何显示器件无法比拟的。要知道,只有低压、微功耗的显示器件才可能深入人间的每个角落,伴随人们生活和工作。在工作电压和功耗上液晶显示正好与大规模集成电路的发展相适应。从而使液晶与大规模集成电路结成了孪生兄弟。使电子手表、计算器、便携仪表、以至手提电脑、GPS电子地图等成为可能。 2. 平板型结构
液晶显示器件的基本结构是由两片玻璃基板制成的薄形盒。这种结构最利于用作显示窗口,而且它可以在有限的面积上容纳最大量的显示内容,显示内容的利用率最高。此外,这种结构不仅可以做的很小,如照相机上所用的显示窗,也可以做的很大,如大屏幕液晶电视及大型液晶广告牌。
此外,这种结构还便于大批量、白动化生产。目前液晶显示器件的生产大都采用自动化半自动化的集成化工艺生产,仅少量工人即可开动一条年产上千万片的生产线。 3. 被动型显示
液晶显示器件本身不能发光,它靠调制外界光达到显示目的。即它不像主动型显示器件那样,靠发光刺激人眼实现显示,而是单纯依靠对外界光的不同反射
5
第一章 概述
形成的不同对比度来达到显示目的的。被动显示更适合于人眼视觉,更不易引起疲劳。这个优点在大信息量、高密度、快速变换、长时间观察的显示时尤其重要。此外,被动显示还不怕光冲刷。所谓光冲刷,是指当环境光较亮时,被显示的信息被冲淡,从而显示不清晰。而被动型显示,由于它是靠反射外部光达到显示目的的,所以,外部光越强,反射的光也越强,显示的内容也就越清晰。因此液晶显示不仅可以用于室外进行显示,而且可以在阳光等强烈照明环境下也可以显示得很清晰。
4. 显示信息量大
液晶显示在同样大小的显示窗面积内,比可以容纳更多的像素,显示更多的信息。这对于制作高清晰度电视、笔记本式电脑都非常有利。 5. 易于彩色化
液晶本身虽然一般是没有颜色的,但它实现彩色化确很容易,方法很多。一般使用较多的是滤色法和干涉法。由于滤色法技术的成熟,使液晶的彩色化具有更精确、更鲜艳、更没有色失真的彩色化效果。 6. 长寿命
液晶材料是有机高分子合成材料,具有极高的纯度,而且其他材料也都是高纯物质,在极净化的条件下制造而成。液晶的驱动电压又很低,驱动电流更是微乎其微,因此,这种器件的劣化几乎没有,寿命很长。从实际应用考查。一般使用中,除撞击,破碎或配套件损坏外,液晶显示器件自身的寿命终结几乎没有可
能。 7. 无辐射,无污染
液晶显示器件在使用时不会产生像CRT使用中产生的软X射线及电磁波辐射。这种幅射不仅污染环境还会产生信息泄露。而液晶显示不会产生这类问题。它对于人身安全和信息保密都是十分理想的。
1.4 本文所作的工作
本课题的主要任务是实现液晶的图片与汉字显示,实现简单的人机交互。掌握和熟练使用相关软件,设计硬件电路并编写相应的程序实现相应功能。课题完成过程中,阅读了很多关于液晶显示原理和单片机控制电路方面的文献。本设计是采用了QY-12864在并行方式下实现图片与汉字显示,应用Zimo21字模提取软件提取了128x64的图片显示数据和16x16的汉字数据,使用proteus软件进行仿真。应用DXP2004进行了电路原理图的和PCB板的制作。
6
第二章 硬件设计
第二章 硬件设计
2.1方案设计与比较
方案一:一般51单片机有4K程序存储单元,128Byte的RAM,足以满足一
般的控制需求,而且具有较高的性价比,所以选择AT89C51单片机作为控制单元.通过串行方式控制液晶模块,优点是串行方式节省端口,可利用其他端口进行另外的扩展。缺点是串行数据传输速度有限制,如果要显示动态图片或者流畅的播放视频那么效果会比较差,而且串行数据控制比较复杂,因为要考虑到信号传输的同步问题。这也是串行方式方式数据传输比较慢的一个原因。
图2-1 串行连接方式
方案二:采用并行数据传输方式,优点数据传输速度较快可以克服串行显示动态图片显示效果不佳现象,控制方式也较串行简单。缺点占用较多的I/O口,8根数据线就需要8个I/O口。
7
第二章 硬件设计
图2-2 并行连接方式
由上边两个方案对比,由于本设计I/O较充足,故选择并行数据传输方式进行液晶控制,控制信号简单较容易设计实现。
2.2主要芯片介绍 2.2.1 单片机AT89C51
AT89C51是ALTEM公司的一种高效微控制器,它将多功能8位cpu和闪烁存储器组合在单个芯片中,带有4k字节可编程可擦除只读存储器,有128Byte片内RAM。并且与工业标准的MCS-51指令集和输出管脚想兼容,灵活运用于各种控制领域。
2.2.2 液晶模块QY-12864
QY-12864液晶模块是128x64点阵的汉字图形液晶显示模块,可显示汉字及图片,内置国标GB2312码简体中文字库(16x16点阵)、128个字符(8x16点阵)及64x256点阵显示RAM。可与MCU直接接口,提供两种界面来连接微处理机:8位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。
QY-12864引脚图如表2-3所示:
8
第二章 硬件设计
1 2 3 4 RS 14 D7 5 RW 15 6 E 16 7 D0 17 8 D1 18 9 D2 19 10 D3 20 L- VSS VDD VO 11 D4
12 D5 13 D6 PSB NC RST VEE L+ 图2-3 QY-12864引脚图 VSS:电源地。 VDD: +5V电源输入。 VO:液晶显示对比度调节。
RS:数据命令选择端。高电平数据,低电平命令。 RW:读写选择端。高电平读信号,低电平写信号。 E:读写使能端。 DB0-DB7:数据总线。
PSB:并串选择端口。高电平并行传输,低电平串行传输。 RST:复位端,低电平有效。 L+:背光源正端(+5V)。 L-:背光源负端。 QY-12864指令
1、清除显示
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L L L L H 功能:清除显示屏幕,把DDRAM位址计数器调整为“00H” 2、位址归位
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L L L H X 功能:把DDRAM位址计数器调整位“00H”,游标回原点,该功能不影响显示DDRAM 3、位址归位
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L L L I/D S 功能:执行该命令后,所设置的行将显示在屏幕第一行。显示起始行是由Z地址计数器控制的,该命令将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫
9
第二章 硬件设计
描完一行后自动加一。 4、显示状态开/关
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L H D C H X 功能:D=1; 整体显示ON;游标ON; B=1;游标位置ON 5、游标或显示移位控制
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L H S/C R/L X X 功能:设定游标的移动与显示的移位控制位,这个指令不改变DDRAM的内容 6、功能设定
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L H DL X 0 RE X X 功能:DL=1(必须设为1)RE=1:扩充指令集动作 RE=0:基本指令集动作 7、设定CGRAM位址
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L H AC5 AC4 AC3 AC2 AC1 AC0 功能:设定CGRAM位址到位址计数器(AC) 8、设定DDRAM位址
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:设定DDRAM 位址到位址计数器(AC) 9、读取忙碌状态(BF)和位址
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址针计数器(AC)的值 10、写字料到RAM
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 H L DB7 DB6 DB5 DB4 DB3 AC2 DB1 DB0 功能:写入资料到内部RAM(DDRAM/CGRAM/TRAM/GDRAM) 11、读出RAM的值
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
10
第二章 硬件设计
H H DB7 DB6 DB5 DB4 DB3 AC2 DB1 DB0 功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM) 12、待命模式(12H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L L L L H 功能:进入待命模式,执行其它命令都可终止待命模式 13、卷动位址或IRAM位址选择(13H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L L L H SR 功能:SR=1;允许输入卷动位址 SR=O;允许输入IRAM位址 14、反白选择(14H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L L H R1 R0 功能:选择4行中的任一行作反白显示,并可决定反白的与否 15、睡眠模式(15H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L L L H SL X X 功能:SL=1; 脱离睡眠模式SL=0;进入睡眠模式 16、扩充功能设定(16H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L H H X 1RE G L 功能:RE=1;扩充指令集动作 RE=0:基本指令集动作 G=1 绘图显示ON G=0;绘图显示OFF
17、设定IRAM位址或卷动地址(17H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L H AC5 AC4 AC3 AC2 AC1 AC0 功能:SR=1; AC5-AC0 为垂直卷动位址SR=0;AC3-AC0写ICONRAM位址 18、设定绘图RAM位址(18H)
RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:设定GDRAM 位址到位址计数器(AC) 显示步骤:
11
第二章 硬件设计
显示资料RAM
显示资料RAM提供64x32个位元组的空间,最多可以控制4行16字(64个字)的中文字型显示,当写入显示资料RAM时,可以分别显示CGROM、HCGROM的字型;ST7902A可以显示三种字型,分别是办宽的HCGROM字型、CGRAM字型及中文CGRAM字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H-0006H的编码中将自动的结合下一个位元组,组成两个位元组的编码达成中文字型的编码(A140-D75F),各种字型详细编码如下:
显示半宽字型:将8位元资料写入DDRAM中,范围为02H-7FH的编码。 显示CGRAM字型:将16位元资料写入DDRAM中,总共有00H,02H,04H,06H四种编码。
显示中文字型:将16位元资料写入DDRAM中,范围为A1A1H-F7FEH的编码。 绘图RAM(GDRAM)
绘图显示RAM提供64x32个元组的记忆空间,最多可以控制256x64点的二维绘图缓冲空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,在写入两个8位元的资料到绘图RAM,而地址计数器(AC)会自动加一;在写入绘图RAM的期间,绘图RAM显示必须关闭,整个写入绘图RAM的步骤如下:
关闭绘图显示功能;
先将垂直的坐标(Y)写入绘图RAM地址; 再将水平的位元组坐标(X)写入绘图RAM地址; 将D15-D8写入到RAM; 将D7-D0写入到RAM; 打开绘图显示功能。
2.3 模块电路设计
2.3.1电源部分
图2-4总电源
如图2-4所示通过USB接口给整个电路提供+5V的电压驱动电路。当开关S1闭合,LED灯DS1发光,表示电路供电。
2.3.2晶振部分
12
第二章 硬件设计
图 2-5 晶振
如图2-5所示两根线分别连接AT89C51的XTAL1与XTAL2引脚为系统提供的6MHz的时钟频率。 2.3.3复位电路
图2-6 复位电路
如图2-6所示连接AT89CT1的RST端,单片机上电后会自动复位,当软件运行出现未知错误需要复位时,按下开关S2本电路在RST端产生高电平,系统复位,程序重新开始执行。 2.3.4液晶模块
13
第二章 硬件设计
图 2-7 液晶模块
如图2-7所示 PSB端接高电平,使用并行数据传输方式,DB0-DB7与单片
机P1口连接,RS、R、WE分别接P3.0、P3.1、P3.2,数据的并行传输比数据的串行传输控制简单,而且有较高的数据传输速率。当I/O口较少且对数据传输速率要求不严格时可采用串行的数据传输方式。RST端接低电平时复位,本设计不需要硬件复位,每次执行程序时进行软件初始化,故RST端接高电平。LED+与LED-之间接可变电阻用来改变背景亮度。
电路原理图如下图所示:
图 2-8 电路原理图
14
第三章 软件设计
第三章 软件设计
3.1 程序流程设计
程序实现功能:本设计可以实现16x16汉字与128x64图片显示,程序中还设置S1S2两个按键,有四种不同的组合,根据不同的组合可实现控制信息显示,汉字显示,图片显示,汉字与图片显示。程序流程图如图3-1所示:
3-1 程序流程图
PCB板上电,单片机上电复位。开始执行程序,液晶初始化,设置显示模式游标状态显示地址等。显示作者信息,条件判断,根据按键不同的组合信息进入相应的显示模式,完成某种显示任务后再次判断,实现显示任务的灵活执行。
3.2 主要显示程序设计
3.2.1 命令数据的写入
15
第三章 软件设计
图3-2 MCU写资料到液晶模块
如图3-2所示,并行方式下由单片机写数据或命令到液晶模块的过程,当要写数据RS置高,写命令时RS置低,然后RW置低表示写入,数据或命令在I/O等待,E置高电平,资料读入液晶模块。
3.2.2 命令数据的读出
图3-3MCU从液晶模块读资料
如图3-3所示,和命令数据的写入不同的是当读入时。RW应该置高电平,数据或命令在DB0-DB7等待,然后E置高电平,数据或命令被MCU读出。结合读写操作编写写入命令的部分代码如下: uchar temp=0;
RS=0; //RS置低对命令进行操作 RW=1; //RW置高MCU进行读操作 do //检测LCD是否处于忙状态 { EN=1; //EN置高DB0-DB7数据输出 _nop_();
16
第三章 软件设计
temp=P1; //从P1口读入数据
EN=0; //EN置低阻止MCU和QY-12864通信 }
while(temp&0x80);
RW=0; //RW置低MCU进行写操作 P1=cmd; //命令在P1口等待 EN=1; //EN置高命令写入QY-12864 _nop_();
EN=0; //写完命令后阻止MCU与QY-12864通信
注意:上边的一个do···while···语句是用来判读液晶是否处于忙碌状态,如果处于忙碌状态则继续执行循环继续检测,直到液晶不忙碌时进行下一步操作。每次对液晶进行操作时都要进行这个询问,否则会出错。
3.2.3 汉字的显示
图 3-4 16x16汉字显示坐标
QY-12864是带字库的液晶,也就是说可以直接写入汉字,当写入汉字时先写入它的坐标,如果连续写入它的地址指针会自动加1,所以这种控制还是比较方便的,当然也可以自己提取字模,它的写入方式是先写列在写行就是和我们一般写字的方式是一样的,提取字模是应该注意这一点,用Zimo21字模软件或其他软件时应该进行横向取模。部分汉字写入代码如下: void Display_hz(uchar address,const uchar *pt,uchar num) { uchar i;
Write_cmd(address); //先写入汉字显示坐标address for(i=0;i=(num*2);i++) //写入汉字个数
Write_data(*(pt++)); } //写入汉字(pt为汉字数组首地址)
3.2.4 图片的显示
图片数据的写入是先写入图片显示的纵坐标再写入横坐标,地址指针会自动加1,图片显示坐标如图3-5所示,图片写入的部分代码如下: uchar i,j,k;
17
第三章 软件设计
Write_cmd(0x34); i=0x80;
for(j=0;j<32;j++) //画上半屏幕32行 {Write_cmd(i++); //写入图片显示纵坐标 Write_cmd(0x80); //写入图片显示横坐标 for(k=0;k<16;k++) //地址指针会自动加1故循环
{ 故会写满一行(128列) Write_data(*ptr++); //ptr为图片数组首地址 } } i=0x80;
for(j=0;j<32;j++) //画下半屏幕 {
Write_cmd(i++); Write_cmd(0x88); for(k=0;k<16;k++); {
Write_data(*ptr++); } }
Write_cmd(0x36); //打开绘图 Write_cmd(0x30); //回到基本指令集
18
第三章 软件设计
图 3-5 图片显示坐标 3.2.5 液晶初始化
液晶初始化时根据控制器ST7920的初始化顺序进行初始化设置的,部分代码如下: Delay_Nms(500);
Write_cmd(0x30); //基本指令集 Delay_Nms(1);
Write_cmd(0x02); //地址归位 Delay_Nms(1);
Write_cmd(0x0c); //整体显示打开,游标关闭 Delay_Nms(1);
Write_cmd(0x01); //清除显示 Delay_Nms(1);
19
第三章 软件设计
Write_cmd(0x06); //游标右移 Delay_Nms(1);
Write_cmd(0x80); //设定显示的起始位置
3.3 图片数据的提取
Zimo21字模提取软件提取128x64图片步骤: 1.新建宽度128高度64图像 2.打开图片文件。 3.参数设置横向取模。 4.取模格式C51。 5.生成数据。
汉字字模提取与图片步骤相同,只是图像大小改为16x16。
图3-6 图片数据提取
3.4 软件仿真测试
进行软件仿真测试应按照如下步骤: 1.在keil软件先建立一个工程文件。 2.然后选择ALTEM公司AT89C51单片机。
3.对单片机进行一些基本设置,晶振频率存储器选片内还是片外大小等,一
20
第三章 软件设计
定要设置软件编译后要生成hex文件(protues仿真需要)。
4.然后编写程序,编译运行直至没有错误。 5.打开protues ISIS编辑器绘制原理图。 6.给单片机中加载keil中生成的hex文件。
7.开始软件调试。从message中可以看到查找错误原因进行调整,也可是添加以写辅助工具,如逻辑分析仪等分析波形是否正确。 汉字与图像的仿真结果如下图3-7图3-8所示。
图3-7 protues汉字仿真
21
第三章 软件设计
图3-8 protues图像仿真
3.5 PCB板的制作
1.新建工程文件
2.建立原理图文件,绘制原理图并编译。 3.生成网络报表。
4.新建PCB文件,进行基本属性设置(大小,层数等)。 5.将建好的PCB文件加入工程文件。 6.导入网络报表。
7.调整元件封装,调整元件布局。
8.布线(设置好布线规则,线宽,布线层面等)。 9.对所有过孔加焊盘。 10.覆铜。
22
第三章 软件设计
图 3-8 PCB板图
23
第三章 软件设计
图 3-9 PCB3D视图
24
第四章 硬件调试结果
第四章 硬件调试结果 4.1显示控制信息
如图所示显示控制信息,使用者可根据控制信息实现图片与汉字有选择的显示。
图 4-1 控制信息显示
25
第四章 硬件调试结果
4.2汉字显示
如图所示可以显示程序设定的16x16汉字。
图 4-2 汉字显示
4.3图片显示
如图4-3所示可以显示设定的128x64图片。
图 4-3 图片显示
26
总 结
总 结
通过本课题使我学会了资料的快速查找,提高了独立分析问题、解决问题的能力。我觉得本课题的最大难点在于对于对液晶点阵书写方式的理解也就是显示坐标的理解,不同的液晶控制器有不同的书写方式,例如本设计使用的ST7920控制器是横向书写,而有的采用SED1565控制器是纵向书写,而且是先从低位开始写数据,所以在字模提取的时候应该根据不同的书写方式来进行字模的提取。否则在显示的时候出现乱码等情况。在PCB板的布线,一定要耐心,适当选取线的宽度与焊盘大小 ,采取和理的布局,尽量避免使用飞线。在硬件调试工程中,一定要要注意细节问题的分析,只有这有这样才能快速准确的解决所遇到的问题。
总体来说本课题难度不大,本设计实现了128x64图片与16x16汉字的显示,是一个完整的实际问题的解决,是一个理论转化位实践的过程,对以后的工作和学习都有很大的帮助。最后感谢陈根华老师给我这个课题,让我对单片机和液晶方面有了比较深入的了解,也对keil,protel,protues等软件的使用有了一定了解。
27
参考文献 (Perference)
参考文献(Perference)
[1] 靳栀,潘育山.单片机原理及应用——C51编程技术[M].西南交通大学出版
社,2004.3. [2] 张毅刚,彭喜元,董继成. 单片机原理及应用[M].高等教育出版社,2003.12. [4] 王阵营,李满,杨君等.ProtelDXP2004电路设计与制版使用教程[M].中国 铁道出版社,2006.6.
[5] 臧铁钢,唐才峰,陈学锋,刘伟俭.ProtelDXP电路设计与应用[M].中国铁 道出版社,2005.5.
[6] 李宏,张家田.液晶显示器件应用技术[M].机械工业出版社,2004.7. [7] 小林俊介,乔双,高岩译.下一代液晶显示[M].科学出版社,2003.4.
[8] 孟庆龙.单片机与三种液晶显示器的接口技术[J].信息化研究,第35卷第6 期.
[9] 孟臣,李敏.中文液晶图文显示器及其应用[J].电子器件应用,第5卷第8 期.
28
致 谢
致 谢
毕业设计的结束预示着大学生活的结束,而在毕业设计过程中得到了很到老
师和同学的帮助与支持,在此真挚的感谢陈根华老师在繁忙的工作中挤出时间给予的指导,感谢所有任课老师无私的教诲,感谢四年同窗的关心与帮助,谢谢你们为我创造的大学生活。同时也借此机会感谢父母无私的爱,感谢他们给我接受教育的机会,感谢他们的养育之恩。
29
附录 程序代码
附录 程序代码
/********************************************** 程序功能:用并行方式在液晶上显示汉字和图片 作者: 许 森 日期:2010年5月20日
**********************************************/ #include \"subroutine.h\" #include \"disdata.h\" void main() {
unsigned char i; Ini_lcd(); Delay_Nms(100);
s1=0; s2=0;
for(i=5;i>0;i--)
//检测程序
{ led=0;
Delay_Nms(100); led=1;
Delay_Nms(100);}
Write_cmd(0x01);
Display_hz(0x81,line11,6); //显示作者信息 Display_hz(0x91,line12,6); Display_hz(0x8a,line13,5); Display_hz(0x9a,line14,4); Delay_Nms(1000); loop:if(s1==0&&s2==0) { Write_cmd(0x01);
//显示控制信息
Display_hz(0x80,line31,3); Display_hz(0x91,line32,7);
30
附录 程序代码
Display_hz(0x89,line33,7); Display_hz(0x99,line34,7);
Delay_Nms(3000); goto loop;}
else if(s1==1&&s2==0) { do
{Write_cmd(0x01);
//清屏
// 显示小狗图片1 //等待两秒 //清屏
// 显示小狗图片2 //等待两秒
picture(pic1);
Delay_Nms(1500); Write_cmd(0x01); picture(pic2);
Delay_Nms(1500);
} while(s1==1&&s2==0);
goto loop;}
else if(s1==1&&s2==1) {do{Write_cmd(0x01);
Display_hz(0x81,line21,4); //显示昌大校训 Display_hz(0x8a,line23,4); Display_hz(0x9a,line24,4); Delay_Nms(1500);
Write_cmd(0x01);
// 等待两秒 //显示文字
Display_hz(0x90,line41,8);
Display_hz(0x88,line42,8); Delay_Nms(1500);
}
while(s1==1&&s2==1); goto loop;}
else if(s1==0&&s2==1)
{do {Write_cmd(0x01);
Display_hz(0x81,line21,4); //显示昌大校训 Display_hz(0x8a,line23,4); Display_hz(0x9a,line24,4); Delay_Nms(1000); Write_cmd(0x01);
31
//清屏
附录 程序代码
picture(pic1);
// 显示小狗图片1
// 显示小狗图片2
Delay_Nms(1000); Write_cmd(0x01); picture(pic2);
Delay_Nms(1000); Write_cmd(0x01);
Display_hz(0x90,jieshu1,7); // 显示结束语 Display_hz(0x8a,jieshu2,4); Delay_Nms(1000); } while(s1==1&&s2==0);
goto loop;}}
/******************************************* SUBROUTINE.H包含主程序中所要调用的函数 ******************************************/ #include sbit RS=P3^0 ; //P3.0高电平表示数据,低电平表示命令 sbit RW=P3^1 ; //P3.1高电平表示读出,低电平表示写入 sbit EN=P3^2 ; //P3.2高电平使能,低电平为串行数据移位脉冲(本程序用并行数据输入) sbit led=P3^3; //检测程序引脚 /******************************************* 函数名:Delay_Nms 功能:延时N个ms 参数:n--延时度 返回值:无 ******************************************/ void Delay_Nms(uint n) { uint i,j; for(i=n;i>0;i--) for(j=150;j>0;j--) //延时1ms 32 附录 程序代码 _nop_();} /******************************************** 函数名称:Write_cmd 功能:向液晶中写入命令 参数:cmd--控制命令 返回值:无 ********************************************/ void Write_cmd(uchar cmd) {uchar temp=0; RS=0; RW=1; P1=0xff; do //检测LCD是否处于忙状态 { EN=1; _nop_(); _nop_(); _nop_(); temp=P1; EN=0; _nop_(); } while(temp&0x80); RW=0; //给LCD中写入命令 P1=cmd; EN=1; _nop_();_nop_();_nop_(); EN=0; _nop_(); } /******************************************** 函数名称:Write_data 功能:向液晶中写显示数据 参数:data--显示数据 返回值:无 *********************************************/ 33 附录 程序代码 void Write_data(uchar dat) { uchar temp=0; RS=0; RW=1; P1=0xff; do //检测LCD是否处于忙状态 { EN=1; _nop_(); _nop_();_nop_(); temp=P1; EN=0; } while(temp&0x80); RS=1; //给LCD中写入数据 RW=0; P1=dat; EN=1; _nop_();_nop_(); EN=0;} /***************************************** 函数名称:Ini_lcd 功能:初始化液晶模块 参数:无 返回值:无 *****************************************/ void Ini_lcd(void) { Delay_Nms(500); Write_cmd(0x30); //基本指令集 Delay_Nms(1); Write_cmd(0x02); //地址归位 Delay_Nms(1); Write_cmd(0x0c); //整体显示打开,游标关闭 Delay_Nms(1); Write_cmd(0x01); //清除显示 Delay_Nms(1); 34 附录 程序代码 Write_cmd(0x06); //游标右移 Delay_Nms(1); Write_cmd(0x80); } //设定显示的起始位置 /***************************************** 函数名称:Display_hz 功能:控制液晶显示汉字 参数:address--显示位置的首地址 pt--指向显示数据的指针 num--显示字符个数 返回值:无 ******************************************/ void Display_hz(uchar address,const uchar *pt,uchar num) { uchar i; Write_cmd(address); for(i=0;i<(num*2);i++) Write_data(*(pt++)); } /********************************************** 函数名称:picture 功能:在整个屏幕显示画图 参数:Ptr--指向图片指针 返回值:无 *********************************************/ void picture(const uchar *ptr) { uchar i,j,k; Write_cmd(0x34); i=0x80; for(j=0;j<32;j++) //画上半屏幕 { Write_cmd(i++); //绘图纵坐标 Write_cmd(0x80); //绘图横坐标 for(k=0;k<16;k++) Write_data(*ptr++); } 35 附录 程序代码 i=0x80; for(j=0;j<32;j++) //画下半屏幕 {Write_cmd(i++); Write_cmd(0x88); for(k=0;k<16;k++) Write_data(*ptr++); } Write_cmd(0x36); //打开绘图显示 Write_cmd(0x30); } //回到基本指令集 /********************************************** DIDATA.H 包含显示数据 **********************************************/ unsigned char code line11[]={\"信息工程学院\unsigned char code line12[]={\"电子信息工程\unsigned char code line13[]={\"6102106078\unsigned char code line14[]={\"许森作品\unsigned char code line21[]={\"时刻铭记\unsigned char code line23[]={\"格物致新\unsigned char code line24[]={\"厚德泽人\unsigned char code line31[]={\"请选择\ unsigned char code line32[]={\"循环显示输入01\unsigned char code line33[]={\"显示图片输入10\unsigned char code line34[]={\"显示汉字输入11\unsigned char code line41[]={\"态度决定人生厚度\unsigned char code line42[]={\"心态决定幸福指数\unsigned char code jieshu1[]={\"祝大家天天开心\unsigned char code jieshu2[]={\"谢谢观赏\ unsigned char code pic1[]= { 略}; unsigned char code pic1[]= { 略} ; 36 因篇幅问题不能全部显示,请点此查看更多更全内容