基于FPGA的LCD1602动态显示

合集下载

LCD1602的滚动显示

LCD1602的滚动显示

LCD1602的滚动显示/*************************************LCD1602头文件************************** *******/#ifndef _LCD1602_H_#define _LCD1602_H_//输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位//设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C //显示开#define LCD_DISPLAY_OFF 0x08 //显示关#define LCD_CURSOR_ON 0x0A //光标显示#define LCD_CURSOR_OFF 0x08 //光标不显示#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁//光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位//工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示#define LCD_CLEAR_SCREEN 0X01 //清屏/***********************LCD1602地址相关******************************/#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址#define LINE1 0 //第一行#define LINE2 1 //第二行#define LINE_LENGTH 16 //每行的最大字符长度/***********************LCD1602接线引脚定义**************************/#define LCDIO P2 //定义P2口与LCD1602的数据口相接sbit LCD_RS=P1^4;sbit LCD_RW=P1^3;sbit LCD_EN=P1^2;sbit LCD_BUSY=LCDIO^7;/**********************另外相关的定*********************************/#define HIGH 1#define LOW 0#define TURE 1#define FALSE 0#define uchar unsigned char#define uint unsigned int/*************************以下是函数的申明部*************************/void LCD_init(void); //LCD1602初始化void LCD_send_command(uchar command); //void LCD_send_data(uchar dat);void LCD_write_char(uchar x,uchar y,uchar dat);void LCD_disp_string(uchar x,uchar y,char *Data);void delay_ms(uint n);void LCD_check_busy(void);#endif/******************************************************************/#include <reg51.h>#include "LCD1602.h"/*******************主函数**********************************/uchar string[]=" I LOVE YOU! "; //这里是要显示的字符void main(void){uchar *cp;cp=string;LCD_init();while(1){LCD_send_command(LCD_CLEAR_SCREEN);delay_ms(2);LCD_disp_string(0,1,cp);delay_ms(100);cp++;if(*cp==''\0''){cp=string; //到达字符的尾部时,改变指针,重新指向字符串的头部 }}}/*********************************************************//**************LCD1602的初始化***************************/void LCD_init(void){LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);LCD_send_command(LCD_AC_AUTO_INCREMENT LCD_MOVE_DISENABLE);LCD_send_command(LCD_DISPLAY_ON LCD_CURSOR_OFF);LCD_send_command(LCD_CLEAR_SCREEN);}/********************************************************/void LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢{do{LCD_EN=0;LCD_RS=0;LCD_RW=1;LCDIO=0xff;LCD_EN=1;}while(LCD_BUSY==1);LCD_EN=0;}/************LCD1602写命令*******************************/ void LCD_send_command(uchar command){LCD_check_busy();LCD_RS=LOW;LCD_RW=LOW;LCD_EN=HIGH;LCDIO=command;LCD_EN=LOW;}/********************************************************/ /*****************LCD1602写数据**************************/ void LCD_send_data(uchar dat){LCD_check_busy();LCD_RS=HIGH;LCD_RW=LOW;LCD_EN=HIGH;LCDIO=dat;LCD_EN=LOW;}/********************************************************void LCD_write_char(uchar x,uchar y,uchar dat){unsigned char address;if (y == LINE1)address = LINE1_HEAD + x;elseaddress = LINE2_HEAD + x;LCD_send_command(address);LCD_send_data(dat);}******************LCD1602显示字符串*********************/void LCD_disp_string(uchar x,uchar y,uchar *Data){if(y==LINE1){if(x<LINE_LENGTH){LCD_send_command(LINE1_HEAD+x);for(;x<LINE_LENGTH&&*Data!=''\0'';x++){LCD_send_data(*(Data++));}if(*Data!=''\0''){x=0;y=LINE2;}}}if(y==LINE2){LCD_send_command(LINE2_HEAD+x);for(;x<LINE_LENGTH&&*Data!=''\0'';x++){LCD_send_data(*(Data++));}}}/****************************************************************/ /********************延时函数***********************************//***************************************************************/ void delay_ms(uint n){uint i,j;for(i=n;i>0;i--)for(j=0;j<1140;j++); }。

LCD1602液晶显示实验报告

LCD1602液晶显示实验报告

LCD1602液晶显示实验报告一、实验目的(1)了解LCD1602的基本原理,掌握其基本的工作流程。

(2)学习用Verilog HDL语言编写LCD1602的控制指令程序,能够在液晶屏上显示出正确的符号。

(3)能够自行改写程序,并实现符号的动态显示。

二、实验设备与器件Quartus II 软件、EP2C8Q208C8实验箱三、实验方案设计1.实验可实现的功能可以实现在LCD1602液晶屏第一行左侧第一位的位置循环显示0~9,并且可以用一个拨码开关BM8实现显示的复位功能。

2.LCD1602基本知识LCD1602液晶能够同时显示16x02即32个字符,模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如“A”。

1602通过D0~D7的8位数据端传输数据和指令。

3.系统工作原理系统的状态转换流程图如图3.1.1所示。

通过状态流程图可以看到,LCD1602液晶屏的状态是不断更新的,依次完成液晶的初始化和0~9的动态显示过程,并且过程可由开关控制。

if (!rst_n)cnt <= 0;elsecnt <= cnt + 1'b1;wire lcd_clk = cnt[23]; // (2^23 / 50M)=0.168s always@(posedge lcd_clk)if(cnt1>=24'd2)beginreg lcd_clk1;lcd_clk1=1;cnt1=0;endelsebegincnt1=cnt1+1; //cnt1对lcd_clk二分频lcd_clk1=0;endalways@(posedge lcd_clk1)beginrow1_val<=8'h30;//设初值case(row1_val) //数字0~9循环显示8'h30: row1_val<=8'h31;8'h31: row1_val<=8'h32;8'h32: row1_val<=8'h33;8'h33: row1_val<=8'h34;8'h34: row1_val<=8'h35;8'h35: row1_val<=8'h36;8'h36: row1_val<=8'h37;8'h37: row1_val<=8'h38;8'h38: row1_val<=8'h39;8'h39: row1_val<=8'h30;default: row1_val<=8'h30;endcaseendparameter IDLE = 8'h00;parameter DISP_SET = 8'h01; // 显示模式设置parameter DISP_OFF = 8'h03; // 显示关闭parameter CLR_SCR = 8'h02; // 显示清屏parameter CURSOR_SET1 = 8'h06; // 显示光标移动设置parameter CURSOR_SET2 = 8'h07; // 显示开及光标设置parameter ROW1_ADDR = 8'h05; // 写第1行起始地址parameter ROW1_0 = 8'h04;reg [5:0] current_state, next_state; // 现态、次态always @ (posedge lcd_clk, negedge rst_n)if(!rst_n) current_state <= IDLE;else current_state <= next_state;//在时钟信号作用期间,次态重复的赋给现态alwaysbegincase(current_state)IDLE : next_state = DISP_SET;DISP_SET : next_state = DISP_OFF;DISP_OFF : next_state = CLR_SCR;CLR_SCR : next_state = CURSOR_SET1;CURSOR_SET1 : next_state = CURSOR_SET2;CURSOR_SET2 : next_state = ROW1_ADDR;ROW1_ADDR : next_state = ROW1_0;ROW1_0 : next_state = ROW1_ADDR;default : next_state = IDLE ;endcaseendalways @ (posedge lcd_clk, negedge rst_n)beginif(!rst_n)beginlcd_rs <= 0;lcd_data <= 8'hxx;endelsebegincase(next_state)IDLE : lcd_rs <= 0;DISP_SET : lcd_rs <= 0;DISP_OFF : lcd_rs <= 0;CLR_SCR : lcd_rs <= 0;CURSOR_SET1 : lcd_rs <= 0;CURSOR_SET2 : lcd_rs <= 0;ROW1_ADDR : lcd_rs <= 0;ROW1_0 : lcd_rs <= 1;endcasecase(next_state)IDLE : lcd_data <= 8'hxx;DISP_SET : lcd_data <= 8'h38;DISP_OFF : lcd_data <= 8'h08;CLR_SCR : lcd_data <= 8'h01;CURSOR_SET1 : lcd_data <= 8'h04;CURSOR_SET2 : lcd_data <= 8'h0C;ROW1_ADDR : lcd_data <= 8'h80;ROW1_0 : lcd_data <= row1_val[127:120];endcaseendendassign lcd_e = lcd_clk; // 数据在时钟高电平被锁存assign lcd_rw = 1'b0; // 只写endmodule5.下载电路及引脚分配设计设计中用实验箱自带的50MHz时钟信号作为输入端,用sel0、sel1、sel2三个使能端选通LCD1602液晶屏,EP2C8Q208C8就会工作在给液晶下命令的状态,使得点阵正常工作,如图3.5.1所示。

LCD1602及其控制器的基本显示方法

LCD1602及其控制器的基本显示方法

LCD1602及其控制器的基本显⽰⽅法LCD显⽰及键盘⽤法LCD1602及其控制器的基本显⽰⽅法向LCD输⼊的数据为ASCII码,需要通过数码扫描依次送到LCD显⽰,下⾯介绍LCD 控制器IP核LCD16X2A及其相关程序。

逻辑符号如下图:U_lcd_ctrl模块即为该控制器核在AltiumDesinger原理图中的符号表⽰。

其作⽤是接受前⾯⽤户⾃⼰的逻辑单元送来的ASCII码数据和控制信号,然后与外部的LCD显⽰器通讯,显⽰相应字符。

数据总线使⽤输⼊输出分离模式,IP核后⾯需要增加双向BUF控制单元(U8)。

L CD控制器端⼝说明如下:⽤户控制逻辑接⼝:CLK:控制器⼯作时钟,上升沿有效RST:复位信号,⾼电平有效DA TA[7..0]:ASCII码数据总线ADDR[3..0]:字符在LCD屏幕上的地址(共两⾏,每⾏16个字符)ADDR=“0000”~“1111”对应每⾏的第0~15个字符LINE:LCD1602屏幕上的⾏选择信号,LINE=0时数据在第⼀⾏显⽰,LINE=1时数据在第⼆⾏显⽰BUSY:控制器忙信号,数据未显⽰稳定时BUSY=1;反之为0STROBE:数据输⼊有效使能,⾼电平有效LCD显⽰器接⼝:LCD_E:LCD显⽰器使能LCD_RW:LCD读写⽅向控制LCD_RS:LCD命令,数据选择LCD_DA TA_TRI:LCD数据⾼阻态控制LCD_DA TAO:LCD数据输出总线LCD_DA TAI:LCD数据输⼊总线控制器⼯作原理如下:A 控制器复位当RST信号有效时(⾼电平),控制器进⼊LCD复位与初始化操作,此时,BUSY信号持续⾼电平,表⽰控制器忙,LCD不能进⾏⽤户请求的操作。

RST信号由⾼变低后的⼤约80us之后,LCD控制器初始化完成,可以响应⽤户的操作请求,此时,BUSY信号变低。

LCD处于显⽰模式。

B 字符显⽰上电后的LCD必须初始化⼀次,之后LCD控制器停留于“WAIT FOR DA TA”状态。

LCD1602液晶显示实验报告

LCD1602液晶显示实验报告

LCD1602液晶显示实验报告实验报告:LCD1602液晶显示实验实验目的:1.了解LCD1602液晶显示的工作原理和基本结构;2.掌握LCD1602液晶显示的驱动控制方法;3.能够通过Arduino控制LCD1602液晶显示。

实验材料:1.Arduino UNO开发板2.LCD1602液晶显示屏3.面包板4.杜邦线实验步骤:1.将Arduino UNO开发板与面包板连接,确保连接正确并牢固;2.将LCD1602液晶显示屏与面包板连接,连接时应注意引脚的对应关系,确保连接正确;3.将杜邦线的一端连接到Arduino UNO开发板的数字引脚上,另一端连接到对应的液晶显示屏引脚上;4.编写Arduino代码,实现液晶显示屏的控制功能;5.将编写好的代码上传到Arduino UNO开发板上,运行程序,观察LCD1602液晶显示屏上的显示结果。

实验结果:通过实验,我们成功实现了对LCD1602液晶显示屏的控制。

在液晶显示屏上可以显示出我们想要的文字、数字或符号。

通过控制液晶显示屏的引脚电平,可以控制液晶显示出不同的字符。

实验总结:通过本次实验,我们了解了LCD1602液晶显示的工作原理和基本结构。

液晶显示屏通过控制引脚电平来控制液晶分子的排列,从而实现文字、数字或符号的显示。

我们还掌握了LCD1602液晶显示的驱动控制方法,通过编写Arduino代码,我们能够实现对液晶显示屏的控制。

在实验中,我们还学习到了Arduino的使用,它是一款开放源代码的电子原型平台,由硬件和软件组成。

通过编写Arduino代码,我们可以控制与Arduino连接的各种外设,包括LCD1602液晶显示屏。

通过本次实验,我们不仅加深了对LCD1602液晶显示的理解,还学会了使用Arduino控制液晶显示屏。

这对我们的电子制作和嵌入式系统开发有重要意义。

lcd1602液晶显示模块工作原理

lcd1602液晶显示模块工作原理

lcd1602液晶显示模块工作原理LCD1602液晶显示模块,是基于液晶原理制造的一种显示设备,用于显示一定范围内的字符和图形,具有低功耗、可读性高和驱动电压低的特点。

液晶显示器广泛应用于信息显示、电子设备和仪器仪表等领域,此处将介绍LCD1602液晶显示模块的工作原理。

液晶是一种介于液态和晶态之间的物质,具有相对固定的空间结构和形态。

在适当的电场作用下,液晶与晶体的结构会发生变化,使振动光学变化。

液晶分为向列型和扭曲型两种,其中向列型液晶被广泛应用于液晶显示器中。

LCD1602液晶显示模块采用的是向列型TN液晶,即垂直于基板的向列型液晶。

这种液晶具有易于制造和密集排列等优点,且电压控制范围较宽,能够实现高对比度的显示效果。

液晶显示器由玻璃基板、液晶材料、导电膜和驱动电路等组成。

LCD1602液晶显示模块由两个玻璃基板组成,中间夹着液晶材料。

内置了驱动芯片HD44780,是一种标准的液晶显示器驱动芯片。

导电膜被涂在基板的特定位置上,构成各种字符或图形。

驱动电路将字符或图形的显示信息转换为特定电压信号,驱动导电膜,使显示信息正常显示。

液晶显示器的显示原理是利用不同介电常数的液晶材料分子与外加电场的相互作用,通过改变液晶分子的定位使光线产生相位差,产生的相位差呈现出不同的色彩,从而完成图像的显示。

液晶材料对电压的敏感度很高,在较小的电场作用下可以获得明显的光学改变。

对于LCD1602液晶显示模块,通过控制某些导电膜的电压,使得液晶分子的定向改变,从而改变光的透射,从而实现字符或图形的显示。

LCD1602液晶显示模块的驱动芯片HD44780,内置了字符发生器ROM和VRAM。

当要显示一个字符或图形时,先在VRAM中写入该字符或图形的码位,然后给控制指令写入相应的地址指令和数据指令。

驱动芯片将读入的数据码位解读为具体的显示内容,并驱动导电膜,控制液晶分子的定向,使光线透过液晶分子后呈现出相应的字符或图形。

LCD1602液晶显示实验

LCD1602液晶显示实验

LCD1602液晶显示实验1.实验原理1.1 基本原理1.1.1 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

1.1.2 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图1-2所示:图1-2 1602LCD尺寸图1.1602LCD主要技术参数:显示容量: 16×2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V字符尺寸: 2.95×4.35(W×H)mm2.引脚功能说明:1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表:表1-3引脚接口说明表编符号引脚说明编号符号引脚说明号1 VSS 电源地9 D2 数据2 VDD 电源正极10 D3 数据3 VL 液晶显示偏压11 D4 数据4 RS 数据/命令选择12 D5 数据5 R/W 读/写选择13 D6 数据6 E 使能信号14 D7 数据7 D0 数据15 BLA 背光源正极8 D1 数据16 BLK 背光源负极1.1.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表1-4所示:表1-4 控制命令表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *6 置功能0 0 0 0 1 DL N F * *7 置字符发生存贮器地址0 0 0 1 字符发生存贮器地址8 置数据存贮器地址0 0 1 显示数据存贮器地址9 读忙标志或地址0 1 BF 计数器地址10 写数到CGRAM或DDRAM)1 0 要写的数据内容11 从CGRAM或DDRAM读数1 1 读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

LCD1602滚动显示

LCD1602滚动显示

/********************************************************************************* 描述: LCD1602 滚动显示 ** 显示方式: ** 1、从左到右逐字显示,闪动二次,清屏。

** 2、再从右到左逐字显示,闪动二次,清屏。

** 3、周期性地重复上述显示方式。

* ********************************************************************************/#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef bit BOOL;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;BYTE code dis1[] = {" WELCOME TO "};BYTE code dis2[] = {" "};BYTE code dis3[] = {" OT EMOCLEW "};BYTE code dis4[] = {" MOC.NIHCERP.WWW "};delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);LCD_EP = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}main(){BYTE i;lcd_init(); // 初始化LCDdelay(10);while(1){lcd_wcmd(0x06); //向右移动光标lcd_pos(0); //设置显示位置为第一行的第1个字符 i = 0;while(dis1[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis1[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x40); //设置显示位置为第二行第1个字符 i = 0;while(dis2[ i ] != '\0')lcd_wdat(dis2[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_wcmd(0x04); //向左移动光标lcd_pos(15); //设置显示位置为第一行的第16个字符 i = 0;while(dis3[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis3[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x4F); //设置显示位置为第二行的第16个字符 i = 0;while(dis4[ i ] != '\0'){lcd_wdat(dis4[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(200); //控制两屏转换时间}}。

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序一、实验目的本次实验的主要目的是熟悉并掌握 LCD1602 液晶显示屏的工作原理和编程方法,能够成功实现字符在液晶屏幕上的显示和控制。

二、实验原理LCD1602 是一种工业字符型液晶,能够显示 16x2 个字符,即每行16 个字符,共 2 行。

它的工作原理是通过控制液晶分子的偏转来实现字符的显示。

LCD1602 有 16 个引脚,主要引脚功能如下:1、 VSS:接地。

2、 VDD:接电源(通常为+5V)。

3、 V0:对比度调整引脚,通过外接电位器来调节屏幕显示的对比度。

4、 RS:寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。

5、 RW:读写选择引脚,高电平时进行读操作,低电平时进行写操作。

6、 E:使能引脚,下降沿触发。

7、 D0 D7:数据引脚,用于传输数据和指令。

LCD1602 的指令集包括清屏、归位、输入方式设置、显示开关控制、光标或显示移位、功能设置、CGRAM 和 DDRAM 地址设置以及读忙标志和地址等。

三、实验设备与材料1、单片机开发板2、 LCD1602 液晶显示屏3、杜邦线若干4、电脑四、实验步骤1、硬件连接将 LCD1602 的 VSS 引脚接地。

将 VDD 引脚接+5V 电源。

将 V0 引脚通过一个 10K 的电位器接地,用于调节对比度。

将 RS、RW、E 引脚分别连接到单片机的三个 I/O 口。

将 D0 D7 引脚连接到单片机的 8 个 I/O 口。

2、软件编程包含必要的头文件。

定义与 LCD1602 连接的 I/O 口。

编写初始化函数,包括设置显示模式、清屏、输入方式等。

编写写指令函数和写数据函数,用于向LCD1602 发送指令和数据。

编写显示字符串函数,实现字符在屏幕上的显示。

3、编译下载程序使用编译软件对编写的程序进行编译,生成可执行文件。

将可执行文件下载到单片机开发板中。

4、观察实验结果给开发板上电,观察 LCD1602 液晶显示屏上是否正确显示预设的字符。

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

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity lcdplay is
port(clk,reset,lcdopen:in std_logic;
lcd_on,lcd_en,lcd_rw:out std_logic;
LCD_Data:out std_logic_vector(8 downto 0)
);
end lcdplay;
architecture zw of lcdplay is
signal clk1hz:std_logic;
--signal cnt2:std_logic_vector(4 downto 0);
type statetype is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23);
signal pstate,nstate:statetype;
begin
lcd_on<=lcdopen;
process(clk)
variable cnt1:integer range 0 to 4999999;
begin
if rising_edge(clk) then
if cnt1=4999999 then
cnt1:=0;
else
cnt1:=cnt1+1;
end if;
if cnt1<2500000 then
clk1hz<='1';
else
clk1hz<='0';
end if;
lcd_en<=clk1hz;
end if;
end process;
--process(clk1hz)
-- begin
-- if Reset='0'then
-- cnt2<="00000";
--- elsif rising_edge(clk1hz) then
-- if cnt2<"10000" then
-- cnt2<=cnt2+1;
-- else
-- cnt2<="00000";
--end if;
--end process;
process(pstate,reset)
begin
--lcd_en<=clk1hz;
if reset='1' then
nstate<=s0;
LCD_Data<="000000001";
else
case pstate is
when s0=>
lcd_rw<='0';
nstate<=s1;
LCD_Data<="000111000";--/*设置8位格式,2行,5*7*/ ,顺序2,3的要求
when s1=>
nstate<=s2;
LCD_Data<="000001100"; --/*整体显示,关光标,光标闪烁/ ,顺序4的要求
when s2=>
--lcd_rw<='0';
nstate<=s3;
LCD_Data<="000000001";--清屏,顺序5的要求
when s3=>
--lcd_rw<='0';
nstate<=s4;
LCD_Data<="000000110"; --/*显示移动格式,看最后两位,10表示光标右移,顺序6的要求
when s4=>
--lcd_rw<='0';
nstate<=s5;
LCD_Data<="010000100";--设定显示的位置在01H+80H,即显示屏第一行第01H个位置,顺序7的要求
when s5=>
nstate<=s6;
LCD_Data<="101011010";--Z
when s6=>
--lcd_rw<='1';
nstate<=s7;
LCD_Data<="101101000";--上一步基础上地址加一,显示字符h when s7=>
--lcd_rw<='1';
nstate<=s8;
LCD_Data<="101100001";--a
when s8=>
nstate<=s9;
LCD_Data<="101101110";--n
when s9=>
nstate<=s10;
LCD_Data<="101100111";--g
when s10=>
nstate<=s11;
LCD_Data<="101110111";--w
when s11=>
nstate<=s12;
LCD_Data<="101100101";--e
when s12=>
nstate<=s13;
LCD_Data<="101101001";--i
when s13=>
lcd_rw<='0';
LCD_Data<="011000011";
nstate<=s14;
when s14=>
nstate<=s15;
LCD_Data<="100110010";--2
when s15=>
nstate<=s16;
LCD_Data<="100110000";--0
when s16=>
nstate<=s17;
LCD_Data<="100110001";--1
when s17=>
nstate<=s18;
LCD_Data<="100110001";--1
when s18=>
nstate<=s19;
LCD_Data<="100110001";--1
when s19=>
nstate<=s20;
LCD_Data<="100110001";--1
when s20=>
nstate<=s21;
LCD_Data<="100110001";--1
when s21=>
nstate<=s22;
LCD_Data<="100110010";--2
when s22=>
nstate<=s23;
LCD_Data<="100110000";--0
when s23=>
nstate<=s0;
LCD_Data<="100111000";--0 end case;
end if;
end process;
process(clk1hz,nstate)
begin
if clk1hz'event and clk1hz='1' then
pstate<=nstate;
end if;
end process;
end zw;。

相关文档
最新文档