利用键盘控制液晶显示器.
- 格式:doc
- 大小:800.00 KB
- 文档页数:17
中北大学课程设计说明书学生姓名:毛雪娇学号:0706024101学院: 电子与计算机科学技术学院专业: 微电子学题目: 利用键盘控制液晶显示器进行汉字显示指导教师:王红亮职称: 讲师2010 年 6 月 25 日目录1. 课程设计目的 (2)2. 课程设计内容和要求 (2)2.1、设计内容 (2)2.2、设计要求 (2)3、设计方案及实现情况 (2)3.1、设计思路 (2)3.2、工作原理及框图 (3)3.3、各模块功能描述 (6)3.4、仿真结果 (14)3.5、实验箱验证情况 (14)4、课程设计总结 (15)5、参考文献 (16)1、课程设计目的(1)学习操作数字电路设计实验开发系统,掌握液晶显示器的工作原理及应用。
(2)掌握组合逻辑电路、时序逻辑电路的设计方法。
(3)学习掌握可编程器件设计的全过程。
2、课程设计内容和要求2.1、设计内容利用VHDL语言进行编程,使键盘控制液晶显示器进行汉字的显示。
2.2、设计要求1.学习掌握键盘控制模块、液晶显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实现汉字显示;5. 整理设计内容,编写设计说明书。
3、设计方案及实现情况3.1、设计思路利用process进程语句进行不同功能的实现,主要有分频,消抖,键盘扫描,键盘译码,数据存储模块,控制液晶显示器,主要是键盘模块和液晶模块,键盘主要是扫描信号,当其扫描到一个信号时,向液晶显示器发出一个该信号对应的地址信号,液晶显示器接收到该地址信号后,输出相应的数据,该数据为用户要其显示的汉字的区位码。
当按键分别为“1”、“2”、“3”、“4”、“5”、“6”时,液晶显示器显示的汉字分别为“中”、“北”、“大”、“学”、“春”、“天”。
3.2、工作原理及框图1.矩阵式键盘矩阵式键盘又叫行列式键盘,是用I/O口线组成的行、列矩阵结构,在每根行线与列线的交叉处,二线不直接相通而是通过一个按键跨接接通。
采用这种矩阵结构只需M根行输出线和N根列输入线,就可连接M×N个按键。
通过键盘扫描程序的行输出与列输入就可确认按键的状态,再通过键盘处理程序便可识别键值。
键盘扫描电路,键盘扫描电路是用来提供键盘扫描信号的电路,扫描信号的变化顺序依次为000-001-010-011-100-101-110-111……依次的周而复始,扫描时依次分别扫描八列按键,当扫描信号周而复始,扫描时依次分别扫描八列按键,当扫描信号依次为000时,扫描0这一列按键……每扫描一列按键,就检查一次是否有按键按下,如果这排有按键按下,就马上停止扫描,立即进行按键编码动作,如果没有就继续扫描下一列。
图1 键盘电路原理图图2 按键位置与数码关系2.液晶显示器接口协议为请求/应答(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,表明模块对用户的写操作已经执行完毕。
可以再送下一个数据。
图3 模块写汉字时序图3.按键的抖动问题:由于机械触点的弹性振动,按键在按下时不会马上稳定地接通而在弹起时也不能一下子完全的断开,因而在按键闭合和断开的瞬间均会出现一连串的抖动,这称为按键的抖动干扰,其产生的波形如图2所示,当按键按下时会产生前沿抖动,当按键弹起时会产生后沿抖动。
这是所有机械触点式按键在状态输出是的共性问题,抖动的时间长短取决于按键的机械特性与操作状态,一般为10ms-100ms ,此为键盘处理设计时要考虑的一个重要参数。
前沿抖动后沿抖动图 6-2按键的抖动干扰闭合稳定释放稳定键按下键释放图4按键抖动干扰产生的波形键盘抖动干扰的消除:按键的抖动会造成按一次键产生的开关状态被可编程逻辑器件误读几次。
为了使可编程逻辑器件能正确地读取按键状态,必须在按键闭合或断开时,消除产生的前沿或后沿抖动,去抖动的方法有硬件方法和软件方法两种。
本次课程设计采用了软件方法:软件方法是指编制一段时间大于100ms的延时程序,在第一次检测到有键按下时,执行这段延时子程序使键的前沿抖动消失后再检测该键状态,如果该键仍保持闭合状态电平,则确认为该键已稳定按下,否则无键按下,从而消除了抖动的影响。
同理,在检测到按键释放后,也同样要延迟一段时间,以消除后沿抖动,然后转入对该按键的处理。
3.3、各模块功能描述LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;USE ieee.std_logic_arith.all;ENTITY hanzi isPORT(clr,clk,BUSY: IN std_logic; --清零信号,时钟0信号,应答信号REQ : OUT std_logic; --请求信号sel : OUT STD_LOGIC_VECTOR (2 downto 0) ; --扫描信号key : IN STD_LOGIC_VECTOR (3 downto 0) ; --键盘输入dout: out std_logic_vector(7 downto 0) --数据输出);END hanzi;ARCHITECTURE doit OF hanzi ISsignal counter :std_logic_vector(7 downto 0); --计数信号,用来确定REQsignal addrbegin :std_logic_vector(7 downto 0); --存储器首地址signal addr1: std_logic_vector(7 downto 0); --变地址signal addr: std_logic_vector(7 DOWNTO 0); --数据地址signal DAT : std_logic_vector(7 downto 0); --输入到lcd的数据signal counter1 : std_logic_vector(1 downto 0); --分频计数signal counte : std_logic_vector(2 downto 0); --键盘扫描辅助信号signal counter2 : std_logic_vector(4 downto 0); --弹跳消除计数signal dcc : std_logic_vector(6 downto 0); --键盘行、列扫描信号结合后的信号signal clk1,test,koff: std_logic; --时钟1信号,测试信号,按键消抖信号signal DCC1:STD_LOGIC_VECTOR (3 DOWNTO 0); --按的哪个键BEGIN --键盘部分test<=key(3) and key(2) and key(1) and key(0); --检测有无按键按下P0: process(clr,clk)beginif(clr='0') thencounter1<="00";elsif(clk'event and clk='1') thencounter1<=counter1+1;end if;end process P0;clk1<='0' when counter1<="01" else'1';--P0为分频模块。
P1: process(clr,clk1,test)beginif(clr='0') thencounte<="000";elsif(clk1'event and clk1='1') thenif(test='0') or (koff='0') thencounte<=counte;elsecounte<=counte+1;end if;end if;end process P1;sel<=counte;dcc<=counte & key;--P1为键盘扫描模块。
P2: process(clk,test)beginif(clk'event and clk='0') thenif(dcc="0001110") thendcc1<="0000";elsif(dcc="0011110") thendcc1<="0001";elsif(dcc="0101110") thendcc1<="0010";elsif(dcc="0111110") thendcc1<="0011";elsif(dcc="1101110") thendcc1<="0100";elsif(dcc="1111110") thendcc1<="0101";elsif(dcc="0001101") thendcc1<="0110";elsif(dcc="0011101") thendcc1<="0111";elsif(dcc="1001101") thendcc1<="1000";elsif(dcc="1011101") thendcc1<="1001";elsif(dcc="1101101") thendcc1<="1010";elsif(dcc="1111101") thendcc1<="1011";elsif(dcc="0101011") thendcc1<="1100";elsif(dcc="0111011") thendcc1<="1101";elsif(dcc="1001011") thendcc1<="1110";elsif(dcc="1011011") thendcc1<="1111";elsif(test='0') thendcc1<="1111";end if;end if;end process P2;--P2为键盘译码。