您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页128液晶图形滚动显示仿真论文

128液晶图形滚动显示仿真论文

来源:华拓科技网
目 录

摘 要............................................................................................................................ 1 Abstract .......................................................................................................................... 1 1 绪论............................................................................................................................ 1

1.1 论文背景介绍............................................................................................... 1 1.2 研究现状综述............................................................................................... 2 1.3 论文的主要任务........................................................................................... 3 2 硬件电路设计............................................................................................................ 3

2.1 硬件系统结构图........................................................................................... 3 2.1 ATC51单片机最小系统设计 ................................................................... 3 2.3 AMPIRE128*简介 .................................................................................... 7 2.4 AMPIRE128*的指令系统 ........................................................................ 9 2.5 AMPIRE128*与单片机接口 .................................................................. 11 2.6 电路图设计................................................................................................. 13 3 程序设计.................................................................................................................. 13

3.1Keil简介 ....................................................................................................... 13 3.2程序流程图.................................................................................................. 14 3.3 128LCD主程序....................................................................................... 14 4 软件仿真.................................................................................................................. 18

4.1 Proteus简介................................................................................................. 18 4.2 汉字显示..................................................................................................... 19 4.3 图形显示..................................................................................................... 19 5 结论.......................................................................................................................... 20 参考文献...................................................................................................................... 20 致谢.............................................................................................................................. 21 附录 ............................................................................................................................. 21

128液晶图形滚动显示仿真

学生姓名:张家义 学号:20095044005 学 院:物理电子工程学院 专业:电子科学与技术 指导教师:马占卿 职称:副教授

摘 要:128液晶具有功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。本论文以Proteus软件中自带的AMPIRE 128×液晶(基于KS0108控制器)为研究对象,重点分析了其工作原理和编程方法。通过对ATC51单片机的编程实现了128液晶的图形滚动显示仿真。

关键词:单片机;AMPIRE128*LCD显示;Proteus

Abstract:128 liquid crystal display (LCD) with low power consumption, small volume, light weight, ultra-thin, etc many other monitors the incomparable advantages, in recent years,it is widely used in single chip microcomputer control of intelligent instruments, meters and low power consumption electronic products. In this paper by Proteus software built-in AMPIRE 128 x LCD (based on KS0108 controller) as the research object, analyzed its working principle and programming method. Based on ATC51 single chip microcomputer programming realized the simulation of 128 LCD graphics scroll.

Key words:MCU;AMPIRE128*LCD display;Proteus

1 绪论

1.1 论文背景介绍

随着国内外工业的日益发展,目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC 卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。LCD 低压微功耗平板型结构,被动显示(无眩光,不刺激人眼,不会引起眼睛疲劳),显示

1

信息量大(因为像素可以做得很小),易于彩色化(在色谱上可以非常准确的复现),无电磁辐射(对人体安全,利于信息保密),长寿命。广泛应用于可视化,人机交互界面。

从世界范围来看,液晶显示产业方兴未艾,发展势头正旺。预计今后十年、二十年液晶显示器都将是平板显示的主流产品。我国液晶显示行业尽管也走过了二十多个年头,有了一定的基础。但与先进国家与地区相比差距还很大,要迎头赶上,还只能算刚刚开始。俗话说:兵马未动,粮草先行。液晶显示相关材料对于器件产业的发展至关重要。我们在这方面总体讲,还很落后,还有许多薄弱环节,应当引起各方重视。液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。LCD 可分为段位式LCD、字符式LCD 和点阵式LCD。其中,段位式LCD 和字符式LCD 只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD 不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动,动画功能,分区开窗口,反转,闪烁等功能,用途十分广泛。LCD 产品制造涉及光学、半导体、电机、化工、材料等各项领域,上下游所需VI技术层面极广,极少有单一厂商能从材料到成品全部都做,因此各领域分工明显。LCD 产业上游材料包括玻璃基板、ITO 导电玻璃、偏光板、彩色滤光片、背光模块、液晶、半导造工序所需光罩,液晶驱动IC、印刷电路板(PCB)等。 1.2 研究现状综述

如何开发智能型的图形液晶控制系统已成为人们研究的当务之急。我们知道,一个较好的系统既要有较强的适应性和通用性,还要有较强的功能性,较高的性价比,很高的实用价值。图形液晶控制技术也有了不断的进步。图形液晶显示已成为大多数仪器正常工作的前提,而且对显示的要求也越来越严格。因此,液晶显示与控制方法的研究越来越受到人们的重视。图形液晶控制系统能很好解决显示控制中的各种问题,所以图形液晶显示控制系统的研究具有很大的市场潜力。随着国内外工业的日益发展,图形液晶显示技术也有了不断的进步。图形液晶显示作为显示终端,图形液晶显示器主要用来显示图形、汉字和字符。KSO1O8是一种常用的功能较强的一种图形液晶显示控制器,而C语言作为单片机编程语言具有通用性和移植性强的等特点。开发基于C语言的KS0108显示驱动程序,可

2

被其他应用系统直接嵌入和移植使用,节约了使用者单独编程和开发的时间和效率,对简化工业控制设计过程和缩短设计周期有着非常积极和促进作用。 1.3 论文的主要任务

本论文的主要任务是实现128液晶的图形显示及滚动仿真。我选用的是Proteus软件中自带的AMPIRE 128×液晶(基于KS0108控制器),重点分析了KS0108的指令系统以及编程方法。以ATC51为核心控制器,通过程序设计,实现汉字和图形的显示。然后通过按键控制汉字和图形的滚动显示。

论文前期主要任务为搜集128液晶资料,重点掌握其工作原理;论文中期任务主要为通过对128液晶的指令系统的掌握,编写程序代码,在Proteus软件中进行仿真调试,同时开始论文的写作。论文后期主要任务为完善程序的设计,仿真的结果以及论文的写作。

2 硬件电路设计

2.1 硬件系统结构图

此设计控制系统由ATC51单片机芯片、LCD显示电路、复位电路、晶体振荡电路和按键组成,如图1所示:

按键

ATC51

单片机

复位电路

LCD显示器 晶振电路 图1 总设计框图

2.2 ATC51单片机最小系统设计

单片机最小系统主要由单片机ATC51、电源电路、复位电路、时钟电路组成。

3

2.2.1 ATC51单片机

ATC51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位处理器和Flash存储单元,ATC51单片机在电子行业中有着广泛的应用。

其主要功能特性有以下几点: (1)与MCS-51产品指令系统完全兼容

(2)4k字节可反复擦写(大于1000次)Flash ROM; (3)32个可编程I/O口线; (4)128x8bit内部RAM;

(5)2个16位可编程定时/计数器中断; (6)时钟频率0-24MHz; (7)可编程UART串行通道; (8)6个中断源;

(9)三级加密程序存储器;

(10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;

(11)有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。

ATC51为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc51 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。其引脚图如图2所示。

4

图2 ATC51引脚图

2.2.2 时钟电路设计

单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得到的时钟信号比较稳定,实际使用中常采用这种方式。

图3 振荡电路图

2.2.3 复位电路设计

单片机在启动运行时,都需要先复位,它的作用是使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。MCS-51系列单片机本身,一般不能自动进行复位,必须配合相应的外部电路才能实现。复位电路的作用就是使单片机在上电时能够复位或运行出错时进行复位状态。

5

图4 按键与上电复位电路

2.3 AMPIRE128*简介

本系统采用液晶显示模块AMPIRE128X,为单色LCD,其外形如图5所示。屏幕分为两半控制,控制引脚为CS1和CS2,数据通过移位寄存器输入。

6

图5 AMPIRE128*外形图

管脚一共18个。CS1左半屏片选端,CS2右半屏片选端;VCC、GND就是VCC、GND,没啥好说的;V0液晶显示驱动电压,在网上找的仿真实例中有的这个脚就悬空,我是通过一个电位器接到VCC;RS数据指令选择信号,H为数据,L为指令,有的资料上也叫D/I,我估计是DATA和INSTRUCTIONS这两个单词的缩写;R/W读写选择信号,H为读,L为写,这肯定是READ和WRITE的缩写。E为LCD使能端,R/W为L时,E信号下降沿锁存DB7-DB0;R/W为H时,E为H,DDRAM数据读到DB7-DB0,如果只写不读的话可以接地处理。DB0-DB7数据传输端口。RST复位信号,不过还没弄明白是怎么回事,参考一些资料后接VCC处理。 -VOUT估计和V0差不多,液晶显示驱动电压。 2.3.1 点阵LCD的显示原理

在数字电路中,所有的数据都是以0 和1 保存的,对LCD 控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8 位(一字节)即可。而对于中文,常用却有6000 以上,于是我们的DOS 前辈想了一个办法,就是将ASCII 表的高128 个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128 位则留给英文字符使用,即英文的内码。

那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图6 所示:

7

图6 “A”字模图

而中文的“你”在字模中的记载却如图7 所示:

图7 “A”字模图

2.3.2 读操作时序

读操作时序如图8所示:

8

图8 读操作时序图

2.3.3 写操作时序

写操作时序如图9所示:

图9 写操作时序图

2.4 AMPIRE128*的指令系统

此类液晶显示模块的指令系统比较简单,共有七种。其指令如表2所示。 1.显示开/关指令 代码 R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 形式 0 0 0 0 1 1 1 1 1 D D=1:开显示(DISPLAY ON)意即显示器可以进行各种显示操作 D=0:关显示(DISPLAY OFF)意即不能对显示器可以进行各种显示操作

9

2.显示起始行设置指令 代码 R/W D/I DB7 形式 0 0 1 DB6 1 DB5 A5 DB4 A4 DB3 A3 DB2 A2 DB1 A1 DB0 A0 前面在Z地址计数器一节已经描述了显示起始行是由Z地址计数器控制的。A5∽A0的6位地址自动送入Z地址计数器,起始行的地址可以是0∽ 63的任意一行。 例如:

选择A5∽A0是62,则起始行与DDRAM行的对应关系如下: DDRAM 行:62 63 0 1 2 3·····················28 29 屏幕显示行:1 2 3 4 5 6·····················31 32 3.页设置指令 代码 R/W D/I 形式 0 0 DB7 1 DB6 0 DB5 1 DB4 1 DB3 1 DB2 A2 DB1 A1 DB0 A0 所谓页地址就是DDRAM的行地址,8行为一页,模块共行即8页, A2∽A0表示0∽7页。读写数据对地址没有影响,页地址由本指令或RST信号改变复位后页地址为0。页地址与DDRAM的对应关系见DDRAM地址表。 4.列地址设置指令 代码 R/W D/I 形式 0 0 DB7 0 DB6 1 DB5 A5 DB4 A4 DB3 A3 DB2 A2 DB1 A1 DB0 A0 此指令的作用是将A5∽A0送入列地址计数器,作为DDRAM的列地址指针。在对DDRAM进行读写操作后,列地址指针自动加1,指向下一个DDRAM单元。

DDRAM地址表如表1所示:

CS1=1 Y= 0 1 ··· 62 63 0 1 X=0 DB0 DB0 DB0 DBO ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 ↓ DB0 DB0 DB0 DB0 ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 CS2=1 ··· 62 63 行号 0 ↓ 7 8 ↓ 55 DBO DBO DBO DBO DBO DBO ↓ ↓ ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 DB7 DB7 DB0 DB0 DB0 DB0 DB0 DB0 ↓ ↓ ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 DB7 DB7 10

X=7 DB0 DBO DBO DBO ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 DBO DBO DBO DBO DBO DBO ↓ ↓ ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 DB7 DB7 56 ↓ 63 表1 DDRAM的地址与显示位置关系对照图

5.读状态指令 代码 R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 形式 0 1 BUSY 0 ON/ RET OFF 0 0 0 0 当R/W=1 D/I=0时,在E信号为“H”的作用下,状态分别输出到数据总线(DB7∽DB0)的相应位。

ON/OFF:表示DFF触发器的状态(见DFF触发器一节)。

RST:RST=1表示内部正在初始化,此时组件不接受任何指令和数据。 6.写数据指令 代码 R/W D/I 形式 0 1 DB7 D7 DB6 D6 DB5 D5 DB4 D4 DB3 D3 DB2 D2 DB1 D1 DB0 D0 D7∽D0为显示数据,此指令把D7∽D0写入相应的DDRAM单元,Y地指针自动加1。

7.读数据指令 代码 R/W D/I 形式 1 1 DB7 D7 DB6 D6 DB5 D5 DB4 D4 DB3 D3 DB2 D2 DB1 D1 DB0 D0 此指令把DDRAM的内容D7∽D0读到数据总线DB7∽DB0,Y地址指针自动加1。

由RAM 地址映射表可知LCD 显示屏由两片控制器控制,分别用CS1和CS2控制。每个内部带有X 位(512字节)的RAM 缓冲区,对应关系如图3所示。

11

LCD 128*点 IC1 8页*列 *点 IC2 8页*列 *点

图3 LCD地址映射图

整个屏幕分左、右两个屏,每个半屏右8页,每页有8行,注意数据是竖行排列。显示一个字要16*16点,全屏有128*个点,故可显示32个中文汉字。每两页显示一行汉字,可显示4行汉字,每行8个汉字,共32个汉字。而显示数据需要16*8个点,可显示数据是汉字的两陪。

屏幕是通过CS1、CS2两信号来控制的,不同的组合方式所选的屏幕是不同的,对应关系如表6所示。 CS1 0 0 1 1 CS2 0 1 0 1 表6 屏幕选择表

选屏 全屏 左屏 右屏 不选 2.5 LCD与单片机接口

AMPIRE128*液晶的引脚如表2所示: 管脚号 管脚名称 LEVER 1 2 3 4 CS1 CS2 GND VCC H/L H/L 0 +5.0V 管脚功能描述 H:选择芯片(右半屏)信号 H:选择芯片(左半屏)信号 电源地 电源电压 12

5 6 7 8 9 10 11 12 13 14 15 16 17 18 V0 RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 RST VOUT - H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L -10V 液晶显示器驱动电压 RS=“H”,表示DB7∽DB0为显示数据 RS=“L”,表示DB7∽DB0为显示指令数据 R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR或DR R/W=“L”,E信号下降沿锁存DB7∽DB0 R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 数据线 数据线 数据线 数据线 数据线 数据线 数据线 数据线 复位信号,低电平复位 LCD驱动负电压 表2 AMPIRE128*的引脚

在使用128LCD 前先必须了解以下功能器件才能进行编程。128 内部功能器件及相关功能如下:

1. 指令寄存器(IR)

IR 是用于寄存指令码,与数据寄存器数据相对应。当D/I=0 时,在E 信号下降沿的作用下,指令码写入IR。

2.数据寄存器(DR)

DR 是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1 时,在下降沿作用下,图形显示数据写入DR,或在E 信号高电平作用下由DR 读到DB7∽DB0 数据总线。DR 和DDRAM 之间的数据传输是模块内部自动执行的。

3.忙标志:BF

BF 标志提供内部工作情况。BF=1 表示模块在内部操作,此时模块不接受外部指令和数据。BF=0 时,模块为准备状态,随时可接受外部指令和数据。利用STATUS READ 指令,可以将BF 读到DB7 总线,从检验模块之工作状态。

4.显示控制触发器 DFF

13

此触发器是用于模块屏幕显示开和关的控制。DFF=1 为开显示(DISPLAY OFF),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。DDF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。

5.XY地址计数器

XY 地址计数器是一个9 位计数器。高3 位是X 地址计数器,低6 位为Y 地址计数器,XY 地址计数器实际上是作为DDRAM 的地址指针,X 地址计数器DDRAM 的页指针,Y 地址计数器为DDRAM 的Y地址指针。

X 地址计数器是没有记数功能的,只能用指令设置。

Y 地址计数器具有循环记数功能,各显示数据写入后,Y 地址自动加1,Y 地址指针从0 到63。

6.显示数据 RAM(DDRAM)

DDRAM 是存储图形显示数据的。数据为1 表示显示选择,数据为0 表示显示非选择。DDRAM 与地址和显示位置的关系见DDRAM 地址表。

7.Z 地址计数器

Z 地址计数器是一个6 位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST 复位后Z 地址计数器为0。

Z 地址计数器可以用指令DISPLAY START LINE 预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM 的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM 共 行,屏幕可以循环滚动显示 行。

2.6 电路设计图

电路设计图如图10所示:

14

图10 电路设计图

3 程序设计

3.1 keil简介

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

3.2 程序流程图

基于单片机的128液晶显示软件设计主要由显示子程序、读出并处理128LCD显示程序等组成。为了充分发挥ATC51优越的性能价格比,系统软件采用C语言编写以增强系统的实时性。在设计上尽量做到硬件“软化”,使系统硬件设计得到简化。程序流程图如图11所示。

15

开 始 LCD初始化 检测忙信号 左写指令子程序 左写数据子程序 右写指令子程序 右写数据子程序 LCD显示 清屏程序 延时程序 结 束

图11 程序流程图

3.3 128LCD主程序

3.3.1 引脚定义 sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2;

//RS为0---命令;1----数据 //RW为1---写;0---读 //使能端

sbit CS1=P2^1; //片选1低电平有效,控制左半屏 sbit CS2=P2^0; //片选1低电平有效,控制右半屏 sbit KEY1=P3^0; sbit KEY2=P3^1;

16

sbit KEY3=P3^2;

sbit KEY4=P3^3; //四个按键控制口 3.3.2读写操作

uchar Read_LCD(void) { }

void write_LCD_data(uchar dat)//写数据函数 {

Read_busy(); RS=1; RW=0;

17

//读数据函数

uchar value; Read_busy(); LCD_databus=0xFF; RS=1; RW=1; EN=1; _nop_(); _nop_(); EN=0;

LCD_databus=0xFF; RS=1; RW=1; EN=1;

value=LCD_databus; _nop_(); _nop_(); EN=0; return value;

//读取真正的数据

//先进行一次空读操作

//选择数据

LCD_databus=dat; EN=1; _nop_(); _nop_(); EN=0; }

3.3.3 设置指令

void Set_page(uchar page) 行点阵点 {

page=0xb8|page;

//页的首地址为0xB8

//设置“页”LCD128共8页,一页是8

//EN由1----0锁存有效数据

write_LCD_command(page); }

void Set_line(uchar startline) //设置显示的起始行 {

startline=0xC0|startline; //起始行地址为0xC0

write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示 }

void Set_column(uchar column) //设置显示的列 {

column=column &0x3f; column= 0x40|column;

//列的最大值为 //列的首地址为0x40 //规定显示的列的位置

write_LCD_command(column); }

void SetOnOff(uchar onoff) 开显示

//显示开关函数:0x3E是关显示,0x3F是

18

{

onoff=0x3e|onoff;

//onoff:1---开显示;0---关显示

write_LCD_command(onoff);

3.3.4 图形及汉字显示函数

void Display_HZ(uchar screen,uchar page,uchar column,uchar *p) {

uchar i;

SelectScreen(screen); Set_page(page);

//写上半页:16*8 //控制列

//控制16列的数据输出

Set_column(column*16); for(i=0;i<16;i++) { }

Set_page(page+1);

write_LCD_data(p[i]); //汉字的上半部分

//写下半页:16*8

//控制列

//控制16列的数据输出

Set_column(column*16);

for(i=0;i<16;i++) }

{ }

write_LCD_data(p[i+16]); //汉字的下半部分

void Display_picture(uchar a[][])//显示图形—128*大小 {

uchar i,j;

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

SelectScreen(1); Set_page(j);

19

}

Set_column(0); for(i=0;i<;i++) { }

SelectScreen(2); Set_page(j); Set_column(0); for(i=0;i<;i++) {

write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据 write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据

}

}

4 软件仿真

4.1 Proteus简介

Proteus软件是英国Labcenter electronics公司开发的EDA工具软件。它实现了从原理图设计、代码调试到单片机与外围电路的协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,可编译汇编语言,同时支持IAR、Keil和MPLAB等多种编译器。

该软件资源丰富,其中元器件资源有:数字和模拟、交流和直流等数千种元器件,有30多个元件库;仪表资源有:示波器、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表等。除了现实存在的仪器外,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多。这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。这些都尽可能减少了仪器对测量结果的影响。 4.2 汉字显示

20

汉字显示如图12所示,汉字滚动显示如图13所示。

图12 汉字显示 图13 汉字滚动显示

4.3 图形显示

图形显示如图14所示,图形滚动显示如图15所示。

图14 图形显示 图15 图形滚动显示

5 结论

本次论文的写作和设计的制作虽然没有特别的复杂,但是由于初次涉及这样的设计,没有任何的经验,过程还是倍感吃力的。首先就是LCD的选择,因为之前没有学习过这样的器件,算是一个新的概念,所以认识不全,有些不知所措。其次就是软件的编写,要得到正确的汉字以及图片的地址信息,花费了较长时间才找到相匹配的取模软件。然后研究如何获取正确的参数,其中图片的取模就很令我苦恼,最后在老师的辅导下才得以提取正确。程序有了之后,再进行相关的变换,最终得到新颖的效果。

在这次的毕业论文写作过程中虽然尝到了论文写作的困难,但是更重要的是让我感受到了它的魅力,不知不觉的就学到了很多平时未尝涉及的知识,特别是成功仿真后,着实有一种成就感。在此次过程中不仅巩固了我对Word及单片机的使用,同时也让我对LCD显示以及取模软件有了一个较为清晰的了解,弥补了我的一个盲区,使我有了知识和精神双方面的收获。

参考文献

[1] 徐晨,陈继红等.微机原理及应用[M].北京:机械工业出版社,1998: 167-169. [2] 阎焕忠, 王长涛, 马斌. 单片机控制里程转速表的设计[J].沈阳建筑工程学院学报(自

然科学版),2002,4:145-148.

21

[3] 张义和,陈敌北.例说8051[M].北京:人民邮电出版社,2006:146-161. [4] 周越.单片机技术实验实训教程[M].上海:中国水利水电出版社,2007. 112-113.

[5] 赵建领.Protel电路设计与制版宝典[M].上海:电子工业出版社,2007. 58-59. [6] 郭振民,丁红.电子设计自动化EDA[M].上海:中国水利水电出版社,2009. 267-268. [7] 张毅刚,彭喜源. MCS-51单片机应用设计[M].哈尔滨工业大学出版社,1997. 88-90. [8] 杰.单片机原理及应用[M].北京:机械工业出版社,1998. 24-25.

[9] 张毅刚.单片机原理及接口技术[M].哈尔滨:哈尔滨工业大学出版社,1990 .267-268. [10] 余锡存,曹国华.单片机原理及接口技术[M].西安:西安电子科技大学出版社,2000 . 35-36.

[11] 彭伟.单片机C语言教程设计实例[M].北京:电子工业出版 社,2009.126-127. [12] 郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009.351-353. [13] 郭文川.单片机原理与接口技术[M].北京:中国农业出版社,2007 .45-46. [14] 张齐.显示技术及单片机应用系统设计技术[M].北京:电子工业出版社 ,2004(2):284-285.

[15] Adel S Sedra,Kenneth C Smith.Microelectronic Circuits (6th ed) [M].New York:

Oxford University Press,2010:96-101.

[16] U Tietze,Ch Schenk.Electronic Circuits-Design and Application [M].New York:

Cambridge University Press,2004:~102.

[17] Intel.MCS-51 Family of Single Chip Microcomputers Users Manual[M].1990:58~162.

致谢

在本论文的写作过程中,指导教师马占卿老师倾注了大量的心血,从选题到开题报告,从写作提纲到一遍又一遍地指出每稿中的具体问题,他都严格把关、循循善诱。在此我表示衷心地感谢。同时我还要感谢在我学习期间给我极大关心和支持的各位老师以及关心和帮助过我的同学和朋友。

附录

#include #include #include\"source.h\"

22

#define uchar unsigned char #define uint unsigned int

#define LCD_databus P0 //LCD128的8位数据口

sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2;

//RS为0---命令;1----数据 //RW为1---写;0---读 //使能端

sbit CS1=P2^1; //片选1低电平有效,控制左半屏 sbit CS2=P2^0; //片选1低电平有效,控制右半屏 sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2;

sbit KEY4=P3^3; //四个按键控制口

void delay(uint i) { }

void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy {

P0=0x00;

while(--i);

RS=0; RW=1; }

void write_LCD_command(uchar command) //写命令函数

23

EN=1;

while(P0 & 0x80); EN=0;

{

Read_busy(); RS=0; RW=0;

//对LCD的每次读写都要读忙

//选择命令 //读操作

LCD_databus=command; EN=1; _nop_(); _nop_(); EN=0; }

/***********************写命令左***********************/ void write_cmd_1(uchar command) {

CS1=1;CS2=0;

Read_busy();

//对LCD的每次读写都要读忙

//EN由1----0锁存有效数据

RS=0; RW=0;

LCD_databus=command; _nop_(); _nop_(); EN=1;

//EN由1----0锁存有效数据

_nop_(); _nop_(); EN=0; }

/***********************写命令右***********************/ void write_cmd_2(uchar command) {

CS1=0;CS2=1;

24

Read_busy(); //对LCD的每次读写都要读忙

RS=0; RW=0;

LCD_databus=command;

_nop_();

_nop_(); EN=1;

//EN由1----0锁存有效数据

_nop_();

_nop_(); EN=0; }

void write_LCD_data(uchar dat)//写数据函数 {

Read_busy(); RS=1; RW=0;

LCD_databus=dat; EN=1; _nop_(); _nop_(); EN=0; }

uchar Read_LCD(void) {

//选择数据

//EN由1----0锁存有效数据

//读数据函数

uchar value; Read_busy(); LCD_databus=0xFF; RS=1;

25

//先进行一次空读操作

}

RW=1; EN=1; _nop_(); _nop_(); EN=0;

LCD_databus=0xFF; RS=1; RW=1; EN=1;

value=LCD_databus; _nop_(); _nop_(); EN=0; return value;

//读取真正的数据

void Set_page(uchar page) 行点阵点 {

page=0xb8|page;

//设置“页”LCD128共8页,一页是8

//页的首地址为0xB8

write_LCD_command(page); }

void Set_line(uchar startline) //设置显示的起始行 {

startline=0xC0|startline; //起始行地址为0xC0

write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示 }

26

void Set_column(uchar column) //设置显示的列 {

column=column &0x3f; column= 0x40|column;

//列的最大值为

//列的首地址为0x40 //规定显示的列的位置

write_LCD_command(column); }

void SetOnOff(uchar onoff) 开显示 { }

onoff=0x3e|onoff;

//显示开关函数:0x3E是关显示,0x3F是

//onoff:1---开显示;0---关显示

write_LCD_command(onoff);

void SelectScreen(uchar screen) //选择屏幕 {

switch(screen) {

case 0: CS1=0;CS2=0;break; //全屏 case 1: CS1=0;CS2=1;break;//左半屏 case 2: CS1=1;CS2=0;break;//右半屏 default:break; } }

void ClearScreen(uchar screen) //清屏函数 {

uchar i,j;

SelectScreen(screen);

//0--全屏;1---左半屏;2---右半屏

for(i=0;i<8;i++) //控制页数0-7,共8页

27

{

Set_page(i);

Set_column(0);

for(j=0;j<;j++) //控制列数0-63,共列

{

write_LCD_data(0x00); //写入0,地址指针自加1 } } }

void init_LCD() { }

void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p) {

//LCD的初始化

SetOnOff(1); SelectScreen(0);

//开显示

ClearScreen(0); Set_line(0);

//清屏

//开始行:0

uchar i;

SelectScreen(screen); Set_page(page); Set_column(column); for(i=0;i<8;i++) { }

Set_page(page+1); Set_column(column);

28

//显示字符上半部分:8*8

write_LCD_data(p[i]); //纵向取模,字节倒序

//显示字符下半部分:8*8

}

for(i=0;i<8;i++) { }

write_LCD_data(p[i+8]);

void Display_HZ(uchar screen,uchar page,uchar column,uchar *p) {

uchar i;

SelectScreen(screen); Set_page(page);

//写上半页:16*8 //控制列

//控制16列的数据输出

Set_column(column*16); for(i=0;i<16;i++) { }

Set_page(page+1);

write_LCD_data(p[i]); //汉字的上半部分

//写下半页:16*8

//控制列

//控制16列的数据输出

Set_column(column*16);

for(i=0;i<16;i++) }

{ }

write_LCD_data(p[i+16]); //汉字的下半部分

void Display_picture(uchar a[][])//显示图形—128*大小 {

uchar i,j;

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

29

}

SelectScreen(1); Set_page(j); Set_column(0); for(i=0;i<;i++) { }

SelectScreen(2); Set_page(j); Set_column(0); for(i=0;i<;i++) {

write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据 write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据

}

}

void Display_left(uchar a[][]) {

uchar i,j; for(j=0;j<8;j++) { }

30

SelectScreen(1); Set_page(j); Set_column(0); for(i=0;i<;i++) { }

write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据

}

void Display_right(uchar a[][]) { }

void key_scan(void) {

uchar i,j; for(j=0;j<8;j++) { }

SelectScreen(2); Set_page(j); Set_column(0); for(i=0;i<;i++) {

write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据

}

uchar i; if(KEY1==0) {

delay(5000); if(KEY1==0) {

while(!KEY1); ClearScreen(0);

Display_HZ(1,0+i,2,xin); Display_HZ(1,0+i,3,yang); Display_HZ(2,0+i,0,shi);

31

//按键1按下,显示汉字

}

}

Display_HZ(2,0+i,1,yuan); Display_HZ(1,2+i,1,dian); Display_HZ(1,2+i,2,ke); Display_HZ(1,2+i,3,ban); Display_HZ(2,2+i,0,zhang); Display_HZ(2,2+i,1,jia); Display_HZ(2,2+i,2,yi);

if(KEY2==0) {

//按键2按下,汉字向上滚动显示

delay(5000); if(KEY2==0) {

while(!KEY2); ClearScreen(0);

for(i=8;i>0;i--) //滚屏 {

Display_HZ(1,0+i,2,xin); Display_HZ(1,0+i,3,yang); Display_HZ(2,0+i,0,shi); Display_HZ(2,0+i,1,yuan); Display_HZ(1,2+i,1,dian); Display_HZ(1,2+i,2,ke); Display_HZ(1,2+i,3,ban); Display_HZ(2,2+i,0,zhang); Display_HZ(2,2+i,1,jia); Display_HZ(2,2+i,2,yi); delay(50000); ClearScreen(0);

32

}

}

Display_HZ(1,0+i,2,xin); Display_HZ(1,0+i,3,yang); Display_HZ(2,0+i,0,shi); Display_HZ(2,0+i,1,yuan); Display_HZ(1,2+i,1,dian); Display_HZ(1,2+i,2,ke); Display_HZ(1,2+i,3,ban); Display_HZ(2,2+i,0,zhang); Display_HZ(2,2+i,1,jia); Display_HZ(2,2+i,2,yi);

}

if(KEY3==0) { }

delay(5000); if(KEY3==0) { }

//按键3按下,显示图片

while(!KEY3); ClearScreen(0); for(i=0;i<;i++) { }

Display_left(BMP); Display_right(BMP);

if(KEY4==0) {

//按键4按下,图片向上滚动显示

33

}

}

delay(5000); if(KEY4==0) { }

while(!KEY4); ClearScreen(0); for(i=0;i<;i++) { }

Display_left(BMP); Display_right(BMP); write_cmd_1(0xc0|i); write_cmd_2(0xc0|i); delay(5);

void main() {

init_LCD();

//初始128 //清屏

ClearScreen(0); Set_line(0);

//显示开始行

Display_HZ(1,2,1,qing); Display_HZ(1,2,2,an); Display_HZ(1,2,3,button); Display_HZ(2,2,0,xuan); Display_HZ(2,2,1,ze);

Display_HZ(2,2,2,andsoon); //上电显示:“请按键选择…” while(1) {

key_scan();

34

}

}

35

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务