利用按键开关控制液晶显示器进行十六进制数字显示 说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学
课程设计说明书
学生姓名:张帅学号:1206024118
学院: 仪器与电子学院
专业: 微电子
题目: 利用按键开关控制液晶显示器进行十六进制数字显示指导教
师:焦新泉赵冬青
2010年 6月 30日
目录
第一章、课程设计目的………………………………………………………………第二章、课程设计内容及要求………………………………………………………
2.1、设计内容…………………………………………………………………………
2.2、设计要求…………………………………………………………………………第三章、设计方案及实现情况………………………………………………………
3.1、设计思路…………………………………………………………………………
3.2、工作原理及框图…………………………………………………………………
3.3、各模块功能描述及仿真结果……………………………………………………
3.4、试验箱验证情况…………………………………………………………………第四章、课程设计总结………………………………………………………………第五章、参考文献……………………………………………………………………附录1:系统整体电路图…………………………………………………………… FPGA引脚分配图……………………………………………………………
液晶显示屏说明书…………………………………………………………
第一章课程设计目的
1.学习操作数字电路设计实验开发系统,掌握液晶显示模块的工作原理及应用。
2.掌握组合逻辑电路、时序逻辑电路的设计方法。
3.学习掌握可编程器件设计的全过程。
第二章课程设计内容和要求
2.1、设计内容
用VHDL语言编写程序,实现利用按键开关控制液晶屏显示16进制数。
2.2、设计要求
1.学习掌握按键开关控制模块、液晶显示模块的工作原理及应用;
2. 熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;
3. 仿真所编写的程序,模拟验证所编写的模块功能;
4. 下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;
5. 整理设计内容,编写设计说明书。
第三章设计方案及实现情况
3.1、设计思路
根据题目设计要求,利用单一按键控制液晶屏循环显示16进制数,0—F。
设计将系统分为五个模块,延时模块,消抖模块,按键输入模块,译码模块和液晶屏控制模块,先分别用quartus编写每个模块并生成顶层文件,最后下载到试验箱就可以实现最后的结果了。
3.2、工作原理及框图
EP3C10E144C8内部时钟经过延时程序后,信号由消抖模块的XD管脚输入,消抖完成后,又在译码模块中将四位二进制代码翻译成八位2进制的ASCII码,最后输入到液晶屏控制模块中,实现对液晶屏的控制。
与此同时,每按下一次按键,按键模块中的变量就会+1,当加到1111B即F时,自动清零,实现了0--F循环显示。
流程图如下:
系统流程框图
3.3、各模块功能描述及仿真结果
(1)延时电路 由于FPGA 芯片内部时钟频率很高,而OCMJ 系列液晶显示屏的工作频率一般在100HZ-1KZ 左右,因此若果要直接利用芯片内部时钟,则必须进行降频即分频处理,否则当按键输入信号时,液晶屏由于工作频率很高而无法正常显示字符。
程序代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity yanshi is
port( clk,rst:in std_logic;
clkout:out std_logic
); end yanshi;
architecture fenpin_behave of yanshi is
signal inclk : std_logic_vector(12 downto 0); signal inner : std_logic;
begin
process(clk,rst) begin
消抖模块 信号 按键输入模块 译 码 模 块 液晶控制模块
LCD 时 钟 信 号
if rst = '0' then
inclk <= "0000000000000";
inner <= '0';
elsif clk'event and clk = '1' then --每来一个上升沿,inclk加一
if inclk = "1111111111111" then
inner <= not inner; --当inclk加满的时候,inner取反
inclk <= inclk + 1;
else
inclk <= inclk + 1;
end if;
end if;
end process;
clkout <= inner;
end fenpin_behave;
仿真结果:
如图仿真结果,利用功能仿真减少误差(以下各模块均使用功能仿真),延时电路可以把FPGA 内置10MHZ的时钟信号进行大约81920分频(count=1111111111111)为666HZ左右的信号,因此,此模块可以吧FPGA内部时钟信号分频到合适的频率信号以保证液晶模块的正常工作。
(2)消抖电路
加入本模块的原因是因为按键开关在按下时信号会产生抖动,在硬件实现是可能出现按一下跳过很多个数的情况,对程序的输入会产生影响,因此加入模块后消除抖动。
程序代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xiaodou is
port(
rst:in std_logic;
anjian: in std_logic;
clk: in std_logic;
anjianout: out std_logic );
end xiaodou;
architecture a of xiaodou is
signal count:integer range 0 to 100; begin
process(clk,rst,anjian)
begin
if(rst='0')then
count<=0;
anjianout<='0';
elsif(clk'event and clk='1')then
if(count=100)then
count<=0;
anjianout<=not anjian;
else
count<=count+1;
end if;
end if;
end process;
end a;
仿真结果:
如图所示消抖模块方仿真结果,由仿真图可以看出,当按键时间小于30ms时,按键输出不产生信号,因此可以避免键盘抖动产生的误操作,很好的实现了键盘消抖功能。
(3)计数电路
该模块的作用是将按键key输入进来的信号进行处理,每按一次,数自动+1,直到count为1111时自动循环,将按键的数值通过keyout发送给译码模块。
程序代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity jishu is
port(
key:in std_logic;
rst:in std_logic;
keyout:out std_logic_vector(3 downto 0)
);
end jishu;
architecture keywork of jishu is
signal q: std_logic;
signal counter : std_logic_vector(3 downto 0);
begin
q<=key when rst='1'else '0';
process(q,rst)
begin
if(rst='0')then
counter<="0000";
elsif q'event and q='1' then
if counter="1111" then
counter<="0000";
else
counter<=counter+1;
end if;
end if;
keyout<=counter;
end process;
end keywork;
仿真结果:
如图仿真结果,按键模块将按键次数装换成四位二进制数发送给下一个模块,以实现十六数字的循环显示。
(4)译码电路
该模块的作用是将数字的ASCII码编译成8位2进制ASCII码送给液晶屏控制程序,当显示到 F时置0。
程序代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity yima is
port(B:in std_logic_vector(3 downto 0);
X:out std_logic_vector(7 downto 0)); end yima;
architecture B1 of yima is
signal c:std_logic_vector(3 downto 0); begin
c<=B;
X<="00110000" when ( c="0000" ) else "00110001" when ( c="0001" ) else
"00110010" when ( c="0010" ) else
"00110011" when ( c="0011" ) else
"00110100" when ( c="0100" ) else
"00110101" when ( c="0101" ) else
"00110110" when ( c="0110" ) else
"00110111" when ( c="0111" ) else
"00111000" when ( c="1000" ) else
"00111001" when ( c="1001" ) else
"01000001" when ( c="1010" ) else
"01000010" when ( c="1011" ) else
"01000011" when ( c="1100" ) else
"01000100" when ( c="1101" ) else
"01000101" when ( c="1110" ) else
"01000110" when ( c="1111" ) else
"00110000";
end B1;
仿真结果:
如图所示四位二进制代码0-F经过译码后变为八位二进制代码,然后输出给下一个模块即显示模块。
(5)液晶屏显示电路
本模块用状态机的方法实现,每次按键按下,显示模块接收到要显示的8位二进制ASCII 码时,模块将液晶屏模式选择代码F9,横坐标07,纵坐标03分三次输入到液晶屏中,然后再将要显示的数的ASCII码的8位2进制码输入到液晶屏进行显示。
其中液晶屏横纵坐标,以及BUSY和REQ信号的控制将在附录中给出,此处不再赘述。
程序代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY xianshi IS
PORT( busy :in
STD_LOGIC;
clk1 :in STD_LOGIC;
db_ascii :in STD_LOGIC_VECTOR(7 DOWNTO 0);
req :out STD_LOGIC;
db :out STD_LOGIC_VECTOR(7 DOWNTO 0));
END xianshi;
ARCHITECTURE XS OF xianshi IS
SIGNAL ready : STD_LOGIC;
TYPE state IS (CMD_SEND,XX_SEND,YY_SEND,ASCII_SEND); SIGNAL current_state :state;
--SIGNAL db_send: std_logic_vector(7 downto 0);
BEGIN
PROCESS(clk1,busy,ready,db_ascii)
variable cnt1: std_logic_vector(2 downto 0);
BEGIN
--db_send<=db_ascii;
IF rising_edge(clk1) THEN
CASE current_state IS
WHEN CMD_SEND =>
IF busy='0' THEN
IF ready='1' THEN
current_state <= XX_SEND;
ready <= '0';
ELSE
db <= "11111001";
req <= '1';
ready <= '0';
END IF;
ELSE
req <= '0';
ready <= '1';
current_state <= CMD_SEND;
END IF;
WHEN XX_SEND =>
IF busy='0' THEN
IF ready='1' THEN
ready <= '0';
ELSE
db <= "00000111";
req <= '1';
ready <= '0';
END IF;
ELSE
req <= '0';
ready <= '1';
current_state <= XX_SEND;
END IF;
WHEN YY_SEND =>
IF busy='0' THEN
IF ready='1' THEN
current_state <= ASCII_SEND;
ready <= '0';
ELSE
db <= "00000011";
req <= '1';
ready <= '0';
END IF;
ELSE
req <= '0';
ready <='1';
current_state <= YY_SEND;
END IF;
WHEN ASCII_SEND =>
IF busy='0' THEN
IF ready='1' THEN
ready <= '0';
ELSE
db <=db_ascii;
req <= '1';
ready <= '0';
END IF;
ELSE
req <= '0';
ready <= '1';
current_state <= ASCII_SEND;
END IF;
END CASE;
END IF;
END PROCESS;
END XS;
仿真结果:
此仿真结果需要用到译码电路的8位二进制ASCII码,因此使用总体仿真结果替代之,同时也可以验证总体仿真结果。
由仿真结果可以看出,液晶模块最后根据按键输入一次输出F9 07 03 31,F9 07 03 32,F9 07 03 33...以此类推,最后成功的把要显示的字符输出给液晶模块,实现了利用按键控制液晶屏显示十六进制数。
利用protues仿真结果初步验证了各模块和整体电路的系统功能,最后通过USB下载到试验箱中,利用硬件验证系统的整体功能,由下图可以看出,本实验设计的系统功能是完整可靠的,可以很好的完成实验要求。
3.4、试验箱验证情况
第四章课程设计总结
通过本次课程设计我学到了很多东西,以前虽然也做过不少VHDL程序的设计,但都是在已经有写好的程序的情况下。
这次从设计到实现都独立完成还是第一次,自己亲身试过之后才会发现,软件上做出来的正确结果和硬件的实现有着巨大的差距。
编译好的程序在硬件实现时还有很多的因素要考虑,要处理。
比如,消抖程序中的count值的设定,有的同学count=50就足够了,而有的在设定为50时抖动的相当厉害,这都需要在硬件实现时再进行调试,有时候甚至整个程序都要重新编写。
这次课程设计我收获了很多学到了很多。
今后会更加珍惜课程设计的机会,努力让自己学到更多的知识。
第五章参考文献
1.侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计. 西安:西安电子科技大学出版社,1999
2.求是科技.CPLD/FPGA应用开发技术与工程实践.北京:人民邮电出版社,2005
3.罗苑棠.CPLD/FPGA常用模块与综合系统设计实例精讲.北京:电子工业出版社,2007 4.任勇峰,庄新敏.VHDL与硬件实现速成.北京:国防工业出版社,2005
附录1:系统整体电路图
附录2:FPGA引脚分配图
EP3C10E144C8芯片作为主芯片,以下为具体I/O分配表:
附录3:液晶显示屏说明书
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
硬件接口协议
接口协议为请求/应答(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)持续时间较长。
电性能参数
模块时间参数表
*:不同命令所占用的时间各不相同,具体时间在命令表中给出
用户命令
用户通过用户命令调用OCMJ 系列液晶显示器的各种功能。
命令分为操作码及操作数两部分,操作数为十六进制。
1)显示国标汉字
命令格式: F0 XX YY QQ WW
该命令为5字节命令(最大执行时间为1.2毫秒,Ts2=1.2mS),其中
XX:为以汉字为单位的屏幕行坐标值,取值范围00到07、02到09、00到09
YY:为以汉字为单位的屏幕列坐标值,取值范围00到01、00到03、00到04
QQ WW:坐标位置上要显示的GB 2312 汉字区位码
2) 显示8X8 ASCII字符
命令格式:F1 XX YY AS
该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中
XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13 YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F AS:坐标位置上要显示的ASCII 字符码
3) 显示8X16 ASCII字符
命令格式:F9 XX YY AS
该命令为4字节命令(最大执行时间为1.0毫秒,Ts2=1.0mS),其中
XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13 YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F AS:坐标位置上要显示的ASCII 字符码
4) 显示位点阵
命令格式: F2 XX YY
该命令为3字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中
XX:为以1*1点阵为单位的屏幕行坐标值,取值范围00到7F、20到9F、00到9F
YY:为以1*1点阵为单位的屏幕列坐标值,取值范围00到40、00到40、00到40
5) 显示字节点阵
命令格式: F3 XX YY BT
该命令为4字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中
XX:为以1*8点阵为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13 YY:为以1*1点阵为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F BT:字节像素值,0 显示白点,1 显示黑点(显示字节为横向)
模块尺寸图。