(完整版)12864lcd显示部分试验总结报告

合集下载

12864液晶屏资料总结

12864液晶屏资料总结

12864液晶屏资料总结一、概述JM12864M-2汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16*16点阵)、128个字符(8*16点阵)及64X256点阵显示RAM(GDRAM)。

外观尺寸:93×70×12.5mm 视域尺寸:73×39mm二、引脚三、时序图1、写资料2、读出资料四、指令集表一:最常用的指令(单独列出,包含于表二)五、电路图完整电路图见PCB文件,此处忽略程序存储器部分。

用P1口和液晶屏的数据口相连。

也可以用P0口,但是使用P0口要加上拉电阻,增加了电路的复杂性。

液晶屏的3口为驱动电压的输入端,此处用20K的可调电阻调整3口的电压值。

电路连接完成并通电后,旋转可调电阻的旋钮,直至屏上在没有任何程序驱动时,可以清晰显示一个个小方格为止。

六、厂家提供的程序及其说明/****************************************液晶型号:JM12864M-2(字库)驱动芯片:ST7920MCU:AT89C51*****************************************|P2.0---RS |P1===DB0~DB7|P2.1---R/W|P2.2---E|P2.3---PSB*****************************************/#include <at89x51.h>#include <intrins.h>sbit Ldi = P2^0;sbit Lrw = P2^1;sbit Le = P2^2;sbit Lpsb = P2^3;#define Ldata P1unsigned char code group[] ={略};unsigned char code Photo1[32][16] ={略};unsigned char code Photo2[32][16] ={略};/*********************************************************************************************/ /*函数名:Delay100us () */ /*函数功能:延时*/ /*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void Delay100us(){unsigned char temp;for(temp=0; temp<255; temp++);}/*********************************************************************************************//*函数名:DelayMs () */ /*函数功能:延时*/ /*参数:num */ /*返回值:无*/ /*********************************************************************************************/ void DelayMs(unsigned int num){while(num--){unsigned char temp;for(temp=0; temp<125; temp++);}}/*********************************************************************************************/ /*函数名:Busy () *//*函数功能:查忙*//*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void Busy(){Ldi=0;Lrw=1;while(1){Le=1;if(Ldata<0x80)break; //说明:见指令集中“读取状态字”,判断是否BUSYLe=0;}Le=0;}/*********************************************************************************************/ /*函数名:Whitecommand()*/ /*函数功能:写指令*/ /*参数:com */ /*返回值:无*/ /*********************************************************************************************/ void Whitecommand(unsigned char com){Busy();Ldi = 0;Lrw = 0;Le = 1;Ldata = com; //RS、R/W为0,这种状态下可设置行、列地址和页面地址Le = 0;}/*********************************************************************************************/ /*函数名:Whitedata()*/ /*函数功能:写数据*/ /*参数:dat */ /*返回值:无*/ /*********************************************************************************************/ void Whitedata(unsigned char dat){Busy();Ldi = 1;Lrw = 0;Le = 1;Ldata = dat; // RS为1、R/W为0,见指令集中“写显示数据”Le = 0;}/*********************************************************************************************/ /*函数名:Init (void) */ /*函数功能:LCD初始化操作*/ /*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void Init(){Lpsb = 1;Delay100us();Whitecommand(0x30); //基本指令集动作Delay100us();Whitecommand(0x0c); //整体显示开Delay100us();Whitecommand(0x01); //清楚显示,清屏Delay100us();Whitecommand(0x06); //}/*********************************************************************************************/ /*函数名:Whiteword (void) */ /*函数功能:写汉字*/ /*参数:无*//*返回值:无*/ /*********************************************************************************************/ void Whiteword(){unsigned char temp = 0;Whitecommand(0x80);for(;temp<64;){Whitedata(group[temp++]);_nop_();}}/*********************************************************************************************/ /*函数名:WhitePhoto */ /*函数功能:画图*/ /*参数:unsigned char page, unsigned char Photo[32][16] */ /*返回值:无*/ /*********************************************************************************************/ void WhitePhoto(unsigned char page,unsigned char Photo[32][16]){unsigned char row,line;for(line=0; line<32; line++){Whitecommand(0x80|line); //行地址设置Whitecommand(0x80|page); //页面地址设置for(row=0; row<16; row++){Whitedata(Photo[line][row]);}}}/*********************************************************************************************/ /*函数名:main()*/ /*函数功能:主函数*/ /*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void main(){DelayMs(400);Init(); //初始化do{Whitecommand(0x30); //基本指令集Delay100us();Whitecommand(0x01); //清除显示Delay100us();Whiteword(); //显示字段DelayMs(2000);Whitecommand(0x01); //清除显示Delay100us();Whitecommand(0x32); //选择基本指令集中的动作,绘图显示关Delay100us();Whitecommand(0x36); //选择扩充指令集中的动作,绘图显示开Delay100us();WhitePhoto(0, Photo1); //显示图片WhitePhoto(8, Photo2);DelayMs(2000);}while(1);}七、自编的程序及说明#include <reg51.h>#include <intrins.h>sbit Ldi = P3^0;sbit Lrw = P3^1;sbit Le = P3^2;#define Ldata P1int a;code char STR1[]= "东南大学SEU";code char STR2[]= "机械工程学院ME";code char STR3[]= "机械电子系";code char STR4[]= "张荔050154";void Delay100us(){unsigned char temp;for(temp=0; temp<255; temp++);}void DelayMs(unsigned int num){while(num--){unsigned char temp;for(temp=0; temp<125; temp++);}}void Busy(){Ldi=0;Lrw=1;while(1){Le=1;a=Ldata;if(Ldata<0x80)break;Le=0;}Le=0;}void Whitecommand(unsigned char com) {Busy();Ldi = 0;Lrw = 0;Le = 1;Ldata = com;Le = 0;}void Whitedata(unsigned char dat){Busy();Ldi = 1;Lrw = 0;Le = 1;Ldata = dat;Le = 0;}void Init(){Delay100us();Whitecommand(0x30);Delay100us();Whitecommand(0x0c);Delay100us();Whitecommand(0x01);Delay100us();Whitecommand(0x06);}void Whiteword(unsigned char *ptr,unsigned char line) {unsigned char i,l;l=0;switch (line){case 1:Whitecommand(0x80);break;case 2:Whitecommand(0x90);break;case 3:Whitecommand(0x88);break;case 4:Whitecommand(0x98);}while ((ptr[l])!='\0'){l++;}for (i=0;i<l;i++){Whitedata(ptr[i]);_nop_();}}void main(){Ldata=0;DelayMs(400);Init();do{Whitecommand(0x30);Delay100us();Whitecommand(0x01);Delay100us();Whiteword(STR1,1);Whiteword(STR2,2);Whiteword(STR3,3);Whiteword(STR4,4);DelayMs(2000);}while(1);}。

液晶显示器实训实验报告

液晶显示器实训实验报告

一、实验目的1. 理解液晶显示器(LCD)的基本工作原理和组成结构。

2. 掌握液晶显示器驱动电路的设计与调试方法。

3. 熟悉液晶显示器的接口技术及其与单片机的连接方式。

4. 通过实验验证液晶显示器的显示功能,并实现简单图形和文字的显示。

二、实验原理液晶显示器(LCD)是一种利用液晶材料的光学各向异性来实现图像显示的设备。

它主要由液晶层、偏光片、电极阵列、驱动电路等部分组成。

液晶分子在电场作用下会改变其排列方向,从而改变通过液晶层的光的偏振状态,实现图像的显示。

三、实验器材1. 液晶显示器模块(如12864 LCD模块)2. 单片机开发板(如STC89C52单片机)3. 电源模块4. 连接线5. 实验平台(如面包板)四、实验内容1. 液晶显示器模块的识别与检测首先,对所购买的液晶显示器模块进行外观检查,确保无损坏。

然后,根据模块说明书,连接电源和单片机开发板,进行初步的检测。

2. 液晶显示器驱动电路的设计与调试根据液晶显示器模块的技术参数,设计驱动电路。

主要包括以下部分:- 电源电路:将单片机提供的电压转换为液晶显示器所需的电压。

- 驱动电路:负责控制液晶显示器模块的行、列电极,实现图像的显示。

- 接口电路:将单片机的信号与液晶显示器的控制信号进行连接。

在设计电路时,需要注意以下几点:- 电源电压要稳定,避免对液晶显示器模块造成损害。

- 驱动电路的驱动能力要足够,确保液晶显示器模块能够正常显示。

- 接口电路的信号传输要可靠,避免信号干扰。

设计完成后,进行电路调试,确保电路正常工作。

3. 液晶显示器的控制程序编写根据液晶显示器模块的控制指令,编写控制程序。

主要包括以下部分:- 初始化程序:设置液晶显示器的显示模式、对比度等参数。

- 显示程序:实现文字、图形的显示。

- 清屏程序:清除液晶显示器上的显示内容。

在编写程序时,需要注意以下几点:- 控制指令要正确,避免对液晶显示器模块造成损害。

- 程序要简洁,易于调试和维护。

lcd显示实验报告

lcd显示实验报告

lcd显示实验报告LCD显示实验报告概述:本次实验旨在研究和探究液晶显示技术的原理和应用。

液晶显示器(LCD)是一种广泛应用于电子设备中的平面显示技术,其优点包括低功耗、高对比度、视角广等特点。

通过实验,我们将深入了解LCD的工作原理以及其在各种设备中的应用。

实验步骤:1. 实验前准备在实验开始前,我们需要准备一块LCD显示屏、适配器、电源线以及连接所需的电缆。

2. 实验搭建将LCD显示屏与适配器通过电缆连接,并将电源线插入适配器和电源插座之间。

确保所有连接牢固可靠。

3. 实验操作打开电源开关,观察LCD显示屏是否正常亮起。

如果显示屏亮起,说明连接成功。

4. 实验观察观察LCD显示屏上的图像、文字或图标是否清晰可见。

注意观察显示屏的对比度、颜色鲜艳度以及视角范围等特点。

5. 实验分析通过对比实验观察到的LCD显示效果,我们可以得出以下结论:- LCD显示屏的图像清晰度和对比度较高,能够呈现出细节丰富的图像。

- LCD显示屏的颜色鲜艳度较高,能够准确还原图像的真实色彩。

- LCD显示屏的视角范围较广,观察者可以从不同角度观察屏幕上的内容而不会出现明显的颜色变化或失真。

实验原理:液晶显示器的工作原理是利用液晶分子的光学性质来调节光的透过程度。

液晶分子在电场的作用下会发生旋转或排列,从而改变光的透过程度,进而形成图像。

液晶显示器主要由两层玻璃基板构成,中间夹层有液晶分子。

在两层玻璃基板上分别涂有透明电极,并通过透明电极与外部电源相连。

当外部电源施加电压时,电场作用下液晶分子发生旋转或排列,从而改变光的透过程度。

液晶显示器通常由红、绿、蓝三种基本颜色的像素组成,通过控制每个像素的电压来调节颜色的深浅和亮度。

通过对不同像素的电压控制,液晶显示器能够呈现出丰富多彩的图像。

应用领域:液晶显示器已广泛应用于各种电子设备中,包括但不限于以下领域:1. 个人电脑和笔记本电脑:作为主要的显示设备,液晶显示器提供了清晰、高对比度的图像,使用户能够更好地操作和浏览信息。

LCD12864报告

LCD12864报告

引言单片机即微型计算机。

是集成CPU,RAM,ROM,定时器,计数器和多种接口于一体的微控制器,它体积小,成本低,功能强大,广泛应用于智能产品和工业自动化上,而51单片即是各单片机中最为典型的一种。

本次课程设计就是通过对他的学习应用,从而达到学习,设计,开发软、硬件的能力。

LCD液晶显示系统就是基于单片机的最小系统下所构建的一个功能系统,通过软、硬件的结合,实现LCD12864模块对数字,汉字,英文及图片的显示,来实现数据的输出显示和人及对话等高级功能。

1液晶显示系统简介1.1 主要功能本次课程设计能实现的功能如下:1.本电路为液晶显示系统。

2.通过电位器可对液晶的背光进行明暗调节。

3.可以实现对数字,汉字,英文以及图片的显示。

1.2 主要器件及介绍1.2.1主控模块STC89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。

它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。

89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

此外,80C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。

在空闲模据,时钟振荡停止,同时停止芯片内其它功能。

如下图所示STC89C52RC实物图(图1-1)和引脚图(图1-2)编辑本段主要功能特性:·标准MCS-51内核和指令系统·片内8kROM(可扩充64kB外部存储器)· 32个双向I/O口· 256x8bit内部RAM(可扩充64kB外部存储器)· 3个16位可编程定时/计数器·时钟频率3.5-12/24/33MHz·向上或向下定时计数器·改进型快速编程脉冲算法· 6个中断源· 5.0V工作电压·全双工串行通信口·布尔处理器—帧错误侦测· 4层优先级中断结构—自动地址识别·兼容TTL和CMOS逻辑电平·空闲和掉电节省模式图1-1 STC89C52RC实物图图1-2 STC89C52RC引脚图1.2.2 LCD12864液晶模块带中文字库的TS128X64(图1-3)是一种具有4位/8位并行、2线或3线串行多种接口方式,引脚功能见图表1-4,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

实验三 LCD12864液晶显示

实验三  LCD12864液晶显示

实验三 LCD12864液晶显示参赛序号实验题目LCD12864液晶显示实验成组员左虎博杨颂王志鹏指导教师赵勇报告日期2014年7月16日-2014年7月18日摘要:本设计以超低功耗MSP430单片机为微控制器,以4位/8位并行,2线或3线串行多种接口方式的LCD12864为输出显示器。

通过对MSP430单片机进行编程,在LCD12864上显示8×4行16×16点阵的汉字。

关键字:MSP430 LCD12864目录一.方案论证 (4)液晶显示器的论证与选择 (4)二.LCD12864的工作原理 (4)1.引脚功能说明 (4)LCD12864采用20接口,各引脚接口说明如表3所示: (4)2. 指令说明 (5)三.实验框图和电路图 (7)1. 系统框图 (7)2. 电路原理图 (7)四.实验程序设计 (7)五.系统测试 (11)1. 测试方案 (11)2. 测试结果 (11)3. 测试分析与结论 (12)一.方案论证液晶显示器的论证与选择方案一:采用带中文字库的LCD12864。

LCD12864具有4 位/8 位并行、2 线或3 线串行多种接口方式,可以显示8×4 行16×16 点阵的汉字。

也可完成图形显示。

低电压低功耗是其一显著特点。

方案二:采用LCD1602。

LCD1602显示内容为16X2,即可以显示两行,每行16个字符液晶模块,只能显示字符和数字。

通过论证可知LCD12864显示内容多,功能多,低电压低功耗,因此选用方案一。

二.LCD12864的工作原理1.引脚功能说明LCD12864采用20接口,各引脚接口说明如表1所示:表1 引脚说明表管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整4 RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5 R/W(SID)H/LR/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线表1 引脚说明表注释1:如在实际应用中仅使用串口通讯模式,可将PSB 接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

128×64LCD液晶显示设计报告

128×64LCD液晶显示设计报告

电子信息学院实验报告书课程名:"微机原理与接口技术"题目: 128×64LCD液晶显示设计实验类别【综合】班级:学号:姓名:一.概述21.1设计背景21.2课程设计的目的和意义 (2)1.3课程设计的容 (2)二.课程设计的步骤与方法 (3)2.1系统硬件设计32.11控制模块32.12 显示模块32.13电源模块52.2系统软件设计62.21系统流程图62.22系统时序图72.3系统调试7三.设计结论7四.收获与体会7参考文献:8附录一:程序清单8附录二:实验仪器16一.概述1.1设计背景液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。

以往的测控仪器的显示局部大都采用LED式液晶显示屏进展参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。

而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比较的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。

1.2课程设计的目的和意义〔1〕了解点阵式液晶显示器工作原理和显示方法。

〔2〕掌握8088微机系统与液晶显示器之间接口设计与编程。

1.3课程设计的容利用取模软件建立标准字库,编制程序,在液晶显示器上显示汉字。

二.课程设计的步骤与方法采用已有的DJ-598K三合一单片机微机试验仪作为设计平台来构建系统,以减少设计工作量。

2.1系统硬件设计2.11控制模块硬件构造应结合软件方案一并考虑,做到软件、硬件功能相匹配。

在DJ-598K三合一单片机微机试验仪上,硬件设计参考方案如下:2.12 显示模块图2.12显示模块的原理图LCM12864ZK中文图形液晶显示模块的液晶屏幕为128×64 ,可显示四行,每行显示8 个汉字。

128×64点阵式LCD显示屏实验设计报告

128×64点阵式LCD显示屏实验设计报告

自动化专业综合课程设计1课程设计报告系别:机电与自动化学院专业班级:自动化0902学号:20091184077学生姓名:王威指导教师:李川香(课程设计时间:2012 年月日——2012年月日)华中科技大学武昌分校目录1 课程设计目的 (2)2 课程设计题目描述和要求 (2)3 课程设计报告内容 (2)3.1 系统软、硬件功能设定(分工方案) (2)3.2 系统硬件电路介绍 (2)3.2.1 系统硬件电路框图 (6)3.2.2 LCD显示基本原理 (7)3.2.3 接线方法 (7)3.2.4 管脚应用说明 (7)3.3 系统软件介绍 (8)3.3.1 系统软件流程 (9)3.3.2 读写操作时序 (11)3.3.3 液晶显示模块指令系统 (13)3.3.4 指令应用说明 (14)3.4 系统软、硬调试过程 (16)4.总结 (16)参考文献 (17)附录 (18)1 课程设计目的通过电路结构选择、控制方式选择、参数计算、器件选型、硬件制作及软件编程调试等训练切实培养学生综合应用知识、正确分析问题、解决问题的能力,特别是实际动手和创新能力,将自动化专业知识进行整合,融会贯通。

2课程设计题目描述和要求设计题目:LCD显示器显示界面的设计信息时代各种信息最终都是要通过信息显示来实现人、机交换,而信息的显示依赖于各种显示器件的应用,由于液晶显示器(LCD)具有低工作电压、微功耗、显示灵活、成本低等特点,因此在电子计算器、智能化仪器仪表、手机、掌上电脑等等领域应用极为广泛。

(1)了解128X64液晶显示器的基本结构、电路特性、软件特性、接口应用技术等;(2)在(1)基础上能根据实际工作需要,进行液晶显示界面的任意开发;如:要求每位同学在液晶(LCD)上显示自己的学号(数字)、姓名(中文)等;(3)撰写课程设计说明书。

说明书中要求有主程序流程图、关键子程序流程图及应用系统硬件电路图;(4)总结调试过程中出现的问题及解决办法。

12864lcd显示部分试验总结报告

12864lcd显示部分试验总结报告

12864lcd显示部分试验总结报告管岱2014.12.19【实验目的】在12864液晶显示屏上能够显示出在4×4小键盘上输入的激励源频率值,如输入“789HZ”、“8MHZ”、“2.3KHZ”,显示出“789H”、“8M”、“2.3K”。

并且要求此部分程序有较好的可移植性,在最后对电阻率值的显示上能够较好的应用。

【实验原理】12864-3A接口说明表:在12864液晶显示原理的基础上,通过在ise上编写vhdl语言,使之能够在fpga学习板上顺利显示数据。

【实验内容】12864的显示原理并不难理解,并且在以前也用汇编语言实现过,所以本次实验的难点不在于显示原理的理解,而在于VHDL语言的编写。

在实验初期,由于对vhdl语言的不熟练,我们“类比”汇编语言的显示程序,编写出如下的程序:发现编译时就出现了问题,出现如“multi-source in unit <*> on signal <*>”的报错。

在仔细调试检查后发现,我们错误的原因在于:在不同的进程中对同一个信号赋值。

例如,在写指令的进程中,将rs信号置‘0’,而在后面写数据的进程中又将rs置‘1’,由于在vhdl中各进程之间是并行的关系,因此这样编写程序会出现在同一时刻对同一个引脚赋高电平和低电平,从而出现矛盾。

虽然在程序实际运行中,写指令进程在系统一上电就会完成,远早于写数据进程,但是在逻辑上这样编写是不符合VHDL语言的规则的。

因此,我们利用状态机的思想,将写指令和写数据的两个进程合二为一。

程序片段如下:利用状态机,将写指令和写数据的各个步骤分为一个一个分立的状态,顺序执行。

这样编写将对同一个引脚信号的变化放在一个进程中,很好的解决了之前存在的问题。

并且受此启发,在写数据的程序段,对百位、十位、个位以及单位的译码程序中,将原本分别对各自数位信号敏感的四个单独进程改成了受一个的时钟上升沿敏感的一个进程,从而较好的保证了程序的时序性和同步性,经实验验证效果良好。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

12864lcd显示部分试验总结报告管岱2014.12.19【实验目的】在12864液晶显示屏上能够显示出在4×4小键盘上输入的激励源频率值,如输入“789HZ”、“8MHZ”、“2.3KHZ”,显示出“789H”、“8M”、“2.3K”。

并且要求此部分程序有较好的可移植性,在最后对电阻率值的显示上能够较好的应用。

【实验原理】12864-3A接口说明表:在12864液晶显示原理的基础上,通过在ise上编写vhdl语言,使之能够在fpga学习板上顺利显示数据。

【实验内容】12864的显示原理并不难理解,并且在以前也用汇编语言实现过,所以本次实验的难点不在于显示原理的理解,而在于VHDL语言的编写。

在实验初期,由于对vhdl语言的不熟练,我们“类比”汇编语言的显示程序,编写出如下的程序:发现编译时就出现了问题,出现如“multi-source in unit <*> on signal <*>”的报错。

在仔细调试检查后发现,我们错误的原因在于:在不同的进程中对同一个信号赋值。

例如,在写指令的进程中,将rs信号置‘0’,而在后面写数据的进程中又将rs置‘1’,由于在vhdl中各进程之间是并行的关系,因此这样编写程序会出现在同一时刻对同一个引脚赋高电平和低电平,从而出现矛盾。

虽然在程序实际运行中,写指令进程在系统一上电就会完成,远早于写数据进程,但是在逻辑上这样编写是不符合VHDL语言的规则的。

因此,我们利用状态机的思想,将写指令和写数据的两个进程合二为一。

程序片段如下:利用状态机,将写指令和写数据的各个步骤分为一个一个分立的状态,顺序执行。

这样编写将对同一个引脚信号的变化放在一个进程中,很好的解决了之前存在的问题。

并且受此启发,在写数据的程序段,对百位、十位、个位以及单位的译码程序中,将原本分别对各自数位信号敏感的四个单独进程改成了受一个的时钟上升沿敏感的一个进程,从而较好的保证了程序的时序性和同步性,经实验验证效果良好。

【实验改进】最初的设想是三位有效数字(k1、k2、k3),加上一个单位(hz、khz、mhz)就能够满足大部分数字范围。

但是后来发现这样不能实现例如“1200HZ”的数据。

因此改进实验程序,加入小数点。

在十位的译码程序中加入对小数点的译码,这样当输入第二位时按下小数点的按键,就能在显示屏上显示出小数点,且不影响其它位显示。

因此若要显示“1200HZ”的频率,则可显示出“1.2 K”。

【实验体会】对不熟悉的编程语言,我们不能拿别的语言的相关程序来生搬硬套,不能用别的语言的思维来考虑本语言的编程。

在VHDL语言中,“进程”的思想十分重要,进程之间相互并行的特点既可以帮助我们利用模块化的思想编写程序,但同时也给不熟悉VHDL的人带来了困难。

多阅读程序,多练习编程,多理解本语言的思想,不仅对VHDL语言是这样,在今后学习其他语言也是同样的道理。

【实验代码】library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;use ieee.numeric_std.all;ENTITY lcd12864 ISPORT (clk : IN std_logic;--reset : IN std_logic;rs : OUT std_logic;rw : OUT std_logic;en : OUT std_logic;dat : OUT std_logic_vector(7 DOWNTO 0);--rst : OUT std_logic);LCD_N : OUT std_logic;LCD_P : OUT std_logic;PSB : OUT std_logic;LCD_RST : OUT std_logic;-----------------------------------------------------------------------------------------------------------k1 : in std_logic_vector(7 downto 0);k2 : in std_logic_vector(7 downto 0);k3 : in std_logic_vector(7 downto 0);k4 : in std_logic_vector(7 downto 0));---------------------------------------------------------------------------------------------------------END lcd12864;ARCHITECTURE fun OF lcd12864 IS--//状态定义SIGNAL e : std_logic;SIGNAL counter : std_logic_vector(15 DOWNTO 0);SIGNAL current : std_logic_vector(7 DOWNTO 0);SIGNAL clkr : std_logic;SIGNAL cnt : std_logic_vector(1 DOWNTO 0);CONSTANT set0 : std_logic_vector(7 DOWNTO 0) := "00000000";CONSTANT set1 : std_logic_vector(7 DOWNTO 0) := "00000001";CONSTANT set2 : std_logic_vector(7 DOWNTO 0) := "00000010";CONSTANT set3 : std_logic_vector(7 DOWNTO 0) := "00000011";CONSTANT set4 : std_logic_vector(7 DOWNTO 0) := "00100101";CONSTANT set5 : std_logic_vector(7 DOWNTO 0) := "00100110";DOWNTO 0) := "00000100";CONSTANT dat1 : std_logic_vector(7 DOWNTO 0) := "00000101";CONSTANT dat2 : std_logic_vector(7 DOWNTO 0) := "00000110";CONSTANT dat3 : std_logic_vector(7 DOWNTO 0) := "00000111";CONSTANT dat4 : std_logic_vector(7 DOWNTO 0) := "00001000";CONSTANT dat5 : std_logic_vector(7 DOWNTO 0) := "00001001";CONSTANT dat6 : std_logic_vector(7 DOWNTO 0) := "00001010";CONSTANT dat7 : std_logic_vector(7 DOWNTO 0) := "00001011";CONSTANT dat8 : std_logic_vector(7 DOWNTO 0) := "00001100";CONSTANT dat9 : std_logic_vector(7 DOWNTO 0) := "00001101";CONSTANT dat10 : std_logic_vector(7 DOWNTO 0) := "00001110";DOWNTO 0) := "00001111";CONSTANT dat12 : std_logic_vector(7 DOWNTO 0) := "00010000";CONSTANT dat13 : std_logic_vector(7 DOWNTO 0) := "00010001";CONSTANT dat14 : std_logic_vector(7 DOWNTO 0) := "00010010";CONSTANT nul : std_logic_vector(7 DOWNTO 0) := "00110000";SIGNAL dat_r : std_logic_vector(7 DOWNTO 0);SIGNAL rs_r : std_logic;SIGNAL rw_r : std_logic;SIGNAL en_r : std_logic;------------------------------------------------------------------------------------------------SIGNAL k1_r : std_logic_vector(7 DOWNTO 0);SIGNAL k2_r : std_logic_vector(7 DOWNTO 0);DOWNTO 0);SIGNAL k4_r : std_logic_vector(7 DOWNTO 0);SIGNAL a : std_logic_vector (7 DOWNTO 0);SIGNAL b : std_logic_vector (7 DOWNTO 0);SIGNAL c : std_logic_vector (7 DOWNTO 0);SIGNAL d : std_logic_vector (7 DOWNTO 0); --------------------------------------------------------------------------------------------------------BEGINdat <= dat_r;rs <= rs_r;rw <= rw_r;en <= en_r;k1_r<=k1;k2_r<=k2;k3_r<=k3;k4_r<=k4;PSB <= '1' ;LCD_RST <= '1' ;LCD_N<='0';LCD_P<='1';--时钟分频PROCESS(clk)BEGINIF(clk'EVENT AND clk = '1') THENcounter <= counter + "0000000000000001";IF (counter = "0000000000001111") THENclkr <= NOT clkr;END IF;END IF;END PROCESS;PROCESS(clkr)BEGINIF(clkr'EVENT AND clkr = '1') THENCASE current ISWHEN set0 =>rs_r <= '0';dat_r <= "00110000"; --初始化--基本指令集current <= set1;WHEN set1 =>rs_r <= '0';dat_r <= "00001100"; --开显示current <= set2;WHEN set2 =>rs_r <= '0';dat_r <= "00000110"; --光标右移current <= set3;WHEN set3 =>rs_r <= '0';dat_r <= "00000001"; --清屏current <= set4;WHEN set4 =>rs_r <= '0';dat_r <= "10000000"; --设置坐标位置(地址设置为第1行)current <= dat0;WHEN dat0 =>rs_r <= '1';dat_r <= a; --发送第一行数据current <= dat1;WHEN dat1 =>rs_r <= '1';dat_r <= b;current <= dat2;WHEN dat2 =>rs_r <= '1';dat_r <= c;current <= dat3;WHEN dat3 =>rs_r <= '1';dat_r <= d;current <= nul;WHEN nul => --这段保证前段显示部分至少执行一遍--然后把液晶的En脚拉高,完成一次读写过程rs_r <= '0';dat_r <= "00000000";IF (cnt /= "10") THENe <= '0';current <= set0;cnt <= cnt + "01";ELSEcurrent <= set0;e <= '1';cnt <= "00";END IF;WHEN OTHERS =>current <= nul;END CASE;END IF;END PROCESS;en_r <= clkr OR e ; --对LCD始终为写操作rw_r <= '0' ; --对LCD始终为写操作-- rst <= reset ;----------------------------------------------------------------------------------process(clkr)beginIF(clkr'EVENT AND clkr = '1') THENcase k1_r is --百位when "00000000"=>a<= x"30";when "00000001"=>a<= x"31";when "00000010"=>a<= x"32";when "00000011"=>a<= x"33";when "00000100"=>a<= x"34";when "00000101"=>a<= x"35";when "00000110"=>a<= x"36";when "00000111"=>a<= x"37";when "00001000"=>a<= x"38";when "00001001"=>a<= x"39";when others =>a<= x"20" ;end case;case k2_r is --十位when "00000000"=>b<= x"30";when "00000001"=>b<= x"31";when "00000010"=>b<= x"32";when "00000011"=>b<= x"33";when "00000100"=>b<= x"34";when "00000101"=>b<= x"35";when "00000110"=>b<= x"36";when "00000111"=>b<= x"37";when "00001000"=>b<= x"38";when "00001001"=>b<= x"39";when others =>b<= x"20" ;end case;case k3_r is --个位when "00000000"=>c<= x"30";when "00000001"=>c<= x"31";when "00000010"=>c<= x"32";when "00000011"=>c<= x"33";when "00000100"=>c<= x"34";when "00000101"=>c<= x"35";when "00000110"=>c<= x"36";when "00000111"=>c<= x"37";when "00001000"=>c<= x"38";when "00001001"=>c<= x"39";when others =>c<= x"20" ;end case;case k4_r is --单位when "00001010"=>d<= x"48"; --H when "00001011"=>d<= x"4B"; --K when "00001100"=>d<= x"4D"; --M when others =>d<=x"20";end case;end if;end process; END fun;。

相关文档
最新文档