根据LCD1602的简单秒表的设计与实现Word文件下载.docx

上传人:b****6 文档编号:19474685 上传时间:2023-01-06 格式:DOCX 页数:45 大小:340.89KB
下载 相关 举报
根据LCD1602的简单秒表的设计与实现Word文件下载.docx_第1页
第1页 / 共45页
根据LCD1602的简单秒表的设计与实现Word文件下载.docx_第2页
第2页 / 共45页
根据LCD1602的简单秒表的设计与实现Word文件下载.docx_第3页
第3页 / 共45页
根据LCD1602的简单秒表的设计与实现Word文件下载.docx_第4页
第4页 / 共45页
根据LCD1602的简单秒表的设计与实现Word文件下载.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

根据LCD1602的简单秒表的设计与实现Word文件下载.docx

《根据LCD1602的简单秒表的设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《根据LCD1602的简单秒表的设计与实现Word文件下载.docx(45页珍藏版)》请在冰豆网上搜索。

根据LCD1602的简单秒表的设计与实现Word文件下载.docx

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

BTN1复位开关消抖模块fuweixiaodou

具体设计如下:

500000分频模块fpq

输入端口:

clk:

instd_logic;

输出端口:

clkout:

outstd_logic;

生成符号:

设计思路:

利用计数法实现分频

主要代码:

(完整代码请见源程序)

signalclktmp:

std_logic;

signaltmp:

integerrange0to249999;

begin

process(clk)

begin

ifclk'

eventandclk='

1'

then

iftmp=249999then--500000分频

tmp<

=0;

clktmp<

=notclktmp;

else

tmp<

=tmp+1;

endif;

endif;

endprocess;

clkout<

=clktmp;

50000分频模块fpq1:

输入端口:

生成符号:

设计思路:

integerrange0to24999;

process(clk)

iftmp=24999then--50000分频

6进制计数器模块cnt6:

reset,en,clk:

INSTD_LOGIC;

carry:

OUTSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

正常的计数状态是0->

1->

2->

3->

4->

5->

0->

1……;

当计数到5时,进位信号变为‘1’;

否则状态自增,进位信号保持在‘0’

SIGNALqs:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALca:

STD_LOGIC;

BEGIN

PROCESS(clk)

IF(reset='

)THENqs<

="

0000"

;

ELSIF(clk'

EVENTANDclk='

)THEN

IF(en='

0'

)THEN

IF(qs="

0101"

)THEN--计数到5

qs<

="

ca<

='

ELSE

=qs+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(ca,en)

BEGIN

q<

=qs;

carry<

=ca;

10进制计数器模块cnt10:

正常的计数状态是;

6->

7->

8->

9->

1……

当计数到9时,进位信号变为‘1’;

1001"

)THEN--计数到9

PROCESS(ca)

24进制计数器模块cnt24:

输入端口en,Reset,clk:

inSTD_LOGIC;

输出端口carry:

outSTD_LOGIC;

qa:

outSTD_LOGIC_VECTOR(3DOWNTO0);

qb:

低位qa状态变化:

高位qb状态变化:

当低位qa计数到9时,qb自增,进位信号保持在‘0’

当低位qa为3且高位qb为2时,进位信号变为‘1’,

同时qa变为0、qb变为0

主要代码:

process(clk,Reset,en)

variabletma:

STD_LOGIC_VECTOR(3DOWNTO0);

variabletmb:

IfReset='

thentma:

tmb:

else

ifclk'

--当BTN0键没有第一次按下时,正常计数

iftma="

tmb:

=tmb+1;

elsiftmb="

0010"

andtma="

0011"

then

--计数到23

tma:

elsetma:

=tma+1;

endif;

qa<

=tma;

qb<

=tmb;

carry<

endprocess;

译码模块yima:

carry:

data:

instd_logic_vector(3downto0);

dataout:

outstd_logic_vector(7downto0));

设计思路:

根据输入信号的不同,使用case语句进行不同的译码操作即可。

具体来说:

'

(四位二进制)译为"

30"

(八位二进制)

'

31"

2'

32"

3'

33"

4'

34"

5'

35"

6'

36"

7'

37"

8'

38"

9'

39"

其他译为"

20"

signaldis:

std_logic_vector(7downto0);

process(data)

if(carry='

)then

dis<

11111111"

casedatais

when"

=>

dis<

00110000"

--'

译为"

0001"

00110001"

00110010"

00110011"

0100"

00110100"

00110101"

0110"

00110110"

0111"

00110111"

1000"

00111000"

00111001"

whenothers=>

00100000"

--其他译为"

endcase;

dataout<

=dis;

LCD1602显示模块LCD1602:

输入端口:

YIMA_DATA1:

instd_logic_vector(7downto0);

--译码数据信号1

YIMA_DATA2:

--译码数据信号2

YIMA_DATA3:

--译码数据信号3

YIMA_DATA4:

--译码数据信号4

YIMA_DATA5:

--译码数据信号5

YIMA_DATA6:

--译码数据信号6

YIMA_DATA7:

--译码数据信号7

YIMA_DATA8:

--译码数据信号8

LCD_Clk:

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

carry:

LCD_RS:

--寄存器选择信号

LCD_RW:

--液晶读写信号

LCD_EN:

--液晶时钟信号

LCD_Data:

outstd_logic_vector(7downto0);

--液晶数据信号

设计思路:

主要代码:

(完整代码请见源程序)

typeramisarray(0to10)ofstd_logic_vector(7downto0);

signalram1:

ram;

LCD_EN<

=LCD_Clk;

LCD_RW<

='

;

ram1(0)<

=YIMA_DATA8;

--译码数据信号8,秒表小时部分十位

ram1

(1)<

=YIMA_DATA7;

--译码数据信号7,秒表小时部分个位

ram1

(2)<

=x"

3a"

--显示冒号:

ram1(3)<

=YIMA_DATA6;

--译码数据信号6,秒表分钟部分十位

ram1(4)<

=YIMA_DATA5;

--译码数据信号5,秒表分钟部分个位

ram1(5)<

ram1(6)<

=YIMA_DATA4;

--译码数据信号4,秒表秒钟部分十位

ram1(7)<

=YIMA_DATA3;

--译码数据信号3,秒表秒钟部分个位

ram1(8)<

2e"

--显示小数点.

ram1(9)<

=YIMA_DATA2;

--译码数据信号2,秒表十分秒位

ram1(10)<

=YIMA_DATA1;

--译码数据信号1,秒表百分秒位

process(LCD_Clk)

variablecnt:

integerrange0to37;

begin

ifLCD_Clk'

eventandLCD_Clk='

then

ifcnt=37thencnt:

elsecnt:

=cnt+1;

endif;

casecntis

-----------------InitLCD1602初始化部分-------------

when0=>

LCD_RS<

lcd_data<

--0x38

when1=>

00001100"

--0x0C

when2=>

00000001"

--0x01

when3=>

00000110"

--0x06

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

when4=>

10000000"

--0x80

--display,0x00+0x80

-------------------datadisplay----------------------

when5=>

10100000"

--空格

when6=>

when7=>

when8=>

=ram1(0);

--秒表小时部分十位

when9=>

=ram1

(1);

--秒表小时部分个位

when10=>

=ram1

(2);

--冒号:

when11=>

=ram1(3);

--秒表分钟部分十位

when12=>

=ram1(4);

--秒表分钟部分个位

when13=>

=ram1(5);

when14=>

=ram1(6);

--秒表秒钟部分十位

when15=>

=ram1(7);

--秒表秒钟部分个位

when16=>

=ram1(8);

--小数点.

when17=>

=ram1(9);

--秒表十分秒位

when18=>

=ram1(10);

--秒表百分秒位

when19=>

-空格

when20=>

-空格

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

when21=>

11000000"

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

when22=>

when23=>

when24=>

--空格

when25=>

when26=>

when27=>

when28=>

when29=>

when30=>

when31=>

when32=>

when33=>

when34=>

when35=>

when36=>

when37=>

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

instd_logic;

key_en:

输出端口:

en_out:

outstd_logic;

采用计数型防抖

当key_en第一次为'

时,en_out延迟一段时间后变为'

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

直到key_en第二次为'

signalcnt:

integerrange0to3;

--采用计数型防抖

signalen,en_tmp:

std_logic;

p0:

process(clk)

eventandclk='

ifkey_en='

ifcnt=3thenen<

elsecnt<

=cnt+1;

en<

endif;

elsecnt<

endprocessp0;

p1:

process(en)

ifen'

eventanden='

en_tmp<

=noten_tmp;

en_out<

=en_tmp;

endprocessp1;

BTN1复位开关消抖模块fuweixiaodou:

fuwei:

fuwei_out:

outstd_logic;

当fuwei为'

时,fuwei_out延迟一段时间后变为'

然后fuwei_o

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1