基于FPGA的LCD12864液晶汉字显示设计 及VHDL语言的应用
- 格式:ppt
- 大小:1.08 MB
- 文档页数:31
液晶显示实验一实验要求所有程序必须由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五实验结果满足实验要求,液晶进行扫描屏幕显示中英文转换。
基于FPGA及VHDL的LED点阵汉字滚动显示设计方案发布: 2011-8-31 | 作者: —— | 来源:wangliuguo| 查看: 555次| 用户关注:汉字滚动显示器的传统设计方法是用单片机来控制的,虽然单片机方案具有价格低廉,程序编程灵活等特点,但由于单片机硬件资源的限制,未来对设计的变更和升级,总是要付出较多研发经费和较长投放市场周期的代价,甚至有可能需要重新设计。
况且,在以显示为主的系统中,单片机的运算和控制等主要功能的利用率很低,单片机的优势得不到发挥,相当于很大的资源浪费。
采用EDA技术的自顶向下的模块化设计方法,借助相关开发软件,例如Qua汉字滚动显示器的传统设计方法是用单片机来控制的,虽然单片机方案具有价格低廉,程序编程灵活等特点,但由于单片机硬件资源的限制,未来对设计的变更和升级,总是要付出较多研发经费和较长投放市场周期的代价,甚至有可能需要重新设计。
况且,在以显示为主的系统中,单片机的运算和控制等主要功能的利用率很低,单片机的优势得不到发挥,相当于很大的资源浪费。
采用EDA技术的自顶向下的模块化设计方法,借助相关开发软件,例如QualtusⅡ软件,将硬件描述语言——VHDL程序固化于具有丰富I/O口、内部逻辑和连线资源的FPGA(现场可编程门阵列)中。
该技术具有系统设计效率高、集成度好、保密性强、易于修改、易于实现等优点,成为当今数字系统设计主流技术。
此方式所制作的LED点阵控制器,由于是纯硬件行为,具有速度快、可靠性高、抗干扰能力强、开发周期短等显著优点。
1 EDA点阵显示汉字原理以8×8的LED点阵为例,8×8的LED点阵是由64个发光二极管按矩阵形式排列而成,每一行上的发光管有一个公共的阳极(或阴极),每一列上的发光管有一个公共的阴极(或阳极),一般按动态扫描方式显示汉字或图形。
扫描分为点扫描、行扫描和列扫描三种方式。
行扫描需要按行抽取字型码,列扫描则需要按列抽取字型码。
LCD 128641.总体设计思路SMG12864一般用于显示汉字,字符,分辨率不高的bmp图像,可用来显示传感器采集到信息,是单片机和人交换信息的窗口,2.方案设计8051Lcd12864单片机3.硬件设计单片机控制12864的管脚来显示想要的字符和图像,P0用来发送必要的指令和数据,P2口协助P1口给12864写数据,1. 指令寄存器(IR)IR 是用于寄存指令码,与数据寄存器数据相对应。
当D/I=0 时,在E 信号下降沿的作用下,指令码写入IR。
2.数据寄存器(DR)DR 是用于寄存数据的,与指令寄存器寄存指令相对应。
当D/I=1 时,在下降沿作用下,图形显示数据写入DR,或在E 信号高电平作用下由DR 读到DB7∽DB0数据总线。
DR 和DDRAM 之间的数据传输是模块内部自动执行的。
3.忙标志:BFBF 标志提供内部工作情况。
BF=1 表示模块在内部操作,此时模块不接受外部指令和数据。
BF=0 时,模块为准备状态,随时可接受外部指令和数据。
利用STATUS READ 指令,可以将BF 读到DB7 总线,从检验模块之工作状态。
4.显示控制触发器DFF此触发器是用于模块屏幕显示开和关的控制。
DFF=1 为开显示(DISPLAY OFF),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。
DDF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。
5.XY 地址计数器XY 地址计数器是一个9 位计数器。
高3 位是X 地址计数器,低6 位为Y 地址计数器,XY 地址计数器实际上是作为DDRAM 的地址指针,X 地址计数器为DDRAM的页指针,Y 地址计数器为DDRAM 的Y 地址指针。
X 地址计数器是没有记数功能的,只能用指令设置。
Y 地址计数器具有循环记数功能,各显示数据写入后,Y 地址自动加1,Y 地址指针从0 到63。
6.显示数据RAM(DDRAM)DDRAM 是存储图形显示数据的。
( 一 ) ( 一 )概括⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3(二) ( 二)外形尺寸1 方框⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 外型尺寸⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4( 三 )( 三 )模的接口⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4( 四 )( 四 )硬件明⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5( 五 )指令明⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7( 五 )( 五 )写操作序⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯8( 六 )( 六 )沟通参数⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯11( 七 )( 七 )件初始化程⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12( 八 )( 八 )用例⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13( 九 )( 九 )附1 半字符表⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯202 字字符表⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯21一、概括FYD12864-0402B是一种拥有 4 位/8 位并行、 2 线或 3 线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为 128× 64, 内置 8192 个 16*16 点汉字,和 128 个 16*8 点 ASCII 字符集 . 利用该模块灵巧的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
能够显示 8× 4 行 16× 16 点阵的汉字 . 也可达成图形显示 . 低电压低功耗是其又一明显特色。
由该模块构成的液晶显示方案与同种类的图形点阵液晶显示模块对比,无论硬件电路构造或显示程序都要简短得多,且该模块的价钱也略低于同样点阵的图形液晶模块。
基本特征 :低电源电压( VDD:+3.0--+5.5V)显示分辨率 :128 × 64 点内置汉字字库,供给8192 个 16× 16 点阵汉字 ( 简繁体可选 )内置 128 个 16× 8 点阵字符2MHZ时钟频次显示方式: STN、半透、正显驱动方式: 1/32DUTY, 1/5BIAS视角方向: 6 点背光方式:侧部高亮白色 LED,功耗仅为一般 LED的 1/5 —1/10 通信方式:串行、并口可选内置 DC-DC变换电路,无需外加负压无需片选信号,简化软件设计工作温度 :0 ℃ -+55℃ ,储存温度:-20℃ -+60℃二、方框图3、外形尺寸图三、模块接口说明* 说明 1:如在实质应用中仅使用串口通信模式,可将PSB接固定低电平,也能够将模块上的J8 和“ GND”用焊锡短接。
摘要:本文主要讨论了使用EDA工具设计汉字滚动显示器的技术问题。
文中首先描述了基于现场可编程门阵列(FPGA)的硬件电路;然后研究了在8×8LED发光二极管点阵上显示滚动汉字的原理,并给出了基于ALTERA的参数化模型库LPM描述其功能的VHDL语言程序设计;最后对使用EDA工具软件加工被显示数据文件的方法进行了讨论。
采用传统方法设计的汉字滚动显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB(印制电路板)板级的系统集成。
尽管这种方案有单片机软件的支持较为灵活,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多研发经费和较长投放市场周期的代价。
随着电子设计自动化(EDA)技术的进展,基于可编程ASIC器件的数字电子系统设计的完整方案越来越受到人们的重视,并且以EDA技术为核心、的能在可编程ASIC器件上进行系统芯片集成的新设计方法,也正在快速地取代基于PCB板的传统设计方式。
如何使用EDA工具设计电子系统是人们普遍关心的问题。
在EDA工具软件MAX+PLUS Ⅱ的支持下,本设计通过了编译、适配和软件仿真验证。
最后用载入真实实验系统的硬件实验证明了它的正确性。
硬件设计为了简化讨论,本文只研究在单个8×8 LED 发光二极管点阵上滚动显示多汉字信息的问题。
图1给出的就是一个使用美国ALTERA公司10K系列FPGA设计的可支持滚动显示多汉字信息的通用硬件电路。
在图中,标准JTAG接口与PC机并口相连,用于下载设计数据至FPGA中;LED点阵的data线由FPGA的I/O线串300Ω限流电阻后驱动,而sw线直接由FPGA的I/O 线驱动。
LED点阵采用扫描式工作方式,控制sw线的循环扫描信号为低电平有效,显示数据data为高电平有效。
由于ALTERA的10K10LC84-4芯片内部有足够的RAM资源,所以本设计没有采用外部RAM。
另外,图中的配置EPROM为可选件,只有当要求汉字滚动显示器脱机运行时才需要采用。
LCD12864原理与应用1、LCD12864简介:LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。
而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。
下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。
引脚符号状态引脚名称#功能CS1,CS2输入芯片片选端,都是低电平有效CS1=0开左屏幕,CS1=1关左屏幕CS2=0开右屏幕,CS2=1关右屏幕RS输入。
数据/命令选择信号RS=1为数据操作,RS=0为写指令或读状态RW输入读写选择信号R/W=1为读选通,R/W=0为写选通E/输入读写使能信号在E下降沿,数据被锁存(写)入液晶,在E高电平期间,数据被读出DB0—DB7三态数据总线数据或指令的传送通道。
RST 输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用V0#液晶显示器驱动电压-Vout-10V LCD驱动负电压分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。
这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。
此液晶有8页,一页有8行点阵点,左右各64列,共128列。
如下图所示:2、LCD12864中的几条重要指令】(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。
(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。
(三)列(column)地址设置指令!每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。
(四)读状态指令!3、用LCD12864显示汉字(一)由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址,LCD1602显示自定义字符的时候也是用它。
本段程序可以将4*4小键盘上读入的四位数值(需要另外的程序)百位K1、十位K2、个位K3和单位K4显示出来。
经FPGA实验效果良好。
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 ISSIGNAL y : BIT_vector (10 DOWNTO 0);signal var1,var2,var3:integer;--//状态定义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";CONSTANT dat0 : std_logic_vector(7 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";CONSTANT dat11 : std_logic_vector(7 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):="00000111";SIGNAL k2_r : std_logic_vector(7 DOWNTO 0):="00001000";SIGNAL k3_r : std_logic_vector(7 DOWNTO 0):="00001001";SIGNAL k4_r : std_logic_vector(7 DOWNTO 0):="00001100";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)BEGINaaaIF(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"30" ;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"31" ;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"32" ;end case;case k4_r is --单位when "00001010"=>d<= x"48"; --Hwhen "00001011"=>d<= x"4B"; --Kwhen "00001100"=>d<= x"4D"; --M when others =>d<=x"48";end case;end if;end process;END fun;。
LCD12864液晶显示模块的使用与分析(函代码分析)一、LCD12864功能应用LCD12864液晶显示模块能显示中文汉字、数字、字符,能显示数字与字符的个数为64个(4行,每行16个数字或字符),能显示汉字的个数为32个(4行,每行8个汉字)。
其内置了8192个中文汉字(16*16的点阵)、128个字符(8*16点阵)、以及64*256 点阵显示RAM(GDRAM)。
图1外观尺寸图图2外观尺寸图图3 LCD12864读操作时序图4 LCD12864写操作时序二、LCD12864主要技术参数(1)工作电压:3.3V-5.5V,模块最佳电压为5V。
(2)可以在显示界面显示数字、字母和中文汉字。
(3)与外部单片机的通信方式有并行或串行两种通信方式,这里主要介绍并行通信方式。
(4)显示内容:128 列× 64 行(5)显示颜色:黄绿/蓝屏/灰屏(6)LCD 类型:STN(7)与MCU 接口:8 位或4 位并行/3 位串行(8)配置LED 背光(9)多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等三、LCD12864液晶显示的电路用法分析图5 LCD12864电路连接图图6 LCD12864电路连接图LCD12864模块主要用来显示所要的界面信息或数据,所以要求能显示汉字,字符和数字,而LCD12864满足系统要求的显示功能。
LCD12864在显示字母和数字时,是4*16的显示字符模块,即可以显示4行,每行可以显示16个字母或数字;在显示汉字时,是4*8的汉字显示模块,即可以显示4行,每行可以显示8个汉字。
下面进行介绍的是并行通信的显示方式。
按照电路原理图跟单片机最小系统进行连线,如图6所示。
LCD12864共有20个引脚,其引脚具体功能如表1所示,由表可得LCD12864引脚组成为8位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个电源背光引脚(BLK,BLA),控制LCD的背景亮度;一个VO引脚,外接一个上拉电阻(控制LCD12864的字符对比度,让字符更加的清晰可见);RST复位引脚,低电平有效,此处直接接高电平;第16、17位空引脚,不用管;剩下的RS,RW,EN 和PSB四个引脚则跟LCD12864的写入息息相关,通过PSB可以控制LCD12864跟单片机的通信方式,输入高电平,则LCD12864跟单片机的通信模式为并行通信,低电平则为串行通信。