基于LCD1602的简易秒表的设计与实现文档格式.docx
- 文档编号:17453572
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:45
- 大小:346.38KB
基于LCD1602的简易秒表的设计与实现文档格式.docx
《基于LCD1602的简易秒表的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《基于LCD1602的简易秒表的设计与实现文档格式.docx(45页珍藏版)》请在冰豆网上搜索。
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:
输入端口:
clk:
clkout:
outstd_logic;
生成符号:
设计思路:
主要代码:
std_logic;
integerrange0to24999;
ifclk’eventandclk='
1'
then
iftmp=24999then——50000分频
=0;
clktmp〈=notclktmp;
tmp<
=tmp+1;
endif;
endprocess;
clkout<
=clktmp;
③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='
1’)THENqs<
="
0000”;
ELSIF(clk'
EVENTANDclk=’1’)THEN
IF(en='
0’)THEN
IF(qs=”0101"
)THEN—-计数到5
qs〈=”0000"
;
ca〈=’1'
;
ELSE
qs<
=qs+1;
ca〈=’0'
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(ca,en)
BEGIN
q<
=qs;
carry<
=ca;
ENDPROCESS;
④10进制计数器模块cnt10:
reset,en,clk:
INSTD_LOGIC;
输出端口:
carry:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
生成符号:
正常的计数状态是;
0-〉1->
2—>
3-〉4-〉5-〉6—〉7—>
8->
9-〉0->
1……
当计数到9时,进位信号变为‘1’;
SIGNALqs:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALca:
IF(reset=’1’)THENqs〈=”0000"
ELSIF(clk’EVENTANDclk=’1’)THEN
IF(qs="
1001”)THEN—-计数到9
ca〈='
1’;
ENDPROCESS;
PROCESS(ca)
⑤24进制计数器模块cnt24:
输入端口en,Reset,clk:
inSTD_LOGIC;
输出端口carry:
outSTD_LOGIC;
qa:
outSTD_LOGIC_VECTOR(3DOWNTO0);
qb:
outSTD_LOGIC_VECTOR(3DOWNTO0);
正常的计数状态是;
低位qa状态变化:
2->
3—>
4-〉5—>
6—〉7—〉8—〉9->
0-〉1……
高位qb状态变化:
0-〉1-〉2->
0->
当低位qa计数到9时,qb自增,进位信号保持在‘0’
当低位qa为3且高位qb为2时,进位信号变为‘1’,
同时qa变为0、qb变为0
主要代码:
SIGNALca:
STD_LOGIC;
process(clk,Reset,en)
variabletma:
STD_LOGIC_VECTOR(3DOWNTO0);
variabletmb:
STD_LOGIC_VECTOR(3DOWNTO0);
IfReset=’1'
thentma:
=”0000"
tmb:
0000"
else
ifclk’eventandclk='
IF(en='
0'
)THEN
-—当BTN0键没有第一次按下时,正常计数
iftma=”1001”thentma:
tmb:
=tmb+1;
elsiftmb=”0010"
andtma="
0011"
then
-—计数到23
tma:
=”0000”;
ca<
=’1’;
elsetma:
=tma+1;
qa<
=tma;
qb<
=tmb;
carry〈=ca;
endprocess;
⑥译码模块yima:
carry:
inSTD_LOGIC;
data:
instd_logic_vector(3downto0);
dataout:
outstd_logic_vector(7downto0));
设计思路:
根据输入信号的不同,使用case语句进行不同的译码操作即可。
'
(四位二进制)译为"
30”(八位二进制)
'
1’(四位二进制)译为”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”;
else
casedatais
when”0000"
=>
dis〈="
00110000”;
——’0’译为"
30”
when”0001"
dis<
=”00110001"
——'
译为”31"
when"
0010”=>
dis〈=”00110010"
--'
2'
译为"
32”
00110011"
—-'
3’译为"
33"
when”0100"
=〉dis〈=”00110100”;
4'
译为”34"
when”0101”=〉dis〈="
00110101”;
5’译为”35”
when”0110”=〉dis〈="
00110110”;
-—’6'
译为”36"
when”0111”=〉dis<
=”00110111"
--’7’译为”37"
1000"
00111000”;
-—’8’译为"
38"
when"
1001"
=”00111001"
9’译为”39”
whenothers=>
00100000”;
——其他译为"
20”
endcase;
dataout〈=dis;
⑦LCD1602显示模块LCD1602:
输入端口:
YIMA_DATA1:
instd_logic_vector(7downto0);
—-译码数据信号1
YIMA_DATA2:
instd_logic_vector(7downto0);
——译码数据信号2
YIMA_DATA3:
--译码数据信号3
YIMA_DATA4:
-—译码数据信号4
YIMA_DATA5:
—-译码数据信号5
YIMA_DATA6:
--译码数据信号6
YIMA_DATA7:
--译码数据信号7
YIMA_DATA8:
——译码数据信号8
LCD_Clk:
instd_logic;
——状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间
carry:
inSTD_LOGIC;
LCD_RS:
—-寄存器选择信号
LCD_RW:
--液晶读写信号
LCD_EN:
-—液晶时钟信号
LCD_Data:
outstd_logic_vector(7downto0);
—-液晶数据信号
将各个计数器部分的输出信号通过译码模块,变成LCD1602液晶屏能够读取并从而显示相关字符的8位二进制数据。
再定义一个存储器ram,存储各个计数器部分的输出信号经过译码部分之后得到的数据,然后将这个存储器ram代表的数据在LCD1602液晶屏上显示.
主要代码:
(完整代码请见源程序)
typeramisarray(0to10)ofstd_logic_vector(7downto0);
signalram1:
ram;
LCD_EN<
=LCD_Clk;
——液晶时钟信号
LCD_RW<
=’0’;
——液晶读写信号
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)<
=x"
3a”;
-—显示冒号:
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='
1’then
ifcnt=37thencnt:
elsecnt:
=cnt+1;
endif;
casecntis
--——-——---——-——-—InitLCD1602初始化部分---——--—--—-—
when0=>
LCD_RS〈='
0’;
lcd_data<
=”00111000"
--0x38
when1=>
lcd_data〈="
00001100"
--0x0C
when2=>
LCD_RS<
=’0'
00000001"
--0x01
when3=〉LCD_RS〈='
=”00000110"
-—0x06
---——--—--———-——--—-—-——--—-—-—-——-——-—--——--——---—-—
when4=>
='
lcd_data〈=”10000000”;
-—0x80
——display,0x00+0x80
---————--—-———----—datadisplay—-—-—--—--—--—--——----
when5=〉LCD_RS〈=’1’;
10100000”;
--空格
when6=>
lcd_data〈=”10100000”;
when7=>
=’1’;
=”10100000”;
——空格
when8=>
LCD_RS〈=’1'
=ram1(0);
—-秒表小时部分十位
when9=>
lcd_data〈=ram1
(1);
-—秒表小时部分个位
when10=〉LCD_RS〈='
lcd_data〈=ram1
(2);
——冒号:
when11=>
=ram1(3);
—-秒表分钟部分十位
when12=>
=ram1(4);
--秒表分钟部分个位
when13=>
=ram1(5);
when14=>
LCD_RS〈=’1’;
lcd_data〈=ram1(6);
——秒表秒钟部分十位
when15=>
=ram1(7);
—-秒表秒钟部分个位
when16=>
1’;
=ram1(8);
-—小数点。
when17=>
lcd_data〈=ram1(9);
——秒表十分秒位
when18=〉LCD_RS〈=’1'
=ram1(10);
--秒表百分秒位
when19=>
10100000”;
-空格
when20=>
—空格
--—--—------—--—--—---————-———-----————-—--——-——----—
when21=〉LCD_RS〈='
11000000”;
-—设定显示的位置在40H+80H,
———————---——————-—-——-———----—-—————-——--——-—-—--————
when22=>
—-空格
when23=〉LCD_RS〈='
10100000"
—-空格
when24=〉LCD_RS<
—-空格
when25=〉LCD_RS〈='
=”10100000"
when26=〉LCD_RS〈='
lcd_data〈=”10100000"
when27=>
LCD_RS〈=’1’;
lcd_data〈=”10100000”;
——空格
when28=>
--空格
when29=〉LCD_RS<
when30=>
when31=>
when32=>
when33=〉LCD_RS〈=’1’;
-—空格
when34=>
when35=〉LCD_RS<
when36=>
when37=〉LCD_RS<
endprocess;
⑧BTN0启动/停止开关消抖模块xiaodou:
输入端口:
instd_logic;
key_en:
instd_logic;
en_out:
outstd_logic;
生成符号:
设计思路:
采用计数型防抖
当key_en第一次为’1’时,en_out延迟一段时间后变为'
1’,
并且en_out就此保持在高电平’1'
直到key_en第二次为’1'
时,en_out延迟一段时间后变为’0'
。
主要代码:
signalcnt:
integerrange0to3;
——采用计数型防抖
signalen,en_tmp:
std_logic;
begin
p0:
process(clk)
ifclk’eventandclk='
ifkey_en=’1'
ifcnt=3thenen<
elsecnt〈=cnt+1;
en〈='
endif;
elsecnt<
en〈=’0'
endif;
endprocessp0;
p1:
process(en)
ifen'
eventanden=’1'
en_tmp〈=noten_tmp;
en_out<
=en_tmp;
endprocessp1;
⑨BTN1复位开关消抖模块fuweixiaodou:
instd_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 LCD1602 简易 秒表 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)