基于液晶显示单元的单片机仿真和c语言开发-课程设计说明书--大学毕业论文设计.doc
武汉理工大学单片机应用实践课程设计说明书课程设计任务书学生姓名: 专业班级: 电信 指导教师: 工作单位: 信息工程学院 1) 题 目:基于液晶显示单元的单片机实验和C语言开发初始条件: 具备单片机的理论知识;具备C语言编程能力;分析液晶显示的原理及实现;提供编程所需要的计算机一台要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、独立编写程序实现液晶显示2、分析并用仿真软件实现单片机液晶显示及循环移位3、完成符合学校要求的设计说明书时间安排:一周,其中3天程序设计,2天程序调试指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日20目录摘要11 概述22 软件、硬件介绍32.1 Proteus介绍32.2 Keil介绍32.3 字模提取软件介绍42.4 单片机AT89C51介绍42.5 液晶LCD12864介绍53 设计原理和方案73.1 设计原理73.2 设计步骤73.3 系统硬件电路原理图74 程序设计94.1 程序流程图94.2 实验程序105 仿真结果与分析165.1仿真结果95.2仿真结果分析106 实物展示157 心得体会178 参考文献199 本科生课程设计成绩认定表20 摘 要很多信息可以直接由数字表示,从而数字化信息显示又成为信息显示的又一个重要内容。本次课设是一种基于51单片机实时控制的LCD液晶显示屏循环显示系统。硬件系统由单片机最小系统和液晶显示系统组成。此次课程设计采用AT89C51型单片机和12864点阵型LCD液晶显示器来实现。LCD上要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。要想实现循环移动,只需不断改变图片的字模数据在液晶面板上的显示位置(RAM地址)即可。程序采用C语言编写,使用Keil编译器进行编译。关键字:51单片机 C语言编程 液晶显示 Proteus1 概述本次课设要求设计一种字符(或图形)液晶显示显示的电路,并实现循环移位显示给定字符串(或自行设计动态显示方式)。要求进行电路实验或仿真,并使用C语言进行程序的开发。在该系统中,通过单片机输入输出接口,利用单片机C语言编程模拟出LCD资料传输和显示所需时序,以实现对LCD的控制,使其显示各种复杂动态变化的图形。LCD显示器(LCD)具有功耗低、体积小、重量轻、超薄等其它显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。LCD可分为段位式LCD、字符式LCD和点阵式LCD。其中段位式LCD和字符式LCD只能用于字符和数字的简易显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线和汉字,并且可以实现屏幕上下左右滚动,动画功能,分区开窗口,反转,闪烁等功能,用途十分广泛。2 软件、硬件介绍2.1 Proteus介绍Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:(1)实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。(2)支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。(3) 提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。(4) 具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。Proteus单片机仿真的基本流程是搭建硬件系统(从元件库中挑选元器件,把元器件布置到仿真界面上,连线),编写控制程序,将程序转载到单片机,运行单片机系统,并检查、调试运行结果。2.2 Keil介绍Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。(1)系统概述 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。 (2)Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。 2.3 字模提取软件介绍字模提取软件是一款方便用户在编程中轻松算模的软件,该软件界面简洁,操作方便,而且深受到使用的人的极大表扬。可以自定义大小,能精准提取字模,用来提取字模的工具,很容易使用。轻松的生成C51或者A51的格式。2.4单片机AT89C51介绍AT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51是一种带2K字节闪存可编程可擦除只读存储器的 单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。引脚排列如图2.1所示。图2.1 AT89C51引脚图AT89C51 提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。2.5液晶LCD12864介绍本次课程设计使用12864LCD实现。12864LCD分为两种,带字库和不带字库的。本次仿真中的是不带字库的,做实物时用的是带字库的。 12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。下面以12864液晶显示器为例,介绍其用法。(1)12864LCD主要技术参数:电源:VDD 3.3V+5V(内置升压电路,无需负压);显示内容:128列× 64行显示颜色:黄绿显示角度:6:00钟直视逻辑工作电压(VDD):4.55.5V电源地(GND):0V工作温度(Ta):060(常温) / -2075(宽温)(2)12864液晶显示器的RAM地址映射12864点阵(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。下图为12864LCD引脚图。图2.2 12864LCD引脚图3 设计原理和方案3.1 设计原理试验中利用AT89C51控制LCD12864来显示个人的“单片机课程设计”字符及实验者名称,并实现上、下循环移位显示以及指示灯的循环移动。实验需要根据按键输入命令对液晶进行控制,不需要高速处理数据,因此选用单片机来做控制的核心。本次课设选用的单片机是AT89C51,软硬件结合,实现基于液晶单元的单片机仿真和C语言开发。AT89C51是整个设计的核心,通过程序的编写和执行,从而在液晶LCD12864上显示汉字和数字。试验中用到三个按键分别决定整体图形上移、下移以及指示灯的循环移动,当按下其中一个按键后,图形整体开始移动直至移动一个整循环后,按下另一个按键才能实现其他方向移动。每次移动一个整循环后,都能实现复位,即图形在原来的位置显示。3.2 设计步骤(1)运用Proteus设计出电路图;(2)运用字模型提取软件提取字模代码;(3)运用Keil生成可执行文件;(4)将可执行文件写入单片机中。3.3 系统硬件电路原理图系统硬件电路原理图如下图3.1所示,三个独立按键分别接单片机的P2.4、P2.5和P2.6接口,分别决定图形的整体上移和下移及指示灯循环移动,原理图包含AT89C51单片机,LCD12864液晶显示器,三个独立按键,一个二输入与非门,一个12M晶振,四个LED灯和若干电容电阻。LCD12864的DB70接P0口,按键信号通过P2.4、P2.5和P2.6输入,通过P0口及P2.0、P2.1、P2.2、P2.3信号输入,实现图形的上下移动,通过P1口输出控制指示灯循环移动的信号。上电复位:上电复位电路是种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。时钟电路:时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本文用的是内部时钟方式,通过12M晶振产生内部时钟。 4 程序设计4.1程序流程图开始适当延时,等待LCD复位LCD初始化 写入图片数据K3=0?K2=0?K1=0? N N N指示灯循环移动整屏向下循环移动整屏向上循环移动Y Y Y延时延时延时结束图4.1 程序设计流程图4.2 实验程序#include <reg51.h>#include<intrins.h>#include<stdlib.h> #include <absacc.h>#define DISPON 0x3f#define DISPOFF 0x3e #define FIRSTROW 0xc0 #define SETY 0xb8#define SETX 0x40#define LLCD_CMD_WR XBYTE0xf4f0#define LLCD_DAT_WR XBYTE0xf5f0#define LLCD_CMD_RD XBYTE0xf6f0#define LLCD_DAT_RD XBYTE0xf7f0#define RLCD_CMD_WR XBYTE0xf8f0#define RLCD_DAT_WR XBYTE0xf9f0#define RLCD_CMD_RD XBYTE0xfaf0#define RLCD_DAT_RD XBYTE0xfbf0sbit K1 = P24;sbit K2 = P25;sbit K3 = P26;sbit K4 = P27;void delay(unsigned char timer)unsigned char i;while(-timer)for(i=0;i<100;i+);code unsigned char logo=0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x41,0x40,0x54,0x55,0x01,0x55,0x54,0x54,0x41,0x7F,0xFF,0x7F,0x00,0xDB,0xDB,0xDB,0xDB,0x18,0x1B,0xFB,0xFB,0x9B,0x83,0x00,0xCB,0x1B,0x00,0xFE,0xFE,0x00,0x7F,0x7F,0xF6,0x04,0x05,0x20,0xA0,0x2A,0x00,0x00,0xAA,0xA0,0xB7,0x35,0x01,0x00,0x96,0x10,0x50,0x56,0x16,0x56,0x50,0x57,0xF7,0x06,0x05,0x7B,0xC8,0x8C,0x6E,0x2E,0x88,0xC8,0xFB,0xF6,0x04,0x05,0x77,0x77,0xF7,0x00,0x00,0xF7,0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFC,0xFC,0xFF,0xFF,0xFF,0xFF,0xFC,0xFC,0xFC,0xFF,0xFF,0xFF,0xFC,0xFC,0xFC,0xFF,0xFC,0xFC,0xFC,0xFC,0xFE,0xFC,0xFC,0xFE,0x7C,0x3D,0x1F,0x1C,0x3C,0x7D,0xFD,0xFD,0xFD,0xFC,0xFD,0xFD,0xFD,0xFF,0xFE,0xFC,0xFD,0xFC,0xFE,0xFE,0xFE,0xFC,0xFD,0xFD,0xFF,0xFC,0xFC,0xFE,0xFF,0xFF,0xFC,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xBF,0xBF,0xBF,0x1F,0xBF,0xBF,0xBF,0xBF,0xFF,0xFF,0x9F,0x9F,0x9F,0xDF,0xDF,0x1F,0x1F,0xDF,0xDF,0xDF,0x7F,0x7F,0x1F,0x7F,0x7F,0x7F,0x7F,0x1F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x5F,0x5F,0x5F,0x5F,0x5F,0x1F,0x5F,0x5F,0x5F,0x3F,0x3F,0xBF,0xBF,0x9F,0x9F,0xBF,0xBF,0xBF,0x3F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDE,0xD8,0xC8,0x82,0xB2,0xB2,0x8A,0xCA,0x80,0xB0,0xBE,0xBE,0x84,0xA5,0xBF,0xBF,0xBF,0x80,0x80,0xBF,0xBF,0xBF,0xE7,0xE0,0x80,0xD9,0xCB,0xE3,0xF0,0x80,0xF1,0xC7,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x3F,0x3F,0x3F,0x1F,0x1F,0x1F,0x0F,0x0F,0x07,0x03,0x00,0x00,0x80,0xC0,0xFC,0xFC,0xC0,0x80,0x00,0x00,0x01,0x07,0x0F,0x0F,0x0F,0x1F,0x1F,0x3F,0x3F,0x3F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xC0,0x80,0x80,0xC8,0xA0,0x80,0xC1,0xC1,0x80,0xA0,0xF7,0xF6,0xF6,0xB6,0xB6,0x80,0xC0,0xF6,0xF6,0xF6,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0x80,0x82,0x82,0x02,0x07,0x07,0x07,0x0F,0x1F,0xFF,0xFF,0x1F,0x0F,0x07,0x07,0x07,0x02,0x82,0x82,0x80,0xC0,0xC0,0xC0,0xE0,0xE0,0xE0,0xF0,0xF0,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0x0F,0x0F,0xEF,0xEF,0xEF,0xEF,0xFF,0x0F,0x0F,0xAF,0xAF,0xAF,0x2F,0x2F,0xAF,0xAF,0xAF,0x0F,0x0F,0x3F,0x3F,0xBF,0xBF,0xBF,0x8F,0x8F,0xBF,0xBF,0xBF,0x3F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xE0,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xE0,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xDF,0x0F,0xDF,0xDF,0xCF,0x1F,0x3F,0x3F,0x0F,0xEF,0x6F,0x2F,0x2F,0x0F,0x8F,0xAF,0xAF,0xAF,0xAF,0x2F,0x2F,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xBD,0xBD,0xBD,0xBD,0x80,0x80,0xBD,0xBD,0xBD,0xBD,0xBF,0x80,0x80,0xD6,0xD6,0xD6,0xD0,0xD0,0xD4,0xD2,0xD6,0x80,0x80,0xF7,0xF6,0xF6,0xB6,0xB6,0x80,0x80,0xF6,0xF6,0xF6,0xF6,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xE0,0xC0,0xC0,0xE0,0xF0,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0xC2,0xCE,0x80,0x80,0xB6,0xA6,0xB3,0xB8,0xB8,0xA1,0xA7,0xDB,0x8B,0x82,0xAA,0x8A,0x8A,0xCA,0x82,0xA2,0xAA,0x8A,0x8B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;void check_busy(unsigned char);void lcd_init(void);void lcd_cmd_wr(unsigned char, unsigned char);void lcd_data_wr(unsigned char, unsigned char);void lcd_bmp_wr(unsigned char *bmp);void lcd_clr(void);void lcd_mov_up();void lcd_mov_down();void main(void)delay(5000);lcd_init();lcd_bmp_wr(logo);while(1) if(K1=0)delay(50000);lcd_mov_up();lcd_clr();delay(1000);lcd_bmp_wr(logo);elseif(K2=0)delay(5000);lcd_mov_down();lcd_clr();delay(1000);lcd_bmp_wr(logo);if(K3=0)unsigned char a=0x11,j=0;while(j<=100)P1=a;a=_crol_(a,1);delay(1000); void check_busy(unsigned char right)unsigned char temp=0xff;doif(right) temp=RLCD_CMD_RD;else temp=LLCD_CMD_RD;while(temp|0x7f)=0xff);void lcd_cmd_wr(unsigned char cmdcode, unsigned char right)check_busy(right);if(right) RLCD_CMD_WR = cmdcode;else LLCD_CMD_WR = cmdcode;void lcd_init(void)lcd_cmd_wr(DISPON,0); lcd_cmd_wr(FIRSTROW,0); lcd_cmd_wr(SETY,0); lcd_cmd_wr(SETX,0);lcd_cmd_wr(DISPON,1);lcd_cmd_wr(FIRSTROW,1);lcd_cmd_wr(SETY,1);lcd_cmd_wr(SETX,1);void lcd_data_wr(unsigned char dispdata, unsigned char right)check_busy(right);if(right) RLCD_DAT_WR = dispdata;else LLCD_DAT_WR = dispdata;void lcd_clr(void)unsigned char i,j;for(i=0;i<8;i+)lcd_cmd_wr(SETY+i,0);lcd_cmd_wr(SETX,0);lcd_cmd_wr(SETY+i,1);lcd_cmd_wr(SETX,1);for(j=0;j<64;j+)lcd_data_wr(0,0);lcd_data_wr(0,1);void lcd_bmp_wr(unsigned char *bmp)unsigned char i,j;for(i=0;i<8;i+)lcd_cmd_wr(SETY+i,0);lcd_cmd_wr(SETX,0);lcd_cmd_wr(SETY+i,1);lcd_cmd_wr(SETX,1);for(j=0;j<64;j+)lcd_data_wr(bmp128*i+j,0);lcd_data_wr(bmp128*i+j+64,1);void lcd_mov_up()unsigned char i;for(i=0;i<64;i+)lcd_cmd_wr(FIRSTROW+i,0);lcd_cmd_wr(FIRSTROW+i,1);delay(500);void lcd_mov_down()unsigned char i;for(i=64;i>0;i-)lcd_cmd_wr(FIRSTROW+i,0);lcd_cmd_wr(FIRSTROW+i,1);delay(500);5 仿真结果与分析5.1 仿真结果 如图5.1所示为实验初始仿真图图5.1实验初始仿真图5.2 仿真结果分析不按键时,液晶屏显示“danpianji”字符和实验者名字;当K1按下时,字符按照由下到上的方向自动滚动,图片循环显示,仿真结果与实验期望一致,故可以认为仿真结果正确;当K2按下时,字符按照由上到下的方向自动滚动,仍然循环显示:当K3按下时,LED灯循环发光。仿真结果与程序设计流程一致,完成程序所要实现的功能。6 实物展示下图为实物图: 图6.1 实物图7 心得体会 几天的课程设计在忙忙碌碌中度过,总的来说,这次的单片机课程设计让我学到了很多的东西。在此次课设中,我学习了如何使用取字模软件,如何使用Keil生成可执行文件供单片机使用后,如何使用Protues来设计电路,如何使用51单片机芯片来组成电驴,并与LCD液晶显示相结合,以及怎样用C语言编写程序以用单片机进行控制,特别是器初始化方面上,读写功能是液晶显示部分的重中之重,实验中还应注意LCD12864各引脚的功能。在实际焊接电路的过程中,又学会了怎么把已经写好的程序写进芯片里。对于这次课设的具体收获,总的感觉有四点:1、对理论知识有了一个很好的巩固,从实际动手中理解通信系统方方面面的知识;2、锻炼了我们的团队合作精神。由于是3人合完成一个系统,设计到分工合作的问题,通过这次的锻炼,也让我们充分知道了分工合作的重要性,对我们以后出社会是一次很好的锻炼;3、对仿真软件protues有了更进一步的了解。在实际的摸爬滚打中学习仿真软件比拿着一本书对着电脑学习兴趣来的更高,效率也来的快;4、对我的动手能力有了进一步的提高,焊电路,检查电路等实际操作过程不再像以前那样毫无计划只知靠一股冲劲,对函数信号发生器及示波器的操作也更加的得心应手了。 平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西。平时看课本,这次看了,下次就忘了,认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。 在本次的课程设计中,我们虽然遇到了很多问题,但通过自身不懈的努力和在老师的帮助下,我们也算比较成功的完成了设计任务,同时也学到了不同的解决问题的方法,也获得了许多宝贵的经验和体会。总的说来,这次课程设计是一次相当有意义的实践活动,真心希望这样的活动多一些!8 参考文献1 马忠梅.单片机的C语言应用程序设计.北京航空航天大学出版社.20032 吴金戌.8051单片机实践与应用.清华大学出版社.20023 赵亮.单片机C语言编程与实例.人民邮电出版社.20034 李华.MCS-51系列单片机实用接口技术.北京航空航天大学出版社.20015 李朝清.单片机原理及应用.北京航空航天大学出版社.2001