液晶显示屏LCD显示接口设计 匡远熹 09080SOPCWord下载.docx
《液晶显示屏LCD显示接口设计 匡远熹 09080SOPCWord下载.docx》由会员分享,可在线阅读,更多相关《液晶显示屏LCD显示接口设计 匡远熹 09080SOPCWord下载.docx(19页珍藏版)》请在冰豆网上搜索。
0V
工作温度(Ta):
0~+50℃(常温)/-20~70℃(宽温)
三、接口时序
模块有并行和串行两种连接方法(时序如下):
a)8位并行连接时序图
图3MPU写资料到模块
图4MPU从模块读出资料
a)串行连接时序图
图5串行时序图
表2时钟周期表
串行数据传送共分三个字节完成:
第一字节:
串口控制——格式11111ABC
A为数据传送方向控制:
H表示数据从LCD到MCU,L表示数据从MCU到LCD。
B为数据类型选择:
H表示数据室显示数据,L表示数据室控制指令
C固定为0
第二字节:
(并行)8位数据的高4位——格式DDDD0000
第三字节:
(并行)8位数据的低4位——格式DDDD0000
串行接口时序参数:
(测试条件:
T=25℃VDD=4.5V)
四、FPGA与LCD连接方式
FPGA与LCD连接方式:
(仅PK2型含此)。
由实验电路结构图COM可知,默认情况下,
FPGA是通过89C51单片机控制LCD液晶显示的,但若FPGA中有Nios嵌入式系统,则能使
FPGA直接控制LCD显示。
方法是拔去此单片机(在右下侧),用连线将座JP22/JP21(LCD
显示器引脚信号)各信号分别与座JP19/JP20(FPGA引脚信号)相连接即可。
图6实验电路结构图COM
五、初始化部分的状态机设计
根据字符模块初始化的流程图:
图7LCD初始化流程图
六、时钟模块的设计
由于FPGA开发板上自带的晶振频率为50MHZ,而所需要的时钟频率则需要小于13.9K。
因此需要一个分频器对其进行分频。
这里采用简单的计数器对其进行分频,通过分频器将外部输入的32MHZ的信号分成频率为153600HZ的信号。
在分频之后由于时钟信号需要同时控制LCD模块以及FPGA的模块,因此需要编写一个程序,使得两者之间同步。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbaudIS
port(clk,resetb:
instd_logic;
bclk:
outstd_logic);
endbaud;
architectureBehavioralofbaudis
begin
process(clk,resetb)
variablecnt:
integer;
ifresetb='
1'
then
cnt:
=0;
bclk<
='
0'
;
elsifrising_edge(clk)then
ifcnt>
=208thencnt:
elsecnt:
=cnt+1;
endif;
endprocess;
endbehavioral;
图8时钟模块
图9系统的仿真图形
七、中文字符部分的数据模块
中文部分由于VHDL中无法识别中文,使用时需要参照中文字符表,将需要的字符所对应的数据输入RAM,然后通过和英文模块不重复的符号来实现对其的调用。
constantdata_buf:
data_buffer:
=(x"
bd"
x"
ad"
);
本程序驱动液晶显示“赣南师范学院课程设计”“班级”“姓名”
“日期”
LibraryIEEE;
UseIEEE.STD_LOGIC_1164.ALL;
UseIEEE.STD_LOGIC_ARITH.ALL;
UseIEEE.STD_LOGIC_UNSIGNED.ALL;
entityLCDis
generic(divide_to_100k:
integer:
=1000);
Port(clk,rst:
inSTD_LOGIC;
Rw,rs,e,lcd_rst:
outSTD_LOGIC;
Lcd_data:
outSTD_LOGIC_VECTOR(7downto0));
endLCD;
architectureBehavioralofLCDis
signalclk_100k:
std_logic;
typestateis(s0,s1,s2,s3,s4);
signalcurrent_s:
state;
typedata_bufferisarray(0to43)ofstd_logic_vector(7downto0);
ce"
f7"
x"
c0"
ed"
b9"
a4"
b4"
f3"
d1"
a7"
d3"
a6"
c3"
bf"
c6"
d4"
ba"
b3"
cc"
c9"
e8"
bc"
b0"
e0"
b6"
d0"
d5"
fb"
c8"
da"
process(clk)
integerrange0todivide_to_100k;
ifrising_edge(clk)thencnt:
ifcnt=divide_to_100kthencnt:
ifcnt<
divide_to_100k/2thenclk_100k<
='
elseclk_100k<
process(clk_100k)
variablecnt1:
integerrange0to500;
variablecnt1_1:
integerrange0to100;
variablecode_cnt:
integerrange0to13;
variabledata_cnt:
integerrange0to48;
ifrising_edge(clk_100k)then
ifrst='
thencurrent_s<
=s0;
cnt1:
=0;
cnt1_1:
=0;
code_cnt:
data_cnt:
lcd_rst<
elsecasecurrent_sis
whens0=>
rw<
rs<
e<
cnt1:
=cnt1+1;
ifcnt1<
250thenlcd_rst<
elsifcnt1<
500thenlcd_rst<
elsifcnt1=500then
lcd_rst<
cnt1:
current_s<
=s1;
whens1=>
cnt1_1:
=cnt1_1+1;
ifcnt1_1<
1*3thene<
rw<
elsifcnt1_1<
2*3thenlcd_data<
=x"
0c"
10*3thene<
elsifcnt1_1=10*3thencnt1_1:
current_s<
=s2;
whens2=>
ifcnt1_1<
1*3thene<
rs<
rw<
80"
=s3;
whens3=>
=data_buf(data_cnt);
elsifcnt1_1=2*3thendata_cnt:
=data_cnt+1;
100thene<
ifcnt1_1=100thencnt1_1:
ifdata_cnt=16thencurrent_s<
=s4;
data_cnt:
whenothers=>
=s0;
endcase;
endBehavioral;
图10显示文字的模块
图11系统的仿真图形
八、图形的数据模块
ENTITYlcdlinehoziIS
PORT(CLK,key3:
INSTD_LOGIC;
CK0,DISP,Hsync,Vsync:
OUTSTD_LOGIC;
rgb:
OUTSTD_LOGIC_VECTOR(0TO23)
);
END;
ARCHITECTUREWXOFlcdlinehoziIS
SIGNALCLK_TEMP1,CLK_TEMP2,CK:
STD_LOGIC;
SIGNALCNT1,CNT2:
STD_LOGIC_VECTOR(2DOWNTO0);
signalcnt:
std_logic_vector(1downto0);
SIGNALHS_CNT,VS_CNT:
INTEGERRANGE0TO525;
signalrgbx,rgby:
STD_LOGIC_VECTOR(0TO23);
CONSTANTTHp:
INTEGER:
=41;
CONSTANTTHb:
=2;
CONSTANTTHf:
CONSTANTTVp:
=10;
CONSTANTTVb:
CONSTANTTVF:
CONSTANTTHd:
=480;
CONSTANTTVd: