根据LCD1602的简单秒表的设计与实现Word文件下载.docx
- 文档编号:19474685
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:45
- 大小:340.89KB
根据LCD1602的简单秒表的设计与实现Word文件下载.docx
《根据LCD1602的简单秒表的设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《根据LCD1602的简单秒表的设计与实现Word文件下载.docx(45页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 根据 LCD1602 简单 秒表 设计 实现