基于FPGA的LCD1602动态显示
- 格式:docx
- 大小:15.81 KB
- 文档页数:4
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液晶显示实验报告一、实验目的(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及其控制器的基本显⽰⽅法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液晶显示实验实验目的: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液晶显示模块采用的是向列型TN液晶,即垂直于基板的向列型液晶。
这种液晶具有易于制造和密集排列等优点,且电压控制范围较宽,能够实现高对比度的显示效果。
液晶显示器由玻璃基板、液晶材料、导电膜和驱动电路等组成。
LCD1602液晶显示模块由两个玻璃基板组成,中间夹着液晶材料。
内置了驱动芯片HD44780,是一种标准的液晶显示器驱动芯片。
导电膜被涂在基板的特定位置上,构成各种字符或图形。
驱动电路将字符或图形的显示信息转换为特定电压信号,驱动导电膜,使显示信息正常显示。
液晶显示器的显示原理是利用不同介电常数的液晶材料分子与外加电场的相互作用,通过改变液晶分子的定位使光线产生相位差,产生的相位差呈现出不同的色彩,从而完成图像的显示。
液晶材料对电压的敏感度很高,在较小的电场作用下可以获得明显的光学改变。
对于LCD1602液晶显示模块,通过控制某些导电膜的电压,使得液晶分子的定向改变,从而改变光的透射,从而实现字符或图形的显示。
LCD1602液晶显示模块的驱动芯片HD44780,内置了字符发生器ROM和VRAM。
当要显示一个字符或图形时,先在VRAM中写入该字符或图形的码位,然后给控制指令写入相应的地址指令和数据指令。
驱动芯片将读入的数据码位解读为具体的显示内容,并驱动导电膜,控制液晶分子的定向,使光线透过液晶分子后呈现出相应的字符或图形。
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 滚动显示 ** 显示方式: ** 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 是一种工业字符型液晶,能够显示 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 液晶显示屏上是否正确显示预设的字符。
LCD1602的简单使用原理——跟大家分享我学习1602的总结与体会我的总结主要分为这几部分:①LCD1602的硬件特性及引脚功能②LCD1602的时序特性③LCD1602的使用原理(包括带字库和不带字库的简要使用方法,控制显示指令)④基于FPGA的LCD1602使用案例Part 1. LCD1602的硬件特性及引脚功能LCD1602顾名思义是一种02*16,即为两行十六列的液晶显示屏,液晶两行,每行可以显示16个字符,但是CGRAM及CGROM里面一共有160个字符,包括阿拉伯数字,英文字母大小写,常用符号及日文。
每个字符对应于一个ASCII码值,在液晶显示屏上显示对应的字符时候,只需要将对应的ASCII码写到DDRAM中就好,详细的步骤会在下面细说。
液晶板上排列着5*8的字符点阵,8行,每行5个点位,高电平1就是该点显示,低电平0就是该点不显示。
一、引脚功能:RS,R/W,E控制数据端口DB0~DB7,数据的命令的读写由控制端口控制,并通过数据端口传输。
端口其他特性这里不再赘述,详细见1602液晶手册。
O(∩_∩)O二、硬件特性:①CGRAM 和CGROMCGRAM:character generator ram CGROM:character generator romCGRAM的地址空间:CGRAM的地址是0x40~0x7F, 64个地址空间,每个地址双字节,一共128字节,一个字符是8个字节,所以一共能显示8个自定义字符(每个双字节地址只有一个字节是被自定义字符数据写入的,另外个字节无效,因为CGARM的字符代码的规定,详细原因见下面)字符对应的区位码如下图所示:CGRAM: 字符产生ram,用来存放用户自定义的字符,如上图的两条(1)~(8),区位码为0x00~0x0F.0x00~0x07对应于(1)~(8);0x08~0x0F对应于下一条(1)~(8),虽然看起来有16个地址,但是其实只要8个地址可用,CGRAM的“字符码”规定0~2为地址,3位无效,4~7位全为0,因此CGRAM的字符码等效为0000X111,X为无效位,最后三位的地址只要八个,所以实际能用的只有8个。
2018年3月刊0 引言本设计中使用DE2开发板上的LCD1602液晶显示屏,此显示屏能够显示2行16列的5×7点阵字符,液晶模块内部CGROM中储存的字符包括阿拉伯数字、英文字母的大小写、常用的符号和日文假名等。
使用液晶显示屏相比于数码管或者LED显示有着极大的优势,其应用范围更广、显示功能更强,易于实现当今系统设计中越来越多的人机交互功能。
如今LCD液晶在智能电子产品中应用广泛,使用LCD液晶显示的系统设计已经成为电子产品设计中不可或缺的一部分。
使用FPGA对LCD1602进行驱动,可以实现系统各模块并行执行,从而使得显示部分实时反映系统状态,而且对于程序的各个模块便于修改与移植。
本设计使用Verilog语言对DE2开发板上的FPGA进行编程,驱动LCD1602显示字符。
1 原理1.1 硬件接口LCD1602受DE2开发板上的一块Cyclone II FPGA控制,两者相关引脚相连。
通过对FPGA进行编程就可以驱动LCD1602,从而实现字符的显基于FPGA的LCD1602液晶显示屏系统控制设计段旭阳1,韩延义2,王晓丹1,宋闻萱1(1.大连理工大学电子信息与电气工程学部,辽宁 大连 116024; 2.大连理工大学电工电子国家级实验教学示范中心、 国家级虚拟仿真实验教学中心,辽宁 大连 116024)【摘要】本研究基于FPGA实现驱动LCD1602液晶显示屏显示数字或者英文字符,设计中使用了Verilog硬件描述语言、Quartus II 6.0软件编程调试环境和DE2硬件环境,以完成对LCD1602液晶显示屏的系统设计。
最终,此液晶显示屏LCD1602可以完成显示数字或者英文字符的功能,该系统得以验证。
【关键词】Verilog语言;LCD显示;FPGA设计【中图分类号】G482 【文献标识码】A 【文章编号】2095-5065(2018)03-0056-05收稿日期:2017-12-11作者简介:段旭阳(1997—),男,河北邢台人,本科生在读,研究方向为电子信息与电气工程;韩延义(1964—),男,辽宁大连人,工程师,研究方向为FPGA;王晓丹(1996—),女,山东东营人,本科生在读,研究方向为电子信息与电气工程;宋闻萱(1998—),女,吉林白山人,本科生在读,研究方向为电子信息与电气工程。
FPGA 控制LCD 1602调试笔记初始化步骤:1、0x38 设置为16*2显示,5*7点阵,8位数据接口2、0x0C 说明这里0c表示的是开显示,不显示光标,光标不显示,完整描述如下:3、0x01 清屏幕4、0x06表示读或者写之后,地址指针加1,光标加15、0x80 位置寄存器定位于第一行的最左边时序图:在本例中采用50兆分频到1k的时钟,也就是E的保持时间是1ms,达到以上的时序要求。
在Altera的DEO上验证通过,显示效果如下:完整代码如下:(本实例中,显示大写的LOVE!,第二行显示)module lcm(CLOCK_50,LCD_DATA,LCD_RW,LCD_RS,LCD_EN,LCD_BLON);input CLOCK_50;output [7:0]LCD_DATA;output LCD_RW;output LCD_RS;output LCD_EN;output LCD_BLON;reg [7:0]LCD_DATA;reg LCD_RW ;reg LCD_RS;reg LCD_EN;reg clk_1k=1'b0;reg [20:0]counter=0;reg [10:0]counter1=0;assign LCD_BLON=1;always@(posedge CLOCK_50)if(counter==25000)beginclk_1k<=~clk_1k;counter<=0;endelse counter<=counter+1;always@(posedge clk_1k)//beginif(counter1<1023)counter1<=counter1+1;casex (counter1)400:beginLCD_DATA<=8'b00111000; //0x38 设置显示模式LCD_RW<=1'b0;LCD_RS<=1'b0;end401:LCD_EN<=1'b1;410: //0x0c 开显示关光标beginLCD_DATA<=8'b00001100;LCD_RW<=1'b0;LCD_RS<=1'b0;end411: LCD_EN<=1'b1;420: begin //0x01 清屏幕LCD_DATA<=8'b00000001;LCD_RW<=1'b0;LCD_RS<=1'b0;end421: LCD_EN<=1'b1;430: begin //0x06 读或者写后自动加1 LCD_DATA<=8'b00000110;LCD_RW<=1'b0;LCD_RS<=1'b0;end431: LCD_EN<=1'b1;440:begin //0xc0 定位到第二行LCD_DATA<=8'b11000000;LCD_RW<=1'b0;LCD_RS<=1'b0;end441: beginLCD_EN<=1'b1;ack<=1;end450: begin //write data WLCD_DATA<=8'h57;LCD_RW<=1'b0;LCD_RS<=1'b1;end451: LCD_EN<=1'b1;460: begin //write data W LCD_DATA<=8'h57;LCD_RW<=1'b0;LCD_RS<=1'b1;end461: LCD_EN<=1'b1;470: begin //write data W LCD_DATA<=8'h57;LCD_RW<=1'b0;LCD_RS<=1'b1;end471: LCD_EN<=1'b1;480: begin //write data .LCD_DATA<=8'h2E;LCD_RW<=1'b0;LCD_RS<=1'b1;end481: LCD_EN<=1'b1;490: begin //write data TLCD_DATA<=8'h54;LCD_RW<=1'b0;LCD_RS<=1'b1;end491: LCD_EN<=1'b1;500:begin //write data XLCD_DATA<=8'h58;LCD_RW<=1'b0;LCD_RS<=1'b1;end501: LCD_EN<=1'b1;510:begin //write data SLCD_DATA<=8'h53;LCD_RW<=1'b0;LCD_RS<=1'b1;end511: LCD_EN<=1'b1;520: begin //write data K LCD_DATA<=8'h4B;LCD_RW<=1'b0;LCD_RS<=1'b1;end521: LCD_EN<=1'b1;530: begin //write data Y LCD_DATA<=8'h59;LCD_RW<=1'b0;LCD_RS<=1'b1;end531: LCD_EN<=1'b1;540: begin //write data .LCD_DATA<=8'h2E;LCD_RW<=1'b0;LCD_RS<=1'b1;end541: LCD_EN<=1'b1;550: begin //write data N LCD_DATA<=8'h4E;LCD_RW<=1'b0;LCD_RS<=1'b1;end551: LCD_EN<=1'b1;560: begin //write data E LCD_DATA<=8'h45;LCD_RW<=1'b0;LCD_RS<=1'b1;end561: LCD_EN<=1'b1;570: begin //write data T LCD_DATA<=8'h54;LCD_RW<=1'b0;LCD_RS<=1'b1;end571: LCD_EN<=1'b1;580: begin //定位到第一行LCD_DATA<=8'h80;LCD_RW<=1'b0;LCD_RS<=1'b0;end581: LCD_EN<=1'b1;590: begin //write data LLCD_DATA<=8'h4C;LCD_RW<=1'b0;LCD_RS<=1'b1;end591: LCD_EN<=1'b1;600: begin //write data OLCD_DATA<=8'h4F;LCD_RW<=1'b0;LCD_RS<=1'b1;end601: LCD_EN<=1'b1;610: begin //write data VLCD_DATA<=8'h56;LCD_RW<=1'b0;LCD_RS<=1'b1;end611: LCD_EN<=1'b1;620: begin //write data ELCD_DATA<=8'h45;LCD_RW<=1'b0;LCD_RS<=1'b1;end621: LCD_EN<=1'b1;630: begin //write data !LCD_DATA<=8'h21;LCD_RW<=1'b0;LCD_RS<=1'b1;end631: LCD_EN<=1'b1;default: LCD_EN<=1'b0;endcaseendendmodule作者:西电粽子邮箱:。
FPGA实验之1602字符液晶设计1. 实验目的:通过本次实验,掌握使用HDL语言操作1602字符液晶的方法。
2. 实验原理:(1)1602字符液晶简介上一课我们学会了LED数码管的原理及使用,下面,我们再来学习字符型液晶模块的使用。
液晶屏显示模块与数码管相比,它显得更为与业、漂亮。
液晶显示屏以其微功耗、体积小、显示内容丰富、超薄轻巧、使用方便等诸多优点,在通讯、仪器仪表、电子设备、家用电器等低功耗应用系统中得到越来越广泛的应用,使这些电子设备的人机界面变得越来越直观形象,目前已广泛应用与电子表、计算器、IC卡电话机、液晶电视机、便携式电脑、掌上型电子玩具、复印机、传真机等许多方面……1602字符液晶在实际的产品中运用的也比较多了。
而且对于FPGA的学习而言,掌握最常见的液晶屏1602的驱动与用法是每一个学习者必然要经历的过程。
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于SPLC780C液晶芯片的,控制原理是完全相同的,因此基于SPLC780C 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
目前市面上最常见的1602液晶背光主要有两种,一种是普通的黄绿色背光,黑色的文字。
另一种显示屏是蓝色背光白色字体,如下图所示。
前者使用更加广泛,成本低廉。
后者显示的效果更加美观,但是价格也相对较高。
此外还分别有单芯片与双芯片的版本。
LCD背面的黑块内部就封装了控制芯片,市面上许多低廉的1602都是单芯片驱动,性能不稳定,双芯片的价格要上高一些,但是稳定性要远远好于单芯片的1602。
本实验板采用了深圳亚斌电子有限公司生产的蓝色背光的双芯片YB1602A 液晶模块。
YB1602A采用COB工艺制作,结构稳定,使用寿命长,可以应用于智能仦器仦表,通讯,办公自动化以及军工领域。
1602液晶的正面(绿色背光,黑色字体)1602液晶的背面(绿色背光,黑色字体)YB1602A主要特性如下:◆8位并行数据接口,适配M6800系列时序;◆可选4位并行数据方式;◆具有字符发生器ROM,含10880位;◆192 种5×8 点字体字符;◆64 种5×10 点字体字符;◆具有字符发生器RAM,含512位;◆8 种5×8 点字体字符;◆4 种5×10 点字体字符;◆低功耗,高可靠性。
verilog lcd1602滚动显示原理
LCD1602是一种常见的液晶显示模块,通常用于显示字符和数字。
在Verilog中,使用LCD1602模块进行滚动显示的基本原理可以概括如下:
1. 初始化LCD1602: 在开始任何显示之前,需要初始化LCD1602。
这通常
包括设置其工作模式、显示开/关、光标位置等。
2. 数据写入: 要在LCD上显示任何内容,你需要将数据写入其数据总线。
一般来说,你会将你要显示的字符或数字的ASCII码写入LCD。
3. 滚动显示: 滚动显示的基本原理是不断地改变写入LCD的数据,使显示的内容看起来像是从一端滚动到另一端。
这通常是通过在一个循环中重复上述数据写入步骤来实现的,每次循环都会将数据显示向右移动一位(或更多)。
4. 光标控制: LCD1602有一个光标功能,允许你控制字符在LCD上的位置。
通过适当地设置光标位置,你可以控制滚动显示的速度和方向。
5. 刷新显示: 为了产生平滑的滚动效果,你需要以足够快的速度重复上述步骤。
这通常意味着使用一个计时器或某种形式的延迟来定期更新LCD的内容。
在Verilog中,实现上述原理需要编写相应的硬件描述语言代码。
这可能涉及到对LCD模块的读/写操作、计时器控制以及数据路径的设计。
由于
Verilog主要用于硬件描述和逻辑设计,因此需要深入理解硬件和数字电路的概念才能有效地实现滚动显示功能。
唐山学院《EDA技术》课程设计题目LCD1602显示控制器设计系(部) 信息工程系班级11电本3班姓名刘亮学号**********指导教师郭耀华田丽欣柳延领2014 年6 月30 日至7月4日共 1 周2014年7月4日课程设计成绩评定表目录1 引言 (1)1.1 EDA技术的介绍 (1)1.2 EDA技术的发展 (2)2 VHDL/Quartus II简介 (4)2.1 VHDL语言介绍 (4)2.2 界面介绍 (5)3 模块设计 (6)3.1 LCD1602液晶模块 (6)3.2 矩阵键盘模块 (9)3.3 设计思路 (10)4 系统设计方案一 (11)4.1 矩阵键盘模块设计 (11)4.2 LCD1602液晶显示模块设计 (14)5 系统设计方案二 (17)5.1拨码开关控制的LCD1602显示模块 (17)5.2拨码开关控制的LCD1602显示模块程序 (17)5.3拨码开关控制的LCD1602显示模块仿真图 (20)6 设计总结 (21)参考文献 (22)1 引言1.1 EDA技术的介绍在电子设计自动化(英语:Electronic design automation,缩写:EDA)出现之前,设计人员必须手工完成集成电路的设计、布线等工作,这是因为当时所谓集成电路的复杂程度远不及现在。
工业界开始使用几何学方法来制造用于电路光绘(photoplotter)的胶带。
到了1970年代中期,开发人员尝试将整个设计过程自动化,而不仅仅满足于自动完成掩膜草图。
第一个电路布线、布局工具研发成功。
设计自动化会议(Design Automation Conference)在这一时期被创立,旨在促进电子设计自动化的发展。
电子设计自动化发展的下一个重要阶段以卡弗尔·米德(Carver Mead)和琳·康维于1980年发表的论文《超大规模集成电路系统导论》(Introduction to VLSI Systems)为标志。
基于FPGA的LCD液晶动态显示驱动程序的设计周鹏;李园园【期刊名称】《电子质量》【年(卷),期】2014(000)011【摘要】为了提高工业生产过程中不同参数的可读性及显示的实时性,提出一种采用FPGA器件来实现LCD液晶动态显示的控制方法。
在整个设计过程中,完成了显示系统的硬件设计,同时也实现了液晶动态显示驱动程序的设计。
驱动程序主要包括A/D转换控制模块和LCD动态显示输出控制模块,利用Quartus II软件内嵌的SignalTap II Logic Analyzer逻辑分析模块对液晶动态显示驱动程序进行了实时测试,结果比较准确;同时也对现场的模拟电压值进行了实际硬件系统的测试,并通过LCD1602读取到了较为准确的电压数据,因此该动态显示系统的设计具有一定的应用价值。
%In order to improve the readability and real-time display of different parameters in the industrial process,propose a method of control ing dynamic display of LCD implemented by FPGA devices. Throughout the design process,completed the hardware design of display system,while achieving the de-sign of lcd dynamic display driver.The driver includes the control module of A/D converter and the output control module of LCD dynamic display,using the logic analyzer module of SignalTap II Logic Analyzer embedded in Quartus II software for real-time test to lcd dynamic driver,the result is more accurate;But also the analog voltage value of scene is tested on the hardware system,and read moreaccurate voltage data from the LCD1602,so the design of dynamic display system has a certain value.【总页数】4页(P34-36,42)【作者】周鹏;李园园【作者单位】抚顺职业技术学院,辽宁抚顺113122;抚顺职业技术学院,辽宁抚顺113122【正文语种】中文【中图分类】TN27【相关文献】1.基于FPGA的TFT-LCD液晶显示模块设计 [J], 张超建;王厚军2.基于FPGA的LCD1602液晶显示屏系统控制设计 [J], 段旭阳;韩延义;王晓丹;宋闻萱3.基于FPGA的LCD驱动程序设计 [J], 王彦;陈琼;田丹丹4.基于FPGA的LCD液晶显示器设计 [J], 王向玲5.基于FPGA的LCD动态显示控制系统设计与实现 [J], 李璐;余英因版权原因,仅展示原文概要,查看原文内容请购买。
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;。