fpga液晶显示主控板卡问题:

  作为控制处理器以其高速、高精度性能广泛应用于数据采集系统。因此采用DSP控制器实现液晶显示越来越普遍。但是在实际应用中常会出现匹配、抗干扰、布线和响应速度、时序匹配等诸多问题,本文针对出现的这些问题提出具体解决方案,并给出编程实例。
  2 硬件结构  TMS320LF2407A是TI公司推出的一款高性能定点DSP控制器。液晶显示模块采用的驱动控制器为KS0108B及其兼容显示控制驱动器。图1为液晶显示模块与DSP的硬件,系统主要由DSP控制器、隔离缓冲电路和液晶显示模块3部分组成。隔离缓冲电路由两片74LS245组成。调节滑动R1可以调节液晶显示。
  3 相关问题及解决方案
  3.1 电压匹配   DSP的数据、地址、控制总线通过接口信号线连接至液晶显示模块。DSP的I/O端口工作电压为3.3 V,由于DSP有时将数据写入控制器,有时又从控制器读数据,因此数据总线是双向的。如果直接把两者连接,数据的流向可能会对3.3 V系统造成损害,所以本设计中DSP和液晶模块通过两片74LS245进行连接,74LS245具有隔离作用。74LS245(1)连接DSP对液晶输出模块的控制信号.
  信号为单向,引脚DIR始终置为"1",使得控制信号由741S245的A口流向B口。而74LS245(2)连接DSP与液晶模块的数据线,数据为双向,因此引脚DIR则由DSP的IS的反来控制数据的流向。由于DSP输出的信号电压均为3.3 V,而液晶模块的驱动电压为5 V,所以需要在74LS245和液晶模块之间加入,这样才能与控制器准备接收的数据相匹配。
  3.2 抗干扰   LCD显示屏常置于仪表的面板上,通过一条扁平电缆连接至主控板。测控仪表内部的电磁干扰对LCD的工作有一定的影响[3,4],如果该仪表工作于工业生产过程,恶劣的环境对于液晶屏的工作更为不利,这就需要在设计中采用各种抗干扰措施。本系统采取的主要抗干扰措施如下:  (1)设计LCD模块的接口时,在VSS和VDD之间接一只0.1&F的去耦,接10&F或20&F,提高输入的稳定性。  (2)LCD模块的工作很小,为几毫安,但其背光部分所需要的电流远大于其工作电流,因此在设计中需将工作电源和背光电源分别布线。   (3)为避免其他不明干扰源对液晶显示的影响,采用软件掩饰显示不正常的问题,即定期对液晶屏复位(通过RES的反引脚),保证液晶显示屏长期工作的稳定性。如果不允许液晶屏定期复位,可以检测LCD内部工作寄存器和显示RAM,一旦发现LCD不正常,可以对LCD复位。
  3.3 PCB布线   所有电路设计的最后一步就是印制电路板(PCB)的布线,如果这部分设计不当,PCB会发射出过量的电磁干扰(),使整个电路工作不正常。在电能质量监控装置中,DSP输出的信号高达几兆赫兹甚至几十兆赫兹,因此任何一条PCB布线都可能成为天线。布线的长和宽都会影响线路电阻和量,进而影响系统的响应速度。同时高频信号传输线路过长会引起信号,导致显示不正常。因此在布线时,液晶模式和DSP之间所有传输信号的布线都应尽可能的短且宽,这样可以减少其分布参数和相互间的电磁干扰,保证高频信号高质量传输,从而保证电路正常工作。
  3.4响应速度  在传统液晶显示控制电路的软件编程中,由于液晶显示模块的上电复位过程迟于控制器的复位时间,所以在程序上电执行液晶模块初始化程序之前需要先运行一段延时程序,而且一般每次对液晶模块控制器的控制端口、数据端口进行读、写操作时,必须调用延时子程序,否则将无法正常显示。笔者在进行初步开发时,遵循了上述开发经验,增加了一定的延时程序,这时便出现了响应速度的问题。
  虽然DSP的运行速度相当快,但是每段延时程序累积起来,再加上循环程序的运行需要,整个系统响应速度将会很慢,甚至会被误认为显示不成功,这样对于电能质量实时监控系统而言是不允许的,因此在设计过程中不断地缩短延时时间,最后不需要添加任何延时程序也能进行正常的显示,所以在对液晶模块编程时要根据实际情况设计延时程序,以保证系统的响应速度。
  3.5时序匹配  在显示系统中,由于DSP控制器的运算速度非常快,机器很短(25 ns,工作频率40 M)。在这种情况下,液晶的控制器难与其同步(0CM12864模块读写数据的时序如图2所示,时序参数如表1所示)。本系统采用的解决方案是在DSP数据接口与LCD数据接口之间使用三态总线收发器74LS245进行数据缓冲。同时在软件设计方面根据两者时序关系,在程序中加入DSP等待状态周期(根据工作频率的不同改变程序中的参数来满足时序要求),延长DSP输出信号的持续时间。
  4 字符显示软件设计  字符显示函数DISP的形参ARRAY、PAGE、COL及TYPE分别代表定义的字模数组、页面物理地址、列物理地址及显示类型(汉字TYPE=16,数字字母TYPE=8)。程序中PAGE的范围为0~7。使用物理地址,该值与第0页指令代码0xOB8相"或"后。
  就可得到期望页面的指令代码,从而提高了编程效率。同样的,COL范围0~127也使用了物理地址,在每写一列数据前,软件都会判断当列所在的物理位置,以调用左屏或右屏的驱动子程序,与第0列指令代码0x40相"或"后即可得到设置列地址的指令代码。至于写反显字符只需将DATA取反(即~DATA)写入相应I/O口即可。字符显示流程如图3所示,下面给出具体程序:
  5 结束语
  本文提出基于DSP的液晶显示设计过程中出现的问题及其解决方案,并给出具体的电路设计和编程实例,论证了所提出的解决方案的有效性。
&&&&&往下看有更多相关资料
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)1220人阅读
FPGA(10)
FPGA笔记(八)-驱动12864
最近俩天由于要求所致,必须马上要会使用FPGA驱动12864和驱动矩阵键盘,虽然之前用C51做过这类驱动,毕竟不一样,所以时间上也是很匆忙。通过各种网上找资料和实验,今天算是完成了LCD12864的驱动的学习。赶紧做个笔记巩固一下!
要驱动12864首先得它的datasheet,看明白主要的几个问题:
1、LCD的时钟频率所在范围。(FPGA一般都是20M、50M及以上晶振,太大导致LCD无法响应过来)下图为RT12864-s液晶的所需时钟频率
范围为470KHZ-590KHZ。(如果小了的话也没关系,只不过是显示的时候一个字一个字的显示出来,而不是人眼察觉不到地整篇出现)
2、整个的工作流程。(初始化-&写数,从而可以用状态机来描述)
我记得在单片机里驱动液晶的话,是这样的
把写命令和写数据的指令的时序和RW、RS、EN设置好,方便后续调用
void write_data(int data)
void write_com(int com)
//设置好初始化的指令
void initialLCD_12864()
write_com(0x80);
。。。。。等等一些列的初始化指令
FPGA驱动液晶显示,也差不多,一样是得先初始化后再进行写数字,只不过是用状态机来实现这一顺序的过程,啥也不用多说,看程序吧。
module Lcd12864(//针对型号为RT12864-S
input Sys_Clk,
input Rst,
output reg LCD_RS,
output LCD_RW,
output LCD_E,
output reg [7:0]LCD_Data
output PSB//串并控制端口,H为并行,L为串行,直接接5v
output LCD_Rst,//液晶的复位端口,低电平有效
//由于端口不够,暂时让其悬空
reg[7:0]//状态机寄存器
reg [23:0]//计数器
//显示完成标志
reg[5:0]char_
reg[7:0]data_//一个字节是八位,一个英文字符是一个字节,中文是俩个字节
parameter T500KHZ=24'd49999;
// parameter T500KHZ=24'd24_999_999;//测试低频现象
// parameter T500KHZ=24'd24_9;//仿真专用
//首先先对系统频率分频,液晶所需频率不用这么高,但是是多少呢?由datasheet可得出该液晶的最大频率是590kHZ
//典型值为530KH,为了好算取个值500KHZ,50M/500KHZ=10HZ,计数5M/2变化一次方向
always@(posedge Sys_Clk or negedge Rst)
cnt&=24'd0;
LCD_Clk&=1'b0;
if(cnt==T500KHZ)
cnt&=24'd0;
LCD_Clk&=~LCD_C
cnt&=cnt+1'b1;
//state machine description,8个状态 只要用把位二进制就可以全部表示
parameter IDLE=8'b00_000_000;//初始状态
parameter SETFUNCTION=8'b00_000_001;//功能设置,8-bit+基本指令集0x30
// parameter SETFUNCTION2=8'b00_000_010;//同上
parameter SWITCHMODE=8'b00_000_100;//设置显示开和光标闪烁关闭
parameter CLEAR=8'b00_001_000;//清屏操作
parameter SETMODE=8'b00_010_000;//点设置
parameter SETDDRAM=8'b00_100_000;//起始行设置
parameter WRITERAM=8'b01_000_000;//写设置
parameter STOP=8'b10_000_000;//LCD操作停止,释放其控制
cnt=24'd0;
state=IDLE;
flag=1'b1;
LCD_Clk=1'b10;
char_cnt=6'd0;
data_disp=8'd32;
//设置好RS、RW、E
always@(posedge LCD_Clk or negedge Rst)
LCD_RS&=1'b0;
else if(state==WRITERAM)
LCD_RS&=1'b1;
LCD_RS&=1'b0;
//如果定义了LCD_Rst俩个端口的话,可做如下设置
//assign LCD_Rst=1'b1;
//assign PSB=1'b1;
assign LCD_RW=1'b0;//只是写操作,不需要读操作
assign LCD_E=(flag==1)?LCD_Clk:1'b0;//使能信号与液晶时钟同步
//descible the state machine
always@(posedge LCD_Clk or negedge Rst)
state&=IDLE;
LCD_Data&=8'bzz_zzz_
case(state)
state&=SETFUNCTION;
LCD_Data&=8'h30;
SETFUNCTION:
state&=SWITCHMODE;
// state&=SETFUNCTION2;
LCD_Data&=8'h30;
SETFUNCTION2:
state&=SWITCHMODE;
LCD_Data&=8'h30;
SWITCHMODE:
state&=CLEAR;
LCD_Data&=8'h0c;//显示设置,全显示开,光标和闪烁关
state&=SETMODE;
LCD_Data&=8'h01;//清屏、
state&=SETDDRAM;
LCD_Data&=8'h06;//点设置,光标右移,地址加一,整体不动
SETDDRAM://设置起始位置
state&=WRITERAM;
if(char_cnt==6'd0)
LCD_Data&=8'h80;//line1
LCD_Data&=9'h90;//line2
if(char_cnt&=6'd11)
char_cnt&=char_cnt+1'b1;
LCD_Data&=data_
if(char_cnt==6'd11)
state&=SETDDRAM;//第一行写完后从新返回设置地址
state&=WRITERAM;
else if(char_cnt&=6'd12&&char_cnt&=6'd25)
if(char_cnt==6'd25)
state&=STOP;
char_cnt=6'd0;
flag&=1'b0;
LCD_Data&=data_//不管到没到第25个都要继续写数
state&=WRITERAM;
char_cnt&=char_cnt+1'b1;
state&=STOP;
default: state&=IDLE;
always@(char_cnt)
case(char_cnt)
6'd0:data_disp=&G&;
6'd1:data_disp=&U&;
6'd2:data_disp=&X&;
6'd3:data_disp=&I&;
6'd4:data_disp=&A&;
6'd5:data_disp=&N&;
6'd6:data_disp=&Y&;
6'd7:data_disp=&I&;
6'd8:data_disp=&L&;
6'd9:data_disp=&C&;
6'd10:data_disp=&D&;
6'd11:data_disp=&!&;
6'd12:data_disp=&H&;
6'd13:data_disp=&E&;
6'd14:data_disp=&L&;
6'd15:data_disp=&L&;
6'd16:data_disp=&O&;
6'd17:data_disp=&E&;
6'd18:data_disp=&V&;
6'd19:data_disp=&E&;
6'd20:data_disp=&R&;
6'd21:data_disp=&Y&;
6'd22:data_disp=&O&;
6'd23:data_disp=&N&;
6'd24:data_disp=&E&;
default:data_disp=8'h32;
我所使用的12864型号为RT12864-S,各个引脚功能如下
所以可以清楚的看到RS、RW、EN等引脚的使用方法
我从这个时序图看到了只有当RS=H,RW=L,在一个使能周期内完成数据的读取,也就是说使能信号是一个周期信号
对于程序中的assign LCD_E=(flag==1)?LCD_Clk:1'b0;//使能信号与液晶时钟同步。
程序中来看状态机大概就是这样一个流程(开始-&设置8bit控制+基本指令集(0x30)-&设置全显示开、光标关、闪烁关(0x0c)-&清屏(0x01)-&设置输入方式,数据读写后,光标右移,地址加一,整体画面不动(0x06)-&设置写数的起始地址(0x80、0x90、0x88,0x98)-&写数(对应ASCI来写字符)-&结束),我就懒得去画图了,凑合看吧,饿死我了!
最后再想,既然初始化都是顺序执行,为什么还要状态机,在一个begin-end内不就完成了初始化吗?(如果你这么想,那么请看上述时序图,不管是写数还是写命令都是在一个使能周期内完成的,而这个周期是有时间限制的,而不是俩句程序语句之间的时间周期)
看一下仿真图就更加清晰明了了。任何操作都是一步一步来的,一个使能周期内只能写一次数据或命令
对应这看这些二进制数(三个使能周期的x30)(分别是initial+SETFUNCTION+SETFUNCTION2),而后是x0c)依次一下。。。。),时序上面完全符合。
其实我很想知道为什么要俩个SETFUNCTION状态,只不过是多了一个周期的0x30指令而已,于是我把SETFUNCTION2这个状态去掉了,看看情况,结果液晶一样能正常显示出数!如网上所写的程序,说第二个SETFUNCTION2给的数(0x30)是清屏操作,很明显看datasheet里的基本指令集所写更本不是什么清屏指令,只是指明8-bit控制和指令集是基本指令集
一样是可以的,所以学习不是拿来主义,多问一句为什么,可以让我学到更多的东西,更希望把它变为自己的东西。而不是下次还得抄袭。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23574次
排名:千里之外
原创:16篇
(1)(3)(2)(3)(2)(5)(1)(3) 上传我的文档
 下载
 收藏
毕业于医学院校,在医院工作,有相对丰富的护理经验
 下载此文档
正在努力加载中...
基于FPGA的液晶显示控制系统设计
下载积分:1500
内容提示:基于FPGA的液晶显示控制系统设计
文档格式:DOC|
浏览次数:4|
上传日期: 11:05:40|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1500 积分
下载此文档
该用户还上传了这些文档
基于FPGA的液晶显示控制系统设计
官方公共微信lcd1602 FPGA控制 液晶显示字符,经本人调试绝对没问题! VHDL- -Verilog 238万源代码下载-
&文件名称: lcd1602
& & & & &&]
&&所属分类:
&&开发工具: VHDL
&&文件大小: 13226 KB
&&上传时间:
&&下载次数: 6
&&提 供 者:
&详细说明:FPGA控制lcd1602液晶显示字符,经本人调试绝对没问题!-Character the FPGA control lcd1602 LCD, after I debug absolutely no problem!
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&lcd1602\lcd_1602\modelsim\lcd_1602.cr.mti&&.......\........\........\lcd_1602.do&&.......\........\........\lcd_1602.do.bak&&.......\........\........\lcd_1602.mpf&&.......\........\........\vsim.wlf&&.......\........\........\work\lcd_1602\verilog.asm&&.......\........\........\....\........\verilog.prw&&.......\........\........\....\........\verilog.psm&&.......\........\........\....\........\verilog.rw&&.......\........\........\....\........\_primary.dat&&.......\........\........\....\........\_primary.dbs&&.......\........\........\....\........\_primary.vhd&&.......\........\........\....\........_tb\verilog.asm&&.......\........\........\....\...........\verilog.prw&&.......\........\........\....\...........\verilog.psm&&.......\........\........\....\...........\verilog.rw&&.......\........\........\....\...........\_primary.dat&&.......\........\........\....\...........\_primary.dbs&&.......\........\........\....\...........\_primary.vhd&&.......\........\........\....\_info&&.......\........\........\....\_vmake&&.......\........\quartus\db\lcd_1602.asm.qmsg&&.......\........\.......\..\lcd_1602.asm_labs.ddb&&.......\........\.......\..\lcd_1602.cbx.xml&&.......\........\.......\..\lcd_1602.cmp.bpm&&.......\........\.......\..\lcd_1602.cmp.cdb&&.......\........\.......\..\lcd_1602.cmp.ecobp&&.......\........\.......\..\lcd_1602.cmp.hdb&&.......\........\.......\..\lcd_1602.cmp.kpt&&.......\........\.......\..\lcd_1602.cmp.logdb&&.......\........\.......\..\lcd_1602.cmp.rdb&&.......\........\.......\..\lcd_1602.cmp.tdb&&.......\........\.......\..\lcd_1602.cmp0.ddb&&.......\........\.......\..\lcd_1602.cmp2.ddb&&.......\........\.......\..\lcd_1602.cmp_merge.kpt&&.......\........\.......\..\lcd_1602.db_info&&.......\........\.......\..\lcd_1602.eco.cdb&&.......\........\.......\..\lcd_1602.fit.qmsg&&.......\........\.......\..\lcd_1602.hier_info&&.......\........\.......\..\lcd_1602.hif&&.......\........\.......\..\lcd_1602.lpc.html&&.......\........\.......\..\lcd_1602.lpc.rdb&&.......\........\.......\..\lcd_1602.lpc.txt&&.......\........\.......\..\lcd_1602.map.bpm&&.......\........\.......\..\lcd_1602.map.cdb&&.......\........\.......\..\lcd_1602.map.ecobp&&.......\........\.......\..\lcd_1602.map.hdb&&.......\........\.......\..\lcd_1602.map.kpt&&.......\........\.......\..\lcd_1602.map.logdb&&.......\........\.......\..\lcd_1602.map.qmsg&&.......\........\.......\..\lcd_1602.map_bb.cdb&&.......\........\.......\..\lcd_1602.map_bb.hdb&&.......\........\.......\..\lcd_1602.map_bb.logdb&&.......\........\.......\..\lcd_1602.pre_map.cdb&&.......\........\.......\..\lcd_1602.pre_map.hdb&&.......\........\.......\..\lcd_1602.rtlv.hdb&&.......\........\.......\..\lcd_1602.rtlv_sg.cdb&&.......\........\.......\..\lcd_1602.rtlv_sg_swap.cdb&&.......\........\.......\..\lcd_1602.sgdiff.cdb&&.......\........\.......\..\lcd_1602.sgdiff.hdb&&.......\........\.......\..\lcd_1602.sld_design_entry.sci&&.......\........\.......\..\lcd_1602.sld_design_entry_dsc.sci&&.......\........\.......\..\lcd_1602.smp_dump.txt&&.......\........\.......\..\lcd_1602.syn_hier_info&&.......\........\.......\..\lcd_1602.tan.qmsg&&.......\........\.......\..\lcd_1602.tis_db_list.ddb&&.......\........\.......\..\lcd_1602.tmw_info&&.......\........\.......\..\lcd_1602_global_asgn_op.abo&&.......\........\.......\..\prev_cmp_lcd_1602.asm.qmsg&&.......\........\.......\..\prev_cmp_lcd_1602.fit.qmsg&&.......\........\.......\..\prev_cmp_lcd_1602.map.qmsg&&.......\........\.......\..\prev_cmp_lcd_1602.qmsg&&.......\........\.......\..\prev_cmp_lcd_1602.tan.qmsg&&.......\........\.......\incremental_db\compiled_partitions\lcd_1602.root_partition.cmp.atm&&.......\........\.......\..............\...................\lcd_1602.root_partition.cmp.dfp&&.......\........\.......\..............\...................\lcd_1602.root_partition.cmp.hdbx&&.......\........\.......\..............\...................\lcd_1602.root_partition.cmp.kpt&&.......\........\.......\..............\...................\lcd_1602.root_partition.cmp.logdb&&.......\........\.......\..............\...................\lcd_1602.root_partition.cmp.rcf&&.......\........\.......\..............\...................\lcd_1602.root_partition.map.atm&&.......\........\.......\..............\...................\lcd_1602.root_partition.map.dpi&&.......\........\.......\..............\...................\lcd_1602.root_partition.map.hdbx&&.......\........\.......\..............\...................\lcd_1602.root_partition.map.kpt&&.......\........\.......\..............\README&&.......\........\.......\lcd_1602.asm.rpt&&.......\........\.......\lcd_1602.done&&.......\........\.......\lcd_1602.dpf&&.......\........\.......\lcd_1602.fit.rpt&&.......\........\.......\lcd_1602.fit.summary&&.......\........\.......\lcd_1602.flow.rpt&&.......\........\.......\lcd_1602.map.rpt&&.......\........\.......\lcd_1602.map.summary&&.......\........\.......\lcd_1602.pin&&.......\........\.......\lcd_1602.pof&&.......\........\.......\lcd_1602.qpf&&.......\........\.......\lcd_1602.qsf&&.......\........\.......\lcd_1602.qws&&.......\........\.......\lcd_1602.sof&&.......\........\.......\lcd_1602.tan.rpt&&.......\........\.......\lcd_1602.tan.summary
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - wiener fitter emulation
&[] - 提供几种著名的大型线性方程组迭代算法,包括CG、PCG、Lanczos、MINRES
&[] - FPGA实现 LCD1602 显示 PS/2 键盘的键值,熟悉并掌握液晶 1602 显示屏的使用方法及PS/2键盘的接口标准,学习利用Verilog-HDL语言编写有限状态机实现较为复杂的设计与应用。
&[] - 一篇硕士毕业论文设计,基于凌阳单片机 的非特定人语音识别论文
&[] - FPGA控制LCD1602(verilog)

我要回帖

更多关于 液晶显示 的文章

 

随机推荐