基于FPGA的LCD12864液晶汉字显示设计 及VHDL语言的应用
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五实验结果满足实验要求,液晶进行扫描屏幕显示中英文转换。
基于FPGA及VHDL的LED点阵汉字滚动显示设计方案【VIP专享】

基于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个发光二极管按矩阵形式排列而成,每一行上的发光管有一个公共的阳极(或阴极),每一列上的发光管有一个公共的阴极(或阳极),一般按动态扫描方式显示汉字或图形。
扫描分为点扫描、行扫描和列扫描三种方式。
行扫描需要按行抽取字型码,列扫描则需要按列抽取字型码。
(完整word版)lcd12864 课程设计

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 是存储图形显示数据的。
LCD12864中文字库使用说明

( 一 ) ( 一 )概括⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯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”用焊锡短接。
用FPGA设计LED汉字滚动显示器

摘要:本文主要讨论了使用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为可选件,只有当要求汉字滚动显示器脱机运行时才需要采用。
基于FPGA的液晶12864控制电路的设计开题报告 2 (1)

预期成果;利用VHDL语言完成FPGA控制电路的设计,与液晶模块连接后的电路能够:
1.显示若干汉字。
2.显示中西文混合字符。
3.实现显示按键输入键值(0-9)。
4.显示静态图片。
五.研究课题的特色以及创新点
因为汉字本身的特点,显示汉字始终是计算机在我国应用普及的一个障碍。随着FPGA和显示技术的发展,加上人满不满足FPGA系统采用LED数码管的简单显示,利用FPGA控制液晶显示成为当前显示系统的主流。本次课题运用12864液晶模块进行汉字图片的显示,实现了一个可以显示汉字,字符和动态显示汉字的液晶显示设备。通过汉字显示程序的地址,接着运行相应的程序取汉字机内码和英文字符的ASCII码,并在存储器中进行寻址找出相对应的显示代码或汉字字模,提取后作为信息送液晶显示器显示。利用液晶显示器显示汉字操作灵活,汉字显示效果可以大大提高。
该课题的研究将有助于采用FPGA的系列产品的开发,特别是需要用到LCD来进行FPGA的产品开发。同时可以大大缩短FPGA的开发时间。另外,由于模块的易用性,也将使得更多的采用FPGA的产品之上出现LCD,增加人机之间的交互性,为行业和我们的生活带来新的变化。
设计中从LCD技术参数着手,通过对显示驱动系统结构与工作原理的研究,设计出显示控制系统的框图及各功能模块的VHDL程序,通过FPGA芯片控制LCD显示相应的汉字和图形。LCD显示控制系统由显示控制电路、显示驱动电路和相关外围辅助电路组成。显示控制电路从电路中各个功能模块所需要的控制时序信号出发,通过对其工作过程的研究,设计出控制器、RAM控制器等各功能模块。显示驱动电路从LCD工作所需要的扫描时序信号出发,设计出时序发生电路等各功能模块。所有的FPGA程序通过了QUARTUSIIⅡ软件实现编译及仿真后,在实际的硬件中调试通过。FPGA技术与LCD显示技术的结合使得LCD显示控制系统的开发周期短,开发难度降低。设计的显示控制系统使用简单,实用性强,能够满足设计的要求。
LCD12864原理与应用(源程序+原理图+proteus仿真)

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显示自定义字符的时候也是用它。
LCD12864VHDL语言例程

本段程序可以将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;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线, 透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。比 CRT要好的多,但是价钱较其它显示器贵。 FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列, 它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作 为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制 电路的不足,又克服了原有可编程器件门电路数有限的缺点。 本课题主要任务是设计基于FPGA的LCD控制器,兼顾好程序的易用性,以方 便之后模块的移植和应用。最后在FPGA上的任意位置显示任意的16*16D的 中文字符以及16*8的英文字符,另外要能根据输入数据的变化同步变化LCD 上显示的内容。同时要能将储存模块中的图片数据正常地显示在LCD上。该 课题的研究将有助于采用FPGA的系列产品的开发,特别是需要用到LCD得采 用FPGA的产品的开发。同时可以大大缩短FPGA的开发时间。另外,由于模块 的易用性,也将使得更多的采用FPGA的产品之上出现LCD,增加人机之间的 交互性,为行业和我们的生活带来新的变化。
• • • • • • • • • • •
• • • •
b) VHDL代码 (顶层设计) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY lcd12864 IS PORT ( CLOCK : IN std_logic; --全局时钟 Q_KEY : IN std_logic; --异步复位 -- LCD12864的接口 LCD12864_DATA : OUT std_logic_vector(7 DOWNTO 0); --数据总线 LCD12864_E : OUT std_logic; LCD12864_RS : OUT std_logic; --数据/指令 LCD12864_RW : OUT std_logic); --读/写 END lcd12864;
• 2) 主控时序进程 • 是指负责状态机运转和在时钟驱动正负现状态机转换的进程。状态机
• • • • •
随外部时钟信号以同步方式工作,当时钟的有效跳变到来时,时序进 程将代表次态的信号next_state中的内容送入现态信号current_state 中,而next_state中的内容完全由其他进程根据实际情况而定,此进 程中往往也包括一些清零或置位的控制信号。 3) 主控组合进程 根据外部输入的控制信号(包括来自外部的和状态机内容的非主控进 程的信号)或(和)当前状态值确定下一状态next_state的取值内容, 以及对外或对内部其他进程输出控制信号的内容。 4) 辅助进程 用于配合状态机工作的组合、时序进程或配合状态机工作的其他时序 进程。 在一般状态机的设计过程中,为了能获得可综合的,高效的VHDL状 态机描述,建议使用枚举类数据类型来定义状态机的状态,并使用多 进程方式来描述状态机的内部逻辑。例如可使用两个进程来描述,— 个进程描述时序逻辑,包括状态寄存器的工作和寄存器状态的输出, 另一个进程描述组合逻辑,包括进程间状态值的传递逻辑以及状态转 换值的输出。必要时还可以引入第三个进程完成其它的逻辑功能。
• 1.2 EDA概述 • 本设计采用EDA的自顶向下的设计方法。EDA(Electronic Design
Automation,即电子设计自动化)技术是微电子和计算机技术飞速发 展的产物,它融多学科于一体,是一门综合性的学科。它以计算机硬 件和系统软件为基本的工作平台,继承和借鉴前人在电路和系统、数 据库、图形学、图论和拓扑逻辑、计算数学、优化理论等多学科的最 新科技成果而研制成的商品化EDA通用支撑软件和应用软件包,其目 的在于帮助电子设计工程师在计算机上完成电路的功能设计、逻辑设 计、性能分析、时序测试直至PCB(印刷电路板)的自动设计等。与早 期的电子CAD软件相比,EDA软件的自动化程度更高,功能更完善, 运行速度更快,而且操作界面友好,有良好的数据开放性和互换性, 即不同厂商的EDA软件可相互兼容。因此,EDA技术一经出现,就很 快在世界各大公司、企业和科研单位得到了广泛的应用,并已成为衡 量一个国家电子技术发展水平的重要标志。
--数据的第一行 --数据的第二行 -- 数据的第三行 -- 数据的第四行 --数据总线
• 这个部分的主要功能是实现具体功能,并
进行时钟分频,写入数据。这个部分状态 机描述部分的功能是实现状态转变,不停 的改变状态,把次态赋给当前状态。达到 不断写入数据的目的。
• 1.3.2一般状态机的VHDL设计 • 用VHDL设计有限状态机方法有多种,但最一般和 • •
最常用的状态机设计通常包括说明部分,主控时 序部分,主控组合部分和辅助进程部分。 1) 说明部分 说明部分中使用TYPE语句定义新的数据类型,此 数据类型为枚举型,其元素通常都用状态机的状 态名来定义。状态变量定义为信号,便于信息传 递,并将状态变量的数据类型定义为含有既定状 态元素的新定义的数据类型。说明部分一般放在 结构体的ARCHITECTURE和BEGIN之间。
• a)能通过VHDL程序,在QUARTUS II 9.1
软件的编译仿真下,并在EDA实验箱上进行 下载显示,验证程序的正确性。 • b)要求显示的字符为“广西师范学院”、 “物理与电子工程院”、“07电本陈岸”、 “指导老师:刘桂英”
(2)总体设计方案
• 1)方案一:用单片机实现,可以用
AT89S52单片机实现128*64液晶屏显示。 程序方面可以用C语言成语,亦可以用汇编 程序。整个设计首先是在protues软件中进 行硬件的搭建及仿真的,然后才下载到目 标芯片上,进行调试。其连接方式如下:
• 这个部分主要实现的功能是实例化
LCD12864显示驱动模块并且把要输入的数 据传给底层,由于所使用的GJ12864C-1带 有字库,这就需要调用字库,字库的调用 其实很简单,首先是要在字库中找到所要 现实的汉字,然后转换成VHDL语言能识别 的ASCII码,再写入程序中即可,更改程序 可以显示任意汉字、英文和标点符号等。 例如,“广”字在字库中的代码为B9E3, 转换成ASCII码就是 “1011100111100011”。
图1 单片机与液晶屏的连接
• 其工作的具体流程图如下:开始结束延时
使LCD复位脉冲函数设置显示方式设置地址 指针取消连续写方式输送数据到显示器设 置成连续写方式设置起始地址写数据输送 命令到显示器设置显示屏列数写完否?可 否连续写NNYY
图7 用单片机设计的具体流程图
• 2)方案二:采用EDA的自顶向下的思想,
• 3)方案比较 • 两种方法都能实现汉字的显示,尽管设计思路不
同,但最终效果是一样的。考虑到单片机的设计 方法更适合用在点阵LED的显示设计方面,EDA的 设计方法明显更适合用于LCD的汉字显示,并且 考虑到学校实验室的资源,实验室里有完善的 EDA实验箱,并且有设计所需要的控制芯片和显 示器件,而如果用单片机的设计方法实现的话, 资源明显不够。两相比较之下,EDA的设计方法 明显有优势,所以选用方法二。
2、系统设计
• (1)设计任务和要求 • (2)总体设计方案 • (3)软件设计
(1)设计任务和要求
• 本设计的主要任务是基于FPGA的LCD控制
器的设计研究,并兼顾程序的易用性以方 便以后模块的移植。该设计到得FPGA的应 用,LCD驱动的研究,字符的显示模式的研 究等知识。并利用QUARTUS II 9.1实现相 关模块的设计,在FPGA上实现对LCD的控 制,显示任意中文。
本科毕业论文(设计)
基于FPGA的LCD) 3、结束语 4、参考文献 5、致谢
1 引言
• 1.1 本设计的研究背景和研究目的 • LCD液晶显示器是 Liquid Crystal Display 的简称,LCD 的构造是在两片平行 •
•
• • • • • • • • • • • • • • • • •
C)底层设计
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY lcd12864_drive IS PORT ( clk : IN std_logic; -全局时钟 rst_n : IN std_logic; --异步复位 row1_val : IN std_logic_vector(127 DOWNTO 0); row2_val : IN std_logic_vector(127 DOWNTO 0); row3_val : IN std_logic_vector(127 DOWNTO 0); row4_val : IN std_logic_vector(127 DOWNTO 0); lcd_data : OUT std_logic_vector(7 DOWNTO 0); lcd_e : OUT std_logic; lcd_rs : OUT std_logic; --数据/指令 lcd_rw : OUT std_logic); --读/写 END lcd12864_drive;
(3)软件设计
a) QUARTUS II概述 • Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、 VerilogHDL以及AHDL(Altera Hardware Description Language)等 多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计 输入到硬件配置的完整PLD设计流程。 • Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完 成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度 快,界面统一,功能集中,易学易用等特点。 • Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块 库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了 设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的 各个阶段使用熟悉的第三方EDA工具。 • 此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合, 可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统 (SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计 于一体,是一种综合性的开发平台。