利用拨码开关控制液晶显示器进行ASIC字符显示.docx
- 文档编号:8917844
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:20
- 大小:139.83KB
利用拨码开关控制液晶显示器进行ASIC字符显示.docx
《利用拨码开关控制液晶显示器进行ASIC字符显示.docx》由会员分享,可在线阅读,更多相关《利用拨码开关控制液晶显示器进行ASIC字符显示.docx(20页珍藏版)》请在冰点文库上搜索。
利用拨码开关控制液晶显示器进行ASIC字符显示
目录
1.课程设计目的…………………………………………………………………2
2.课程设计内容和要求…………………………………………………………2
2.1设计内容……………………………………………………………………2
2.2设计要求……………………………………………………………………2
3.设计方案及实现情况…………………………………………………………2
3.1设计思路……………………………………………………………………2
3.2工作原理及框图……………………………………………………………3
3.3各模块功能描述……………………………………………………………3
3.4仿真结果……………………………………………………………………10
3.5实验箱验证情况……………………………………………………………10
4.课程设计总结…………………………………………………………………12
5.参考文献………………………………………………………………………13
6.附录:
液晶显示器简介………………………………………………………13
1、课程设计目的
(1)学习操作数字电路设计实验开发系统,掌握液晶显示器的工作原理及应用。
(2)掌握组合逻辑电路、时序逻辑电路的设计方法。
(3)学习掌握可编程器件设计的全过程。
2、课程设计内容和要求:
2.1、设计内容
用VHDL语言编写程序,利用拔码开头控制液晶显示器进行ASIC字符显示。
2.2、设计要求
(1)学习掌握拔码开头控制模块、液晶显示模块的工作原理及应用;
(2)熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;
(3)仿真所编写的程序,模拟验证所编写的模块功能;
(4)下载程序到芯片中,硬件验证所设置的功能,能够实现ASIC字符的显示;
(5)整理设计内容,编写设计说明书.
3、 设计方案及实现情况
3.1、设计思路
运用VHDL语言进行各个模块的程序编写,该设计共有四个模块分别为:
拨码模块;消抖模块;译码模块;显示模块.整个、模块共有四个单元电路组成为:
图1
图1原理图
3.2、工作原理及框图
图2系统电路原理图
3.3、各模块功能描述
(1)拨码模块程序代码为:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitybm1is
port(
rst:
instd_logic;
xd:
instd_logic;
clk:
instd_logic;
xdout:
outstd_logic);
endbm1;
architectureaofbm1is
signalcount:
integerrange0to100;
begin
process(clk,rst,xd)
begin
if(rst='0')then
count<=0;
xdout<='0';
elsif(clk'eventandclk='1')then
if(count=5)then
count<=0;
xdout<=notxd;
else
count<=count+1;
endif;
endif;
endprocess;
enda;
(2)消抖模块程序代码为:
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityxdis
port(
aj:
instd_logic;
rst:
instd_logic;
ajout:
outstd_logic_vector(4downto0)
);
endxd;
architectureajworkofxdis
signalq:
std_logic;
signalcount:
std_logic_vector(4downto0);
begin
q<=ajwhenrst='1'else'0';
process(q,rst)
begin
if(rst='0')then
count<="00000";
elsifq'eventandq='1'then
ifcount="11111"then
count<="00000";
else
count<=count+1;
endif;
endif;
ajout<=count;
endprocess;
endajwork;
(3)译码模块程序代码为:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityym1is
port(ym:
instd_logic_vector(4downto0);
Y:
outstd_logic_vector(7downto0));
endym1;
architectureyima_archofym1is
signala:
std_logic_vector(4downto0);
begin
a<=ym;
Y<="01000001"when(a="00000")else
"01000010"when(a="00001")else
"01000011"when(a="00010")else
"01000100"when(a="00011")else
"01000101"when(a="00100")else
"00100001"when(a="00101")else
"00100011"when(a="00110")else
"00100100"when(a="00111")else
"00100101"when(a="01000")else
"00100110"when(a="01001")else
"00100111"when(a="01010")else
"00101000"when(a="01011")else
"00101001"when(a="01100")else
"00101010"when(a="01101")else
"00101011"when(a="01110")else
"00101100"when(a="01111")else
"00101101"when(a="10000")else
"00101110"when(a="10001")else
"00101111"when(a="10010")else
"00110000"when(a="10011")else
"00110001"when(a="10100")else
"00110010"when(a="10101")else
"00110011"when(a="10110")else
"00110100"when(a="10111")else
"00110101"when(a="11000")else
"00110110"when(a="11001")else
"00110111"when(a="11010")else
"00111000"when(a="11011")else
"00111001"when(a="11100")else
"00111010"when(a="11101")else
"00111011"when(a="11110")else
"00111100"when(a="11111")else
"00110000";
endyima_arch;
(4)显示模块程序代码为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYlcdIS
PORT(busy:
INSTD_LOGIC;
clk_fsm:
INSTD_LOGIC;
db_ascii:
INSTD_LOGIC_VECTOR(7DOWNTO0);
req:
OUTSTD_LOGIC;
db:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDlcd;
ARCHITECTURErtlOFlcdIS
SIGNALready:
STD_LOGIC;
TYPEstateIS(CMD_SEND,XX_SEND,YY_SEND,ASCII_SEND);
SIGNALcurrent_state:
state;
--SIGNALdb_send:
std_logic_vector(7downto0);
BEGIN
PROCESS(clk_fsm,busy,ready,db_ascii)
variablecnt1:
std_logic_vector(2downto0);
BEGIN
--db_send<=db_ascii;
IFrising_edge(clk_fsm)THEN
CASEcurrent_stateIS
WHENCMD_SEND=>
IFbusy='0'THEN
IFready='1'THEN
current_state<=XX_SEND;
ready<='0';
ELSE
db<="11111001";--F1
req<='1';
ready<='0';
ENDIF;
ELSE
req<='0';
ready<='1';
current_state<=CMD_SEND;
ENDIF;
WHENXX_SEND=>
IFbusy='0'THEN
IFready='1'THEN
current_state<=YY_SEND;
ready<='0';
ELSE
db<="00001001";--07
req<='1';
ready<='0';
ENDIF;
ELSE
req<='0';
ready<='1';
current_state<=XX_SEND;
ENDIF;
WHENYY_SEND=>
IFbusy='0'THEN
IFready='1'THEN
current_state<=ASCII_SEND;
ready<='0';
ELSE
db<="00000010";--02
req<='1';
ready<='0';
ENDIF;
ELSE
req<='0';
ready<='1';
current_state<=YY_SEND;
ENDIF;
WHENASCII_SEND=>
IFbusy='0'THEN
IFready='1'THEN
current_state<=CMD_SEND;
ready<='0';
ELSE
db<=db_ascii;
req<='1';
ready<='0';
ENDIF;
ELSE
req<='0';
ready<='1';
current_state<=ASCII_SEND;
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;
ENDrtl;
3.4、仿真结果
(1)液晶显示器仿真结果:
当BUSY信号有效时(BUSY=‘1’),停止输出地址信号;当液晶模块处于空闲状态(BUSY=‘0’)时,输出地址信号。
BUSY=0,REQ=1,输出显示结果。
(图3)
图3电路程序仿真图
3.5、实验箱验证情况
(1)程序仿真编译成功后,再将FPGA芯片与液晶显示器进行连线.(图4)
图4实验箱接线图
(2)将程序仿真编译后下载到FPGA芯片,接通电源,液晶显示器显示,拔动拔码开头就可以在液晶屏上显示ASIC符号.(图5、图6、图7、图8、图9、图10、)
图5液晶显示的ASIC符号图6液晶显示的ASIC符号
图7液晶显示的ASIC符号图8液晶显示的ASIC符号
图9液晶显示的ASIC符号图10液晶显示的ASIC符号
4、课程设计总结
在此次课程设计中,通过对平时的课程讲解,资料的查阅以及在同学有帮助下基本完成了本次的课程设计。
这次的课程设计让我认识到了在知识储备上还是明显的不足。
在设计的过程中,我认真地完成了每一个步骤,并积极与同学展开讨论和请教了学长进而完成了课程设计。
通过本次课程设计,我了解了液晶显示屏的逻辑和时序控制要求,掌握液晶显示器的工作原理及应用及键盘控制模块的控制逻辑,并知道如何用它们设计一个基于FPGA的液晶显示驱动电路。
还学习了操作数字电路设计实验开发系统的方法,巩固了组合逻辑电路、时序逻辑电路的设计方法,可编程器件设计的全过程。
把理论和实践相结合,通过理论指导实践,在实践中理解理论,这是我们每个大学生都应该做到的一点。
5、参考文献
(1).侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计.西安:
西安电子科技大学出版社,1999
(2).求是科技.CPLD/FPGA应用开发技术与工程实践.北京:
人民邮电出版社,2005
(3).罗苑棠.CPLD/FPGA常用模块与综合系统设计实例精讲.北京:
电子工业出版社,2007
(4).基于FPGA的数字系统设计.西安:
西安电子科技大学出版社,2008
6、附:
液晶显示器简介
OCMJ中文模块系列液晶显示器内含GB231216*16点阵国标一级简体汉字和ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或ASCII码即可实现文本显示。
OCMJ中文模块系列液晶显示器也可用作一般的点阵图形显示器之用。
提供有位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。
完全兼容一般的点阵模块。
OCMJ中文模块系列液晶显示器可以实现汉字、ASCII码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。
表—1:
OCMJ2X8(128X32)引脚说明
引脚
名称
方向
说明
引脚
名称
方向
说明
1
VLED+
I
背光源正极(LED+5V)
8
DB1
I
数据1
2
VLED-
I
背光源负极(LED-OV)
9
DB2
I
数据2
3
VSS
I
地
10
DB3
I
数据3
4
VDD
I
(+5V)
11
DB4
I
数据4
5
REQ
I
请求信号,高电平有效
12
DB5
I
数据5
6
BUSY
O
应答信号=1:
已收到数据并正在处理中
=0:
模块空闲,可接收数据
13
DB6
I
数据6
7
DB0
I
数据0
14
DB7
I
数据7
硬件接口
接口协议为请求/应答(REQ/BUSY)握手方式。
应答BUSY高电平(BUSY=1)表示OCMJ忙于内部处理,不能接收用户命令;BUSY低电平(BUSY=0)表示OCMJ空闲,等待接收用户命令。
发送命令到OCMJ可在BUSY=0后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ信号(REQ=1)通知OCMJ请求处理当前数据线上的命令或数据。
OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY=0?
),如果BUSY=0,表明模块对用户的写操作已经执行完毕。
可以再送下一个数据。
如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内部操作,因此,最后一个字节的应答BUSY高电平(BUSY=1)持续时间较长,具体的时序图参见图--1,对应的具体时间参数说明参见表--1
图—1:
对模块写汉字时序图
四、电性能参数
1)表—1模块时间参数表
编号
名称
单位
值
说明
最小值
最大值
1
Tr
uS
0.4
-
数据线上数据稳定时间
2
Tb
uS
2
20
最大模块响应时间
3
Trt
uS
11
-
最小REQ保持时间
4
Ts1
uS
20
45
最大数据接收时间
5
Ts2
mS
-
0.1~30*
最大命令指令处理时间
*:
不同命令所占用的时间各不相同,具体时间在命令表中给出
2)表—2模块主要电气参数表
编号
名称
单位
值
说明
2X8
4X8
5X10
1
电源工作电压
V
5
5
5
2
电源电流
mA
2
3
5
3
输入引脚电压
V
5
5
5
4
最大输入电压建立时间
uS
1
1
1
5
最小复位电压持续时间
uS
6
6
6
RES端高电平时间
6
复位内部处理时间
mS
15
15
15
此时模块不接收命令
7
背光电压
V
5
5
5
8
标称背光电流
mA
120
180
250
9
外接灰度调节电位器
Ω
5K
200
10K
用户命令
用户通过用户命令调用OCMJ系列液晶显示器的各种功能。
命令分为操作码及操作数两部分,操作数为十六进制。
共分为3类10条。
分别是:
一)、字符显示命令:
1、显示国标汉字;
2、显示8X8ASCII字符;
3、显示8X16ASCII字符;
二)、图形显示命令:
4、显示位点阵;
5、显示字节点阵;
三)、屏幕控制命令:
6、清屏;
7、上移;
8、下移;
9、左移;
10、右移;
(以下所示取值范围分别为:
2X8、4X8、5X10的取值范围)
显示窗口坐标关系
以上列表为汉字、ASCⅡ码显示屏幕坐标(ASCⅡ码Y坐标一点阵坐标为准)
如显示图形点阵,则以128*64(OCMJ4X8)或128*32(OCMJ2X8)
点阵坐标为准,可在屏幕任意位置显示。
外型尺寸图(图11)
图11OCMJ2X8模块尺寸图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 开关 控制 液晶显示器 进行 ASIC 字符 显示