基于LCD1602的简易秒表的设计与实现 联系客服

发布时间 : 星期六 文章基于LCD1602的简易秒表的设计与实现更新完毕开始阅读

'4'(四位二进制)译为\(八位二进制) '5'(四位二进制)译为\(八位二进制) '6'(四位二进制)译为\(八位二进制) '7'(四位二进制)译为\(八位二进制) '8'(四位二进制)译为\(八位二进制) '9'(四位二进制)译为\(八位二进制) 其他译为\(八位二进制)

主要代码:(完整代码请见源程序)

signal dis:std_logic_vector(7 downto 0);

begin

process(data) begin

if(carry='1') then dis<=\else

case data is

when \译为\when \译为\when \译为\when \译为\ when \译为\ when \译为\ when \译为\when \译为\when \译为\ when \译为\ when others=>dis<=\其他译为\end case; end if;

end process;

dataout<=dis;

⑦LCD1602显示模块LCD1602: 输入端口:

YIMA_DATA1: in std_logic_vector(7 downto 0); --译码数据信号1

YIMA_DATA2: in std_logic_vector(7 downto 0); --译码数据信号2 YIMA_DATA3: in std_logic_vector(7 downto 0); --译码数据信号3 YIMA_DATA4: in std_logic_vector(7 downto 0); --译码数据信号4 YIMA_DATA5: in std_logic_vector(7 downto 0); --译码数据信号5 YIMA_DATA6: in std_logic_vector(7 downto 0); --译码数据信号6 YIMA_DATA7: in std_logic_vector(7 downto 0); --译码数据信号7 YIMA_DATA8: in std_logic_vector(7 downto 0); --译码数据信号8

LCD_Clk : in std_logic;

第 9 页 共 37 页

--状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间

carry : in STD_LOGIC; 输出端口:

LCD_RS : out std_logic; --寄存器选择信号 LCD_RW : out std_logic; --液晶读写信号 LCD_EN : out std_logic; --液晶时钟信号

LCD_Data : out std_logic_vector(7 downto 0); --液晶数据信号 生成符号:

设计思路:

将各个计数器部分的输出信号通过译码模块,变成LCD1602液晶屏能够读取并从而显示相关字符的8位二进制数据。再定义一个存储器ram,存储各个计数器部分的输出信号经过译码部分之后得到的数据,然后将这个存储器ram代表的数据在LCD1602液晶屏上显示。

主要代码:(完整代码请见源程序)

type ram is array(0 to 10) of std_logic_vector(7 downto 0); signal ram1:ram; begin

LCD_EN <= LCD_Clk ; --液晶时钟信号 LCD_RW <= '0' ; --液晶读写信号

ram1(0)<=YIMA_DATA8;--译码数据信号8,秒表小时部分十位 ram1(1)<=YIMA_DATA7;--译码数据信号7,秒表小时部分个位 ram1(2)<=x\显示冒号:

ram1(3)<=YIMA_DATA6;--译码数据信号6,秒表分钟部分十位 ram1(4)<=YIMA_DATA5;--译码数据信号5,秒表分钟部分个位 ram1(5)<=x\显示冒号:

ram1(6)<=YIMA_DATA4;--译码数据信号4,秒表秒钟部分十位 ram1(7)<=YIMA_DATA3;--译码数据信号3,秒表秒钟部分个位 ram1(8)<=x\显示小数点.

第 10 页 共 37 页

ram1(9)<=YIMA_DATA2;--译码数据信号2,秒表十分秒位

ram1(10)<=YIMA_DATA1;--译码数据信号1,秒表百分秒位

process(LCD_Clk)

variable cnt :integer range 0 to 37;

begin

if LCD_Clk'event and LCD_Clk = '1'then

if cnt =37 then cnt :=0; else cnt :=cnt +1; end if; end if;

case cnt is

-----------------Init LCD1602初始化部分------------- when 0 =>LCD_RS<='0';lcd_data<=\

when 1 =>LCD_RS<='0';lcd_data<=\

when 2 =>LCD_RS<='0';lcd_data<=\

when 3 =>LCD_RS<='0';lcd_data<=\

-----------------------------------------------------

when 4 =>LCD_RS<='0';lcd_data<=\

--display,0x00+0x80

-------------------data display---------------------- when 5=>LCD_RS<='1';lcd_data<=\空格

when 6=>LCD_RS<='1';lcd_data<=\空格

when 7=>LCD_RS<='1';lcd_data<=\空格

when 8=>LCD_RS<='1';lcd_data<=ram1(0);--秒表小时部分十位

when 9=>LCD_RS<='1';lcd_data<=ram1(1);--秒表小时部分个位 when 10=>LCD_RS<='1';lcd_data<=ram1(2);--冒号:

when 11=>LCD_RS<='1';lcd_data<=ram1(3);--秒表分钟部分十位 when 12=>LCD_RS<='1';lcd_data<=ram1(4);--秒表分钟部分个位 when 13=>LCD_RS<='1';lcd_data<=ram1(5);--冒号:

when 14=>LCD_RS<='1';lcd_data<=ram1(6);--秒表秒钟部分十位

when 15=>LCD_RS<='1';lcd_data<=ram1(7);--秒表秒钟部分个位

when 16=>LCD_RS<='1';lcd_data<=ram1(8);--小数点.

when 17=>LCD_RS<='1';lcd_data<=ram1(9);--秒表十分秒位 when 18=>LCD_RS<='1';lcd_data<=ram1(10);--秒表百分秒位 when 19=>LCD_RS<='1';lcd_data<=\空格 when 20=>LCD_RS<='1';lcd_data<=\空格

----------------------------------------------------- when 21=>LCD_RS<='0';lcd_data<=\

--设定显示的位置在40H+80H,

----------------------------------------------------- when 22=>LCD_RS<='1';lcd_data<=\空格 when 23=>LCD_RS<='1';lcd_data<=\空格

第 11 页 共 37 页

when 24=>LCD_RS<='1';lcd_data<=\空格 when 25=>LCD_RS<='1';lcd_data<=\空格 when 26=>LCD_RS<='1';lcd_data<=\空格 when 27=>LCD_RS<='1';lcd_data<=\空格 when 28=>LCD_RS<='1';lcd_data<=\空格 when 29=>LCD_RS<='1';lcd_data<=\空格 when 30=>LCD_RS<='1';lcd_data<=\空格 when 31=>LCD_RS<='1';lcd_data<=\空格 when 32=>LCD_RS<='1';lcd_data<=\空格 when 33=>LCD_RS<='1';lcd_data<=\空格 when 34=>LCD_RS<='1';lcd_data<=\空格 when 35=>LCD_RS<='1';lcd_data<=\空格 when 36=>LCD_RS<='1';lcd_data<=\空格

when 37=>LCD_RS<='1';lcd_data<=\空格 end case;

end process;

⑧BTN0启动/停止开关消抖模块xiaodou:

输入端口:clk :in std_logic; key_en:in std_logic;

输出端口: en_out:out std_logic; 生成符号:

设计思路:

采用计数型防抖

当key_en第一次为'1'时,en_out延迟一段时间后变为'1',

并且en_out就此保持在高电平'1';

直到key_en第二次为'1'时,en_out延迟一段时间后变为'0'。

主要代码:(完整代码请见源程序)

signal cnt:integer range 0 to 3;--采用计数型防抖 signal en,en_tmp:std_logic; begin

p0:process(clk) begin

if clk'event and clk ='1' then

第 12 页 共 37 页