12864lcd显示部分试验总结报告
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. 液晶显示器的控制程序编写根据液晶显示器模块的控制指令,编写控制程序。
主要包括以下部分:- 初始化程序:设置液晶显示器的显示模式、对比度等参数。
- 显示程序:实现文字、图形的显示。
- 清屏程序:清除液晶显示器上的显示内容。
在编写程序时,需要注意以下几点:- 控制指令要正确,避免对液晶显示器模块造成损害。
- 程序要简洁,易于调试和维护。
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液晶显示实验成组员左虎博杨颂王志鹏指导教师赵勇报告日期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”用焊锡短接。
(完整版)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语言的规则的。
因此,我们利用状态机的思想,将写指令和写数据的两个进程合二为一。
程序片段如下:利用状态机,将写指令和写数据的各个步骤分为一个一个分立的状态,顺序执行。
这样编写将对同一个引脚信号的变化放在一个进程中,很好的解决了之前存在的问题。
并且受此启发,在写数据的程序段,对百位、十位、个位以及单位的译码程序中,将原本分别对各自数位信号敏感的四个单独进程改成了受一个的时钟上升沿敏感的一个进程,从而较好的保证了程序的时序性和同步性,经实验验证效果良好。
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 个汉字。
FPGA实验报告LCD12864液晶显示
液晶显示实验一实验要求所有程序必须由verilog语言编写,同时需要通过按键切换屏幕显示文字,一页全是英文,一页全是中文。
我的文字是我的的课程、班级、学号和姓名。
二实验原理1.12864简介12864系列中文图形液晶模块的特性主要由其控制器决定。
控制器同时作为控制器和驱动器,它可提供33 路com 输出和64 路seg 输出。
在驱动器的配合下,最多可以驱动256×32 点阵液晶。
其汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
LCD类型为STN与MCU接口为8位或4位并行/3位串行可实现光标显示、画面移位、自定义字符、睡眠模式等多种软件功能。
其原理简图为:引脚号引脚名称方向功能说明1 VSS - 模块的电源地2 VDD - 模块的电源正端3 V0 - LCD驱动电压输入端4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号5 R/W(SID) H/L 并行的读写选择信号;串行的数据口6 E(CLK) H/L 并行的使能信号;串行的同步时钟7 DB0 H/L 数据08 DB1 H/L 数据19 DB2 H/L 数据210 DB3 H/L 数据311 DB4 H/L 数据412 DB5 H/L 数据513 DB6 H/L 数据614 DB7 H/L 数据715 PSB H/L 并/串行接口选择:H-并行;L-串行16 NC 空脚17 /RET H/L 复位低电平有效18 NC 空脚19 LED_A - 背光源正极(LED+5V)20 LED_K - 背光源负极(LED-OV)2.12864工作时序原理图8位并行连接时序图,分为MPU写资料到模块与MPU从模块读出资料MPU写资料到模块MPU从模块读出资料串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=4.5V)三实验流程图及管脚分配初始化流程:流程简易图:管教分配图:四实验程序主要程序:module lcd_test( clk, key,rs,rw,en,psb,reset,sel,dat);input clk;input key;output rs;output rw;output en;output psb;output reset;output [7:0] dat;output [2:0] sel;wire [127:0] row1_val="xx:xxx ";wire [127:0] row2_val="xx:xxxxxxxxxx ";wire [127:0] row3_val=" xxxxxx ";wire [127:0] row4_val="xx:xxxxxxxx ";wire [127:0] row5_val="xxxx:xxxxxxxxxxx";wire [127:0] row6_val="NUMB:xxxxxxxxxx";wire [127:0] row7_val=" EDA ";wire [127:0] row8_val="CLASS :20090823";wire [127:0] row1;wire [127:0] row2;wire [127:0] row3;wire [127:0] row4;assign sel=3'b110;assign psb = 1;assign reset = 1;assign row1=(key==1'b1)?(row1_val):(row5_val);assign row2=(key==1'b1)?(row2_val):(row6_val);assign row3=(key==1'b1)?(row3_val):(row7_val);assign row4=(key==1'b1)?(row4_val):(row8_val);//assign row1=row5_val;xian(.clk(clk),.rs(rs),.rw(rw),.en(en),.dat(dat),.row1_val(row1),.row2_val(row2),.row3_val(row3),.row4_val(row4),.key(key));Endmodule显示部分程序:xian(clk, rs, rw, en,dat,row1_val,row2_val,row3_val,row4_val,key);input clk;input [127:0] row1_val;input [127:0] row2_val;input [127:0] row3_val;input [127:0] row4_val;input key;output [7:0] dat;output rs,rw,en;reg e;reg [7:0] dat;reg rs;reg [23:0] counter;reg [6:0] current,next;reg clkr;reg [1:0] cnt;parameter set0=8'h0; //定义了很多状态机parameter set1=8'h1;parameter set2=8'h2;parameter set3=8'h3;parameter set4=8'h4;parameter set5=8'h5;parameter set6=8'h6;parameter dat0=8'h7; parameter dat1=8'h8; parameter dat2=8'h9; parameter dat3=8'hA; parameter dat4=8'hB; parameter dat5=8'hC; parameter dat6=8'hD; parameter dat7=8'hE; parameter dat8=8'hF; parameter dat9=8'h10;parameter dat10=8'h12; parameter dat11=8'h13; parameter dat12=8'h14; parameter dat13=8'h15; parameter dat14=8'h16; parameter dat15=8'h17; parameter dat16=8'h18; parameter dat17=8'h19; parameter dat18=8'h1A; parameter dat19=8'h1B; parameter dat20=8'h1C; parameter dat21=8'h1D; parameter dat22=8'h1E; parameter dat23=8'h1F; parameter dat24=8'h20; parameter dat25=8'h21; parameter dat26=8'h22; parameter dat27=8'h23; parameter dat28=8'h24; parameter dat29=8'h25; parameter dat30=8'h26; parameter dat31=8'h27; parameter dat32=8'h28; parameter dat33=8'h29; parameter dat34=8'h2A; parameter dat35=8'h2B; parameter dat36=8'h2C; parameter dat37=8'h2E; parameter dat38=8'h2F; parameter dat39=8'h30; parameter dat40=8'h31; parameter dat41=8'h32;parameter dat42=8'h33;parameter dat43=8'h34;parameter dat44=8'h35;parameter dat45=8'h36;parameter dat46=8'h37;parameter dat47=8'h38;parameter dat48=8'h39;parameter dat49=8'h40;parameter dat50=8'h41;parameter dat51=8'h42;parameter dat52=8'h43;parameter dat53=8'h44;parameter dat54=8'h45;parameter dat55=8'h46;parameter dat56=8'h47;parameter dat57=8'h48;parameter dat58=8'h49;parameter dat59=8'h50;parameter dat60=8'h51;parameter dat61=8'h52;parameter dat62=8'h53;parameter dat63=8'h54;//parameter dat64=8'h54;parameter nul=8'h55;always @(posedge clk) //da de shi zhong pinlvbegincounter=counter+1'b1;if(counter==2499999)begincounter<=0;clkr=~clkr;endendalways @(posedge clkr)begincurrent=next;case(current)set0: begin rs<=0; dat<=8'h30; next<=set1; end // LCD的初始化set1: begin rs<=0; dat<=8'h0c; next<=set2; endset2: begin rs<=0; dat<=8'h6; next<=set3; endset3: begin rs<=0; dat<=8'h1; next<=dat0; enddat0: begin rs<=1; dat<=row1_val[127:120]; next<=dat1; end //显示第一行dat1: begin rs<=1; dat<=row1_val[119:112]; next<=dat2; enddat2: begin rs<=1; dat<=row1_val[111:104]; next<=dat3; enddat3: begin rs<=1; dat<=row1_val[103:96];next<=dat4; enddat4: begin rs<=1; dat<=row1_val[95:88]; next<=dat5; enddat5: begin rs<=1; dat<=row1_val[87:80]; next<=dat6; enddat6: begin rs<=1; dat<=row1_val[79:72]; next<=dat7; enddat7: begin rs<=1; dat<=row1_val[71:64];next<=dat8; enddat8: begin rs<=1; dat<=row1_val[63:56]; next<=dat9; enddat9: begin rs<=1; dat<=row1_val[55:48];next<= dat10 ; enddat10: begin rs<=1; dat<=row1_val[47:40]; next<=dat11; enddat11: begin rs<=1; dat<=row1_val[39:32]; next<=dat12; enddat12: begin rs<=1; dat<=row1_val[31:24]; next<=dat13; enddat13: begin rs<=1; dat<=row1_val[23:16]; next<=dat14; enddat14: begin rs<=1; dat<=row1_val[15:8]; next<=dat15; enddat15: begin rs<=1; dat<=row1_val[7:0];next<=set4; endset4: begin rs<=0; dat<=8'h90; next<=dat16; end //显示第二行90是第二行的起始显示地址dat16: begin rs<=1; dat<=row2_val[127:120]; next<=dat17; enddat17: begin rs<=1; dat<=row2_val[119:112]; next<=dat18; enddat18: begin rs<=1; dat<=row2_val[111:104]; next<=dat19; enddat19: begin rs<=1; dat<=row2_val[103:96]; next<=dat20; enddat20: begin rs<=1; dat<=row2_val[95:88]; next<=dat21; enddat21: begin rs<=1; dat<=row2_val[87:80]; next<=dat22; enddat22: begin rs<=1; dat<=row2_val[79:72]; next<=dat23; enddat23: begin rs<=1; dat<=row2_val[71:64]; next<=dat24; enddat24: begin rs<=1; dat<=row2_val[63:56]; next<=dat25; enddat25: begin rs<=1; dat<=row2_val[55:48]; next<=dat26; enddat26: begin rs<=1; dat<=row2_val[47:40]; next<=dat27; enddat27: begin rs<=1; dat<=row2_val[39:32]; next<=dat28; enddat28: begin rs<=1; dat<=row2_val[31:24]; next<=dat29; enddat29: begin rs<=1; dat<=row2_val[23:16]; next<=dat30; enddat30: begin rs<=1; dat<=row2_val[15:8]; next<=dat31; enddat31: begin rs<=1; dat<=row2_val[7:0]; next<=set5; endset5: begin rs<=0; dat<=8'h88; next<=dat32; end //显示第三行88是第三行的起始显示地址dat32: begin rs<=1; dat<=row3_val[127:120]; next<=dat33 ; enddat33: begin rs<=1; dat<=row3_val[119:112]; next<=dat34; enddat34: begin rs<=1; dat<=row3_val[111:104]; next<=dat35; enddat35: begin rs<=1; dat<=row3_val[103:96]; next<=dat36; enddat36: begin rs<=1; dat<=row3_val[95:88]; next<=dat37; enddat37: begin rs<=1; dat<=row3_val[87:80]; next<=dat38; enddat38: begin rs<=1; dat<=row3_val[79:72]; next<=dat39; enddat39: begin rs<=1; dat<=row3_val[71:64]; next<=dat40; enddat40: begin rs<=1; dat<=row3_val[63:56]; next<=dat41; enddat41: begin rs<=1; dat<=row3_val[55:48]; next<=dat42; enddat42: begin rs<=1; dat<=row3_val[47:40]; next<=dat43; enddat43: begin rs<=1; dat<=row3_val[39:32]; next<=dat44; enddat44: begin rs<=1; dat<=row3_val[31:24]; next<=dat45; enddat45: begin rs<=1; dat<=row3_val[23:16]; next<=dat46; enddat46: begin rs<=1; dat<=row3_val[15:8]; next<=dat47; enddat47: begin rs<=1; dat<=row3_val[7:0]; next<=set6; endset6: begin rs<=0; dat<=8'h98; next<=dat48; end //显示第四行dat48: begin rs<=1; dat<=row4_val[127:120]; next<=dat49 ; enddat49: begin rs<=1; dat<=row4_val[119:112]; next<=dat50; enddat50: begin rs<=1; dat<=row4_val[111:104]; next<=dat51; enddat51: begin rs<=1; dat<=row4_val[103:96]; next<=dat52; enddat52: begin rs<=1; dat<=row4_val[95:88]; next<=dat53; enddat53: begin rs<=1; dat<=row4_val[87:80]; next<=dat54; enddat54: begin rs<=1; dat<=row4_val[79:72]; next<=dat55; enddat55: begin rs<=1; dat<=row4_val[71:64]; next<=dat56; enddat56: begin rs<=1; dat<=row4_val[63:56]; next<=dat57; enddat57: begin rs<=1; dat<=row4_val[55:48]; next<=dat58; enddat58: begin rs<=1; dat<=row4_val[47:40]; next<=dat59; enddat59: begin rs<=1; dat<=row4_val[39:32]; next<=dat60; enddat60: begin rs<=1; dat<=row4_val[31:24]; next<=dat61; enddat61: begin rs<=1; dat<=row4_val[23:16]; next<=dat62; enddat62: begin rs<=1; dat<=row4_val[15:8]; next<=dat63; enddat63: begin rs<=1; dat<=row4_val[7:0]; next<=nul; endnul: begin rs<=0; dat<=8'h00; // 把液晶的E 脚拉高if(key==1'h0)begine<=0;next<=set0;endelsebegin next<=nul; e<=1;endenddefault: next=set0;endcaseendassign en=clkr|e;assign rw=0;endmodule五实验结果满足实验要求,液晶进行扫描屏幕显示中英文转换。
LCD12864调试心得
OCM12864-9调试心得经过三天时间的奋斗,12864终于调试完毕,现将中间的曲折过程记录如下,也是对自己做的一个小小的总结:第一天:毫无头绪0CM12864-9是金鹏公司的产品,与调试其他外围芯片一样,调试之前,首先阅读了它的说明书,但是官方提供的说明书太简陋了,好多东西更本没有写清楚,而且是第一次接触,所以看的是云里雾里,看了半天连时序也没看明白,它的时序有三种接口时序,6800,8080,串行时序,6800和8080的区别在于6800将RW/WR在一个脚上,而8080的WR和RW分别在两个脚上。
我当时遇到的第一个问题就是怎样区分我的开发板里面采用的是哪种接口定义呢,因为不同的接口定义,时序是不同的,开始以为是要配置一个什么东西,来选择三种接口中的一种,后来仔细看电路图才发现其实这些接口的定义都是可以自己定义的,如在电路中画的电路图是6800接口的,在写程序时,时序就按6800控制,接口定义为8080时,时序就按8080控制。
解决了第一步,知道了时序关系,接下来便是按照时序开始写程序了,以前写过1602,这样写12864的时序就比较简单,读写,发命令控制函数都写好了,接下来便是写数据了,但是对于写什么样的数据,数据是怎么显示的完全没有概念,继续在数据手册中去寻找答案,12864即由128*64个点组成,要显示你想要的数据,如要显示字符1,若采用16*8来显示一个字符,就需将1的字模写入到对应的区域,对于我这块12864来说,总共分成8个区,每个区的有128列,8行,这样每个区中的一列即8个点,便和RAM中的一个字节对应起来。
如下图所示:如DO--D7为一页中的一列,和RAM中的一个字节对应起来。
所以要显示一个16*8的字符,就需要将写两页16行,8列的数据,用取模软件取出1的字模为:0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,将数据写入到对应的RAM中,就可以显示出数据了按照上面的分析,从原理上来说,应该没有问题了,但是将其放在12864上没有任何数据显示。
12864点阵型LCD显示实验
/****************************************//*杭州电子&计算机工作室*//* *//*12864LCD测试程序*//*目标器件:AT89S51 *//*晶振:11.0592MHZ *//*编译环境:Keil 7.50A *//****************************************//*********************************包含头文件********************************/ #include <reg51.h>/********************************命令字定义*********************************/ #define Disp_On 0x3f#define Disp_Off 0x3e#define Col_Add 0x40#define Page_Add 0xb8#define Start_Line 0xc0/*********************************端口定义**********************************/ sbit Mcs=P2^3; //左半屏使能,当MCS=1,左半屏显示sbit Scs=P2^4; //右半屏使能,当SCS=1,右半屏显示sbit Enable=P2^2; //使能sbit Di=P2^0; //数据/命令选择(RS)sbit RW=P2^1; //读/写信号sbit Rst=P2^5; //复位脚sbit Light=P2^6; //背光脚/**********************************字模表***********************************/ /************************************************************/ char code h[]={/*-- 文字: h --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20, };char code w[]={/*-- 文字: w --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00, };char code i[]={/*-- 文字: i --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,};char code f[]={/*-- 文字: f --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,};char code c[]={/*-- 文字: c --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,};char code a[]={/*-- 文字: a --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,};char code t[]={/*-- 文字: t --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,};char code o[]={/*-- 文字: o --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,};char code m[]={/*-- 文字: m --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,};char code dian[]={/*-- 文字: . --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,};/*************************************欢迎使用***********************************/char code huan[]={/*-- 文字: 欢--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,};char code yun2[]={/*-- 文字: 迎--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,};char code shi[]={/*-- 文字: 使--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00,};char code yong[]={/*-- 文字: 用--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,};/***********************************单片机开发板*********************************/char code dan[]={/*-- 文字: 单--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x28,0x29,0x2E,0x2A,0xF8,0x28,0x2C,0x2B,0x2A,0xF8,0x00,0x00,0x00,0x08,0x08,0x0B,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x0B,0x08,0x08,0x00,};char code pian[]={//*-- 文字: 片--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x18,0x10,0x00,0x80,0x40,0x30,0x0F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,};char code ji[]={/*-- 文字: 机--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00,};char code kai[]={/*-- 文字: 开--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,};char code fa[]={/*-- 文字: 发--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x10,0x3E,0x10,0x10,0xF0,0x9F,0x90,0x90,0x92,0x94,0x1C,0x10,0x10,0x10,0x00,0x40,0x20,0x10,0x88,0x87,0x41,0x46,0x28,0x10,0x28,0x27,0x40,0xC0,0x40,0x00,0x00, };char code ban[]={/*-- 文字: 板--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xD0,0xFF,0x50,0x90,0x00,0xFE,0x62,0xA2,0x22,0x21,0xA1,0x61,0x00,0x00,0x04,0x03,0x00,0x7F,0x00,0x11,0x0E,0x41,0x20,0x11,0x0A,0x0E,0x31,0x60,0x20,0x00, };char code dang[]={/*-- 文字: 当--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x40,0x42,0x5C,0x48,0x40,0x40,0x7F,0x40,0x50,0x4E,0x44,0xC0,0x00,0x00,0x00,0x00,0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7F,0x00,0x00, };char code qian[]={/*-- 文字: 前--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0xE8,0xA8,0xA9,0xAE,0xEA,0x08,0x08,0xC8,0x0C,0x0B,0xEA,0x08,0x08,0x00, 0x00,0x00,0x7F,0x04,0x24,0x44,0x3F,0x00,0x00,0x1F,0x40,0x80,0x7F,0x00,0x00,0x00, };char code zhuang[]={/*-- 文字: 状--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00, };char code tai1[]={/*-- 文字: 态--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00,0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00, };char code yun[]={/*-- 文字: 运--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x41,0xCE,0x04,0x00,0x20,0x22,0xA2,0x62,0x22,0xA2,0x22,0x22,0x22,0x20,0x00,0x40,0x20,0x1F,0x20,0x28,0x4C,0x4A,0x49,0x48,0x4C,0x44,0x45,0x5E,0x4C,0x40,0x00, };char code xing[]={/*-- 文字: 行--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x08,0x84,0xC6,0x73,0x22,0x40,0x44,0x44,0x44,0xC4,0x44,0x44,0x44,0x40,0x00,0x02,0x01,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};char code zhong[]={/*-- 文字: 中--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,};char code maohao[]={/*-- 文字: : --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,};/**************************************************************************** 函数功能:延时程序入口参数:t出口参数:****************************************************************************/ void delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/***************************************************************************** 函数功能:写命令到LCD程序入口参数:cmdcode出口参数:*****************************************************************************/ void write_com(unsigned char cmdcode){Di=0;RW=0;P0=cmdcode;delay(2);Enable=1;delay(2);Enable=0;}/***************************************************************************** 函数功能:写数据到LCD程序入口参数:Dispdata出口参数:*****************************************************************************/ void write_data(unsigned char Dispdata){Di=1;RW=0;P0=Dispdata;delay(2);Enable=1;delay(2);Enable=0;}/***************************************************************************** 函数功能:清除LCD内存程序入口参数:pag,col,hzk出口参数:*****************************************************************************/ void Clr_Scr(){unsigned char j,k;Mcs=1;Scs=1;write_com(Page_Add+0);write_com(Col_Add+0);for(k=0;k<8;k++){write_com(Page_Add+k);for(j=0;j<64;j++)write_data(0x00);}Mcs=0;Scs=0;}/***************************************************************************** 函数功能:指定位置显示数字16*16程序入口参数:pag,col,hzk出口参数:*****************************************************************************/ void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk){unsigned char j=0,i=0;for(j=0;j<2;j++){write_com(Page_Add+pag+j);write_com(Col_Add+col);for(i=0;i<16;i++)write_data(hzk[16*j+i]);}}/***************************************************************************** 函数功能:指定位置显示数字8*16程序入口参数:pag,col,hzk出口参数:*****************************************************************************/ void hz_disp8(unsigned char pag,unsigned char col, unsigned char code *hzk){unsigned char j=0,i=0;for(j=0;j<2;j++){write_com(Page_Add+pag+j);write_com(Col_Add+col);for(i=0;i<8;i++)write_data(hzk[8*j+i]);}}/***************************************************************************** 函数功能:LCD初始化程序入口参数:出口参数:*****************************************************************************/ void init_lcd(){delay(100);Mcs=1;Scs=1;delay(100);write_com(Disp_Off);write_com(Page_Add+0);write_com(Start_Line+0);write_com(Col_Add+0);write_com(Disp_On);}/***************************************************************************** 函数功能:主程序入口参数:出口参数:*****************************************************************************/ void main(void){Light=0; //开LCD背光init_lcd();Clr_Scr();Mcs=1;Scs=0; //左、右都显示while(1){Mcs=1;Scs=0; //左显示delay(2);//欢迎hz_disp16(0,32,huan);hz_disp16(0,48,yun2);//单片机hz_disp16(2,16,dan);hz_disp16(2,32,pian);hz_disp16(2,48,ji);//当前状态hz_disp16(4,0,dang);hz_disp16(4,16,qian);hz_disp16(4,32,zhuang);hz_disp16(4,48,tai1);//网址:www.hifihz_disp8(6,0,w);hz_disp8(6,8,w);hz_disp8(6,16,w);hz_disp8(6,24,dian);hz_disp8(6,32,h);hz_disp8(6,40,i);hz_disp8(6,48,f);hz_disp8(6,56,i);Mcs=0;Scs=1; //右显示//使用hz_disp16(0,0,shi);hz_disp16(0,16,yong);//开发板hz_disp16(2,0,kai);hz_disp16(2,16,fa);hz_disp16(2,32,ban);//:运行中hz_disp8(4,0,maohao);hz_disp16(4,8,yun);hz_disp16(4,24,xing);hz_disp16(4,40,zhong);//网址:hz_disp8(6,0,c);hz_disp8(6,8,a);hz_disp8(6,16,t);hz_disp8(6,24,dian);hz_disp8(6,32,c);hz_disp8(6,40,o);hz_disp8(6,48,m);delay(2);}}。
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)总结调试过程中出现的问题及解决办法。
LCD12864的显示实验
LCD1602A的显示实验液晶屏的电路连接图:/****************************************************************************** ** 描述: ** 12864标准字库液晶演示数据p0,控制p2 ******************************************************************************** */#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************* 12864LCD引脚定义*************/#define LCD_data P0 //数据口sbit LCD_RS = P2^6; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^7; //液晶使能控制sbit LCD_PSB = P3^2; //串/并方式控制sbit LCD_RST = P3^7; //液晶复位端口#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/*********************************************************/uchar code DIS1[] = {" 普中科技"};uchar code DIS2[] = {"自学单片机第一站"};uchar code DIS3[] = {" "};uchar code DIS4[] = {"TEL:755-29325187"};/*********************************************************/ uchar code Photo1[] ={0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0xC0,0x80,0x42,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x1F,0xFC,0x42,0x04,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xDE,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x2A,0x87,0xF0,0xA2,0x0A,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x84,0x10,0xA2,0x0A,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0xFC,0xA2,0x0A,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x90,0x05,0x2F,0xCA,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xE1,0xA8,0x4A,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xC2,0x24,0x48,0x44,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x84,0x24,0xA8,0x4A,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x58,0x3D,0x0F,0xD0,0xC4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x08,0x37,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x08,0x40,0x00,0xFF,0x90,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x86,0x10,0x40,0x00,0x08,0x08,0x10,0xFF,0x86,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x49,0x40,0x40,0x00,0x7F,0x0B,0xFC,0x08,0x0F,0x00,0x00,0x00,0x00,0x00,0x01,0x08,0x00,0x40,0x20,0x00,0x10,0x00,0x10,0x49,0x0F,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x00,0x20,0x20,0x01,0xFF,0xDD,0x10,0x2A,0x0F,0x00,0x00,0x00,0x00,0x00,0x91,0xFF,0xC6,0x00,0x00,0x00,0x00,0x00, 0x04,0x52,0x44,0x90,0x20,0x00,0x7F,0x04, 0x90,0x1C,0x06,0x00,0x00,0x00,0x00,0x00, 0x09,0xA4,0x28,0x4C,0x10,0x00,0xA1,0x04, 0x10,0x2A,0x00,0x00,0x00,0x00,0x00,0x00, 0x0E,0x44,0xE9,0xC3,0x90,0x01,0x3F,0x04, 0x70,0x49,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0xC5,0x81,0x70,0x00,0x21,0x0A, 0x01,0x88,0xC6,0x00,0x00,0x00,0x00,0x00, 0x01,0x01,0x83,0x00,0x80,0x00,0x3F,0x11, 0xFC,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x0C,0x70,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x13,0x87,0x10,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x20,0x78,0xA0,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x20,0x00,0x60,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x21,0x80,0x60,0x40,0x00,0x00,0x71, 0xEE,0x3C,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x11,0x98,0x90,0x80,0x00,0x00,0x8E, 0x31,0xC6,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x08,0x18,0x80,0x80,0x00,0x01,0x24, 0x24,0x83,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x96,0x01,0x01,0x00,0x00,0x01,0x40, 0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x86,0x03,0x00,0x00,0x01,0x40, 0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x34,0x78,0x8C,0x00,0x00,0x01,0x00, 0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0E,0x01,0x30,0x00,0x00,0x00,0x80, 0x30,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x87,0xCE,0x00,0x00,0x00,0x40, 0x68,0x0C,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xE0,0x78,0x07,0x00,0x00,0x00,0x20, 0xC4,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0xAF,0xFF,0xC5,0x80,0x00,0x00,0x11, 0x82,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0xA9,0xB6,0x45,0xC0,0x00,0x00,0x0B, 0x01,0x60,0x00,0x00,0x00,0x00,0x00,0x00, 0x07,0x2F,0x03,0xC4,0xE0,0x00,0x00,0x06, 0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x08,0x00,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x84,0x00,0x21,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/******************************************************************************/uchar code Photo2[] ={/*-- 调入了一幅图像:G:\HC-6800\12864\C语言\pz.bmp --*//*-- 宽度x高度=128x64 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFE,0x60, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x63,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x63,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x63,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7E,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x6C,0x08, 0x1F,0xF8,0x3F,0xF8,0x7F,0xF0,0x0F,0xF9,0xF1,0xF0,0xFF,0x87,0xC3,0xC4,0x6C,0x08, 0x0E,0x7C,0x1E,0xFC,0x38,0xF8,0x3E,0xF8,0xE0,0xE0,0x1C,0x03,0xC1,0x84,0x66,0x08, 0x0E,0x1E,0x1C,0x3C,0x38,0x38,0x38,0x38,0xE0,0xE0,0x1C,0x03,0xE1,0x84,0x66,0x08, 0x0E,0x1E,0x1C,0x1C,0x38,0x18,0x78,0x38,0xE0,0xE0,0x1C,0x03,0xE1,0x82,0x63,0x10, 0x0E,0x0E,0x1C,0x1C,0x38,0x00,0xF0,0x18,0xE0,0xE0,0x1C,0x03,0xF1,0x81,0xF3,0xA0, 0x0E,0x0E,0x1C,0x3C,0x38,0xC0,0xF0,0x00,0xE0,0xE0,0x1C,0x03,0xF1,0x81,0x80,0x60, 0x0E,0x1E,0x1C,0x3C,0x38,0xC0,0xF0,0x00,0xE0,0xE0,0x1C,0x03,0x79,0x80,0x40,0x80, 0x0E,0x1E,0x1C,0xF8,0x39,0xC0,0xE0,0x00,0xE0,0xE0,0x1C,0x03,0x79,0x80,0x3F,0x00, 0x0E,0x7C,0x1F,0xF0,0x3F,0xC0,0xE0,0x00,0xFF,0xE0,0x1C,0x03,0x3D,0x80,0x00,0x00, 0x0F,0xF8,0x1D,0xE0,0x39,0xC0,0xE0,0x00,0xE0,0xE0,0x1C,0x03,0x3D,0x80,0x00,0x00, 0x0E,0x00,0x1D,0xE0,0x38,0xC0,0xE0,0x00,0xE0,0xE0,0x1C,0x03,0x1F,0x80,0x00,0x00, 0x0E,0x00,0x1C,0xF0,0x38,0xC0,0xF0,0x00,0xE0,0xE0,0x1C,0x03,0x1F,0x80,0x00,0x00, 0x0E,0x00,0x1C,0xF0,0x38,0x00,0xF0,0x00,0xE0,0xE0,0x1C,0x03,0x0F,0x80,0x00,0x00, 0x0E,0x00,0x1C,0x78,0x38,0x00,0xF0,0x18,0xE0,0xE0,0x1C,0x03,0x0F,0x80,0x00,0x00, 0x0E,0x00,0x1C,0x78,0x38,0x18,0x70,0x38,0xE0,0xE0,0x1C,0x03,0x07,0x80,0x00,0x00, 0x0E,0x00,0x1C,0x78,0x38,0x38,0x78,0x30,0xE0,0xE0,0x1C,0x03,0x07,0x80,0x00,0x00, 0x0E,0x00,0x1C,0x3C,0x38,0xF8,0x3E,0xF0,0xE0,0xE0,0x1C,0x03,0x03,0x80,0x00,0x00, 0x1F,0x00,0x3E,0x3E,0x7F,0xF0,0x1F,0xE1,0xF1,0xF0,0xFF,0x87,0x83,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xF0,0x38,0x00,0x00,0x78,0x00,0x00,0x18,0x07,0x80,0x1C,0x03,0x80,0x00, 0x00,0x00,0x7C,0x7C,0x00,0x00,0x78,0x00,0x00,0x7C,0x07,0x80,0x1C,0x03,0xC0,0x00, 0x00,0x00,0x3C,0x70,0x00,0x00,0x70,0x00,0x07,0xFC,0x07,0x00,0x1C,0x03,0x80,0x00, 0x00,0x00,0x1C,0xE3,0xC0,0x00,0x70,0x00,0x1F,0xE1,0xC7,0x00,0x1C,0x03,0x80,0x00, 0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x70,0x00,0x00,0xE1,0xE7,0x00,0x1C,0x03,0x80,0x00,0x00,0x06,0x1C,0xE6,0x00,0xFF,0xFF,0xFC,0x00,0xE0,0xF7,0x00,0x1D,0x83,0x9E,0x00, 0x00,0x07,0x1C,0xE7,0x80,0xFF,0xFF,0xFC,0x00,0xE0,0xF7,0x03,0xFF,0xFF,0xFE,0x00,0x00,0x03,0x9C,0xEF,0x80,0xE0,0x70,0x38,0x00,0xEE,0x67,0x00,0x1C,0x03,0x80,0x00, 0x00,0x03,0xDC,0xEE,0x00,0xE0,0x70,0x38,0x3F,0xFE,0x07,0x00,0x1C,0x03,0x80,0x00, 0x00,0x01,0xFC,0xFC,0x00,0xE0,0x70,0x38,0x01,0xE0,0x07,0x00,0x1C,0x03,0x80,0x00, 0x00,0x01,0xDC,0xF8,0xE0,0xE0,0x70,0x38,0x01,0xE1,0xC7,0x00,0x1D,0xC3,0xB8,0x00, 0x00,0x3F,0xFF,0xFF,0xF0,0xE0,0x70,0x38,0x03,0xF1,0xE7,0x00,0x1F,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0xFF,0xF0,0xE0,0x70,0x38,0x03,0xFC,0xE7,0x00,0x7E,0x38,0x38,0x00, 0x00,0x00,0x80,0x0C,0x00,0xFF,0xFF,0xF8,0x07,0xFE,0xE7,0xE3,0xFC,0x18,0x78,0x00, 0x00,0x00,0xFF,0xFE,0x00,0xE0,0x70,0x38,0x07,0xFE,0x07,0xF3,0xFC,0x1C,0x70,0x00, 0x00,0x00,0xFF,0xFE,0x00,0xE0,0x70,0x38,0x0F,0xEC,0x3F,0xC1,0x9C,0x1C,0xF0,0x00, 0x00,0x00,0xE0,0x1E,0x00,0x00,0x70,0x00,0x0E,0xE7,0xFF,0x00,0x1C,0x0E,0xE0,0x00, 0x00,0x00,0xE0,0x1E,0x00,0x00,0x70,0x00,0x1C,0xEF,0x07,0x00,0x1C,0x0F,0xE0,0x00, 0x00,0x00,0xFF,0xFE,0x00,0x00,0x70,0x00,0x38,0xE0,0x07,0x00,0x1C,0x07,0xC0,0x00, 0x00,0x00,0xE0,0x1E,0x00,0x00,0x70,0x00,0x30,0xE0,0x07,0x00,0x1C,0x07,0x80,0x00, 0x00,0x00,0xE0,0x1E,0x00,0x00,0x70,0x00,0x00,0xE0,0x07,0x00,0x1C,0x0F,0xE0,0x00, 0x00,0x00,0xE0,0x1E,0x00,0x00,0x70,0x00,0x00,0xE0,0x07,0x01,0xDC,0x3F,0xF8,0x00, 0x00,0x00,0xFF,0xFE,0x00,0x00,0x70,0x00,0x00,0xE0,0x07,0x01,0xFC,0x78,0xFF,0x00, 0x00,0x00,0xE0,0x1E,0x00,0x00,0x70,0x00,0x00,0xE0,0x07,0x00,0x7F,0xE0,0x3F,0x00, 0x00,0x00,0xC0,0x1C,0x00,0x00,0x70,0x00,0x00,0xC0,0x07,0x00,0x37,0x80,0x0C,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*******************************************************************//* */ /* 延时函数*/ /* */ /*******************************************************************/ void delay(int ms){while(ms--){uchar i;for(i=0;i<150;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************/ /* */ /* 延时函数*/ /* */ /*******************************************************************/ void delay1(int ms){while(ms--){uchar y;for(y=0;y<100;y++) ;}}/*******************************************************************/ /* */ /*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。
(完整版)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语言的规则的。
因此,我们利用状态机的思想,将写指令和写数据的两个进程合二为一。
程序片段如下:利用状态机,将写指令和写数据的各个步骤分为一个一个分立的状态,顺序执行。
这样编写将对同一个引脚信号的变化放在一个进程中,很好的解决了之前存在的问题。
并且受此启发,在写数据的程序段,对百位、十位、个位以及单位的译码程序中,将原本分别对各自数位信号敏感的四个单独进程改成了受一个的时钟上升沿敏感的一个进程,从而较好的保证了程序的时序性和同步性,经实验验证效果良好。
pld实验报告
128*64液晶屏显示实验报告一、实验目的1、学习点阵式液晶屏的使用,理解字模的含义和显示原理。
2、利用128*64液晶屏,显示自己的学号,每个字符为16*16格式。
二、实验内容及原理128*64液晶屏是由两片64*64的液晶屏构成的,有两个片选信号CS1和CS2。
由上图可知,每一片液晶都是分为8页的,每页为8行,共8*64个点阵。
读写数据的时候,要先送片选信号,接着送行、列地址,最后读写数据。
以下是XUP板上液晶屏的控制结构框图:FPGA的管脚配置如下:液晶屏的几个初始化命令:3FH(Display On),C0H(Ram Line,Line0),B8H(Page Address,Page0),40H(Column Address,Column0)。
三、实验过程1.建立工程。
打开Xilinx ISE软件,选择File/New Project命令,在弹出的新建工程对话框中输入工程名及选择工作路径。
单击Next进入下一页,选择芯片型号及偏好语言。
这里选择Family:Spartan3A and Spartan3AN,Device:XC3S400ANA,Preferred Language:Verilog。
单击Next进入下一页,点击Finish即可。
2.新建Verilog Module在菜单栏中选择New Source,在弹出的对话框中选择Verilog Module,并起名,指定路径。
然后就可以编写程序了。
程序中字模的获得可通过字模软件。
因为液晶屏与FPGA相比是慢速的,所以要先将50MHz的时钟分频,本实验采用的是1us的时间来采样,并且有检测忙信号。
以下是分频部分:always @ ( posedge CLK or negedge RSTn )begin if( !RSTn )beginCount <= 5'd0;USCLK <= 1'b0;endelse if( Count == T1MHZ )beginCount <= 5'd0;USCLK <= ~USCLK;endelseCount <= Count + 1'b1;end3.添加ucf文件在菜单栏中选择New Source,在弹出的对话框中选择Implementation Constraints File,就可以编写ucf文件了。
LCD液晶显示试验
实验二十二、LCD液晶显示器实验(并行方式)【实验目的】1.了解LCD液晶模块的基本原理和功能;2.掌握LCD 液晶模块和微控制器的硬件接口和软件设计方法。
【实验设备】1.PⅣ主机/128内存/60G硬盘计算机一台2.微控制器原理及接口技术实验系统一台【实验原理】RT12864HZ汉字图形点阵液晶显示模块可显示汉字和图形。
内置8192个中文汉字(16*16点阵)、128个字符(8*16点阵)及64*256点阵显示(用于图形)。
模块由20个引脚与外界电路相连,其中8条数据线,5条控制线,3条电源线,2条背光电源线,2条没定义。
引脚详细说明见附录。
模块可以并行或串行方式与微控制器相连,由15脚选择。
15脚接高电平时为并行,接低电平时为串行。
通过送入指令和数据,可对显示方式和显示内容作出选择。
而D7~D0则决定指令功能。
基本指令共11条,扩展指令7条。
基本指令包括清除、地址归位、输入方式设置、显示开关控制、写位控制、功能设定等。
详细指令说明见附录。
文本显示RAM提供8个*4行的汉字空间,当写入文本显示RAM时,可以分别显示CGROM、HCGROM和CGRAM字型。
HCGROM为半宽字型(8*16点阵),CGROM为中文字型,CGRAM为自定义的中文字型。
三种字型的选择由写入DDRAM的编码选择。
详见附录。
实验原理线路图如下:【实验内容及要求】通过编程在LCD上第一行显示0~9 十个数字,第二行显示A~Q十六个字母。
【实验步骤】1.接通电源,将拨动开关S20拨向左方,使液晶模块的背景光亮起来;2.将拨动开关S16,S17,S18拨向右方,S19拨向左方,硬件已准备就绪;3.通过仿真器编辑,编译并运行程序,观察LCD屏幕。
【实验设计报告要求】结合资料,考虑怎么在LCD上显示汉字。
【实验实验程序】W_C_ADD EQU 2070H ;写命令字地址W_D_ADD EQU 2071H ;写数据地址R_S_ADD EQU 2072H ;读状态字地址R_D_ADD EQU 2073H ;读数据地址DATA1 EQU 30H ;存放待显示字符的ASCII码ORG 0000HLJMP MAINMAIN: MOV SP,#60H ;设置SP初值LCALL INI ;调用初始化子程序LCALL DCHAR ;调用字符显示子程序JMP $ ;等待;字符显示子程序DCHAR: MOV DATA1,#30H ;第一行显示0~9 十个数字MOV B,#10 ;设置显示数据个数为10MOV A,#80H ;设置显示坐标,80H对应字符的第一行第一列LCALL CMD_LCD ;送命令DCH0: MOV A,DATA1LCALL W_LCD ;送数据INC DATA1DJNZ B,DCH0MOV DATA1, #41H ;第二行显示A~Q十六个字母MOV B,#16 ;设置显示数据个数为16MOV A,#90H ;设置显示坐标,90H对应字符的第二行第一列LCALL CMD_LCD ;送命令DCHA: MOV A,DATA1LCALL W_LCD ;送数据INC DATA1DJNZ B,DCHARETINI: PUSH ACC ;初始化子程序MOV A,#30H ;功能设置LCALL CMD_LCDLCALL DELAYMOV A,#30H ;功能设置LCALL CMD_LCDLCALL DELAYMOV A,#30H ;功能设置LCALL CMD_LCDMOV A,#0CH ;显示状态 ONLCALL CMD_LCDMOV A,#01H ;清除显示LCALL CMD_LCDMOV A,#02H ;地址归位LCALL CMD_LCDPOP ACCRETDELAY: MOV R6,#00H ;延时50毫秒子程序MOV R7,#00HDELAY1: NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETCHKBUSY:PUSH DPH ;忙状态检测子程序PUSH DPLPUSH PSWPUSH ACCMOV DPTR,#R_S_ADD ;送读状态字地址CHK: MOVX A,@DPTR ;从液晶模块读状态JB ACC.7,CHK ;判断状态POP ACCPOP PSWPOP DPLPOP DPHRETCMD_LCD:PUSH DPH ;写命令到LCD子程序PUSH DPLLCALL CHKBUSY ;忙状态检测MOV DPTR,#W_C_ADD ;送写命令字地址MOVX @DPTR,A ;向液晶模块写命令POP DPLPOP DPHRETW_LCD: PUSH DPH ;写数据到LCD子程序PUSH DPLLCALL CHKBUSY ;忙状态检测MOV DPTR,#W_D_ADD ;送写数据地址MOVX @DPTR,A ;向液晶模块写数据POP DPLPOP DPHRETEND实验二十三、LCD液晶显示器(串行方式)【实验目的】同实验二十一。
嵌入式系统12864液晶显示实验
引脚号
引脚名称
方向
功能说明
1
GND
-
模块的电源地
2
VDD
-
模块的电源正端
3
V0
-
LCD对比度调节端
4
RS(CS)
H/L
并行的指令/数据选择信号;串行的片选信号
5
R/W(SID)
H/L
并行的读写选择信号;串行的数据口
6
E(CLK)
H/L
并行的使能信号;串行的同步时钟
7
DB0
{
DataPort=0xff;
RW=1;
RS=0;
EN=1;
while(DataPort&0x80);
EN=0
}
其中,RW设置为低电平RW=0,RS依据传命令和数据的不同分别设置为0和1,将需要传输的数据赋值给DB0-DB7,EN设置为高电平。
延时Tpm(查看芯片手册),代码实现如下所示
void lcdDelay(unsigned int m)
图1-4 12864读时序
读操作过程与写过程类似,如下:
DB0~DB7的初始化设置为0或是1
RW设置为高即读状态
RS设置为低,读命令
EN使能位设置为高,开始读取数据
判断DB7是否为高
EN设置为高,结束读取
3.初始化12864液晶。
查12864液晶的数据手册,可以知道12864有两种指令集:基本指令集和扩充指令集。由于本实验只是进行基本的数据显示,所以选择基本指令集。设置完指令集以后需要将显示开关打开,移位控制和光标的设置。详细的设置参数可以参考12864数据手册。其基本步骤总结如下:
20
12864液晶实际应用(自己总结)
12864串行应用管脚号管脚名称LEVER 管脚功能描述1 VSS 0 电源地2 VDD +5.0V 电源电压3 V0 - 液晶显示器驱动电压4 D/I(RS) H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6 E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB07 DB0 H/L 数据线8 DB1 H/L 数据线9 DB2 H/L 数据线10 DB3 H/L 数据线11 DB4 H/L 数据线12 DB5 H/L 数据线13 DB6 H/L 数据线14 DB7 H/L 数据线15 CS1 H/L H:选择芯片(右半屏)信号16 CS2 H/L H:选择芯片(左半屏)信号17 RET H/L 复位信号,低电平复位18 VOUT -10V LCD驱动负电压19 LED+ - LED背光板电源20 LED- - LED背光板电源12864应用分为串行和并行,并行相对来说速度快些,但是串行的应用更为简便,只需用两个单片机管脚。
程序上操作也更为简便。
具体的串行应用方法如下:首先将12864的管脚改成串行方式:使用时结合下图及PDF中的串行方式改好。
LCD12864工作在串行模式下的引脚连接使用时只用四根线,即两个电源线,两个串行数据线。
程序控制方法首先将“lcd12864c.h”复制到c语言文件下,打开c语言编辑软件kile c。
双击“lcd12864c.h”,修改sbit LCM_SID=P3^6; 及sbit LCM_SCLK=P3^7;引脚,改成你实际用的管脚。
然后把初始化程序LCMTextInit();然后就直接可以显示屏里写汉字并显示了。
显示函数是LCMTextOut(3,"走迷宫寻迹"); 函数中前面3表示显示瓶中第三个位置,"走迷宫寻迹"表示要显示的内容。
单片机液晶显示实验报告
单片机液晶显示实验报告篇一:点阵液晶显示实验报告单片机实验课程名称:点阵液晶汉字显示实验授课班级:10自动化三班任课教师:文远熔计划学时:32学时实验组员:张腾耀梁钦赵福亮秦菱蔚郑欢王聪慧摘要本文介绍了PROTEUS与Keil联调开发51系列单片机应用系统的方法以及基于PROTEUS环境下的12864液晶显示的仿真设计。
将Keil C开发的程序用Proteus设计的仿真电路中交互运行调试的方法,设计12864的液晶显示汉字图像。
在基于PROTEUS环境下的12864液晶显示的仿真设计中,使用51芯片控制,然后显示在12864显示屏上,最多可显示4行每行8个汉字,并且可以通过按键随时改变12864显示屏上的内容。
通过Proteus环境下的温度报警器的仿真实验证明,在PROTEUS环境下可以完成单片机系统的硬件设计和软件调试,测试系统的性能,在实际应用中可以降低设计成本,缩短开发周期,提高效率。
关键词:Proteus;仿真;单片机;12864目录第一章绪论1.1实验任务和要求???????????????????????..11.2 基于Proteus的12864显示的研究???????????????.1 . 1.3 实验方案及原理??????????????????????..1第二章点阵液晶汉字显示的硬件部分2.1程序流程图?????????????????????????.2 2.2硬件电路图???????????????????????. 2.3芯片12864的简介?????????????????????第三章点阵液晶汉字显示的软件部分3.1 Keil简介??????????????????????????. 3.2 Proteus简介????????????????????????. 3.3 Proteus与Keil软件联合仿真的建立??????????????.第四章结论4.1实验总结??????????????????????????.附录1:点阵液晶汉字显示的源程序第一章绪论1.1 实验任务和要求用LCD128x64点阵液晶显示器显示指定汉字,最多可以显示4行、8个/行汉字,通过键盘可以随时改变显示的内容。
LCD1602及LCD12864学习总结
9.读 BF 和 AC 指令:BF=1 表示忙;BF=0 表示准备好。此时 AC 值的意义为最近一次地址设置定义。 D7 D6 D5 D4 D3 D2 D1 D0 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
10.写数据指令:用于将地址码写入 DDRAM 以使 LCD 显示出显影的图形或将用户自创的图形存入 CGRAM 内。 11.读数据指令:根据当前的设置,从 DDRAM 或 CGRAM 中读出数据。
写数到 CGRAM 或 DDRAM 1 0 要写的数
从 CGRAM 或 DDRAM 读数 1 1 要读的数
注释:I/D=1,数据读、写操作后,AC 自动加 1;I/D=0,数据读、写操作后,AC 自动减 1.
指令码
0x01 0x02 0x04,0x05,0x06,0x07 0x08,0x09,0x0a,0x0b 0x0c,0x0d,0x0e,0x0f 0x10,0x14,0x18,0x1c 0x20,0x24,0x28,0x2c 0x30,0x34,0x38,0x3c 0x40+D5~D0 0x80+D6~D0 0x80+D7~D0 忙
数据
数据
LCD 12864 指令说明(RE=1: 扩充指令)
指令 待命模式 卷动地址开关开启 反白选择 睡眠模式 扩充功能设定 设定绘图 RAM 地址
D7 D6 D5 D4 D3 D2 D1 D0
功能
00 0 0 0 0 0 1
00
0
0
0
0
1
SR
SR=1:允许输入垂直卷动地址 SR=0:允许输入 IRAM 和 CGRAM 地址
指令码 0x10 0x14 0x18 0x1c
学12864的心得
学12864液晶有一段时间了(大概一个星期左右吧),感觉收获还是蛮大的,虽然有时候一个小小的问题要搞个老半天才会明白,但是我还是喜欢这样的生活,不能简单的用充实就能表达的。
因为我也表达不出到底是什么感觉,就是觉得很爽吧。
我发现我已经爱上了这个东西。
它那永远充满神奇的知识要我去探索,让我去追求新的高度。
去实现一个又一个的实验,去接受一个又一个的挑战,还有挑战之后获得成功的喜悦,好了。
废话少说了。
我下面来说说我这个星期来学习12864的成果和一些收获吧。
对于12864其实也和8x8点阵还有那个1602的控制还是差不多的。
只是对于我的这块液晶它是st7920驱动的,就是想7920发送一些指令然后就控制了12864了。
呵呵。
难点:CGRAM的理解,DDRAM,GDRAM关键还是GDRAM难一点啦。
1,指令包括一些基本的指令和一些扩展的指令。
其中要设置基本指令时要注意的是对于设置为8位并行是写(0x30)指令要写两次,因为两条命令要两条指令。
不可能用一条指令去执行两个命令。
2,在每次接受指令前都要检测内部忙标志BF。
也可以短暂延时,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。
3,12864是128列64行,而相对于DDRAM 来说是4行8列。
4,每次写只能写进去8位数,而一个字是16x16的即是2字节x16行=32字节。
即一个汉字要占用32字节的空间。
而12864总共可以显示8列x4行=32个汉字。
所以写一个汉字要写两次,先写高8位,在写低8位。
5,GDRAM,其实12864的GDRAM只占用st7920的一半,st7920实际上是256x64的,而12864只有128x64所以只用了一半。
而12864就是将256x64的上半部分截下来的。
即256列x32行,而又12864的256列x32行从中间截开了。
并且把后面一节放到了下面。
也即上半屏是128列x32行,下半屏也是128列x32行,也就是1,3行的DDRAM地址是连起来的。
(十四)液晶12864实验
下半屏折放到右边(0-31 行) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
工 协 这种 12864 还有串,并两种和单片机的连线方式,为节省 IO 口,本实验采用串行连接 理 者 方式,详情请阅读我们提供的 12864PDF 资料. 南 好 室 三,硬件连接: 无华线电FD爱R工作 见程序里的 IO 口宏定义
线 R void SendByte(unsigned char Dbyte)
无 D {
F unsigned char i;
for(i=0;i<8;i++)
{
SCK = 0;
if(Dbyte&0x80)
SID = 1;
else SID = 0;
Dbyte=Dbyte<<1;
SCK = 1;
SCK = 0;
FDR工作室
网址: Email:fdrstudio@
四,程序
#include <mega16.h> #include"delay.h" //包含延时函数的头文件
/************************************************************** iO 口宏定义区
学 SCK = 1; 大 会 SCK = 0;
if(SID) temp2++;
工 协 } 理 者 return ((0xf0&temp1)+(0x0f&temp2));
}
南 好 室 /**************************************************************** 华 爱 检查忙状态
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;。