设计题目LED七段数码管数字钟.docx
《设计题目LED七段数码管数字钟.docx》由会员分享,可在线阅读,更多相关《设计题目LED七段数码管数字钟.docx(41页珍藏版)》请在冰豆网上搜索。
设计题目LED七段数码管数字钟
设计题目:
LED七段数码管数字钟
学院名称:
计算机科学与工程学院
专业:
计算机科学与技术
班级:
05计1
*****
指导教师姓名:
白凤娥
指导教师职称:
教授
设计成绩:
评阅教师:
评阅日期:
2008年12月日
一、设计任务书
《微机原理及接口技术》是一门应用性、综合性、实践性较强的课程,没有实际的有针对性的设计环节,我们就不能很好的理解和掌握所学的技术知识,更缺乏解决实际问题的能力。
所以通过有针对性的课程设计,会使我们学会系统地综合运用所学的理论知识,提高我们在微机应用方面的开发与设计本领,系统的掌握微机硬软件设计方法。
通过课程设计实践,不仅要培养我们的实际动手能力,检验我们对本门课学习的情况,更要培养我们在实际的工程设计中查阅专业资料、工具书或参考书,掌握工程设计手段和软件工具,并能用设计报告表达设计思想和结果的能力。
培养我们实事求是和严肃认真的工作态度。
通过设计过程,要求我们熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使我们得到微机开发应用方面的初步训练。
集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。
通过本次课程设计,我们要熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
二、设计题目
LED七段数码管数字钟:
1.设计并完成LED七段数码管数字钟电路。
2.数字钟显示格式为:
HH:
MM:
SS。
3.具有通过键盘能够调整时、分、秒的功能。
三、设计方案
本设计采用LAB6000伟福仿真实验箱,利用4MHz脉冲信号源和多级分频电路产生脉冲信号,4MHz脉冲信号经过F/64分频后得到62.5KHz脉冲信号,将脉冲信号传递给8253定时器,定时器每0.000016秒中断一次,在中断服务程序中对中断次数进行计数,0.000016秒计数62500次就是1秒,然后在对秒计数得到分和小时值,并送入显示缓冲区,用总线方式控制数码管显示。
同时,利用实验箱提供的键盘扫描电路和显示电路来调整时、分、秒。
四、硬件原理
1.七段数码管显示
图1.七段数码管
七段数码管的字型代码表如下表:
显示字形
g
f
e
d
c
b
a
段码
0
0
1
1
1
1
1
1
3fh
1
0
0
0
0
1
1
0
06h
2
1
0
1
1
0
1
1
5bh
3
1
0
0
1
1
1
1
4fh
4
1
1
0
0
1
1
0
66h
5
1
1
0
1
1
0
1
6dh
6
1
1
1
1
1
0
1
7dh
7
0
0
0
0
1
1
1
07h
8
1
1
1
1
1
1
1
7fh
9
1
1
0
1
1
1
1
6fh
A
1
1
1
0
1
1
1
77h
B
1
1
1
1
1
0
0
7ch
C
0
1
1
1
0
0
1
39h
D
1
0
1
1
1
1
0
5eh
E
1
1
1
1
0
0
1
79h
F
1
1
1
0
0
0
1
71h
表1.段数码管的字型代码表
图2.八段数码LED显示电路
实验箱提供了6位八段数码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。
将KEY/LEDCS接到CS0上,则实验箱中八位段码输出地址为08004H,位码输出地址为08002H。
2.键盘扫描显示
图3.键盘扫描电路
实验箱提供了一个6×4的小键盘,将KEY/LEDCS信号接到CS0上,则列扫描地址为08002H,行码地址为08001H。
向列扫描码地址逐列输入低电平,然后从行码地址读回。
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。
这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
在判断有键按下后,要有一定的时延,防止键盘抖动。
3.8253计数器和8259中断
图4.8253计数器扩展电路
图5.8259中断扩展电路
4.硬件连接
8253用定时器/计数器1,8253片选接CS4,地址为0C000H,8253时钟源CLK1接分频电路的F/64输出,频器的Fin接4MHz时钟,8253的GATE1接VCC;8259中断INT0接8253的OUT1,片选接CS5,地址为0D000H。
显示电路的KEY/LEDCS接CS0,地址为08000H。
五、程序流程图及程序清单
通过调查研究,查阅资料,我初步确定系统结构的总体方案,并依此画出了主程序框图:
图6.主程序框图
根据主程序框图,要实现电子时钟,必须先实现七段数码管显示、键盘扫描显示、定时器以及将输入的键值转换为显示数据。
为了实现上述四个功能,我又设计了三个子模块的流程图,并完成了相应的程序设计。
1.七段数码管显示
图7.七段数码管显示子程序框图
七段数码管显示子程序清单:
DisplayLEDprocnear
movbx,offsetLEDBuf
movcl,6;共6个八段管
movah,00100000b;从左边开始显示
DLoop:
movdx,OUTBIT
moval,0
outdx,al;关所有八段管
moval,[bx]
movdx,OUTSEG
outdx,al
movdx,OUTBIT
moval,ah
outdx,al;显示一位八段管
pushax
movah,1
callDelay
popax
shrah,1
incbx
deccl
jnzDLoop
movdx,OUTBIT
moval,0
outdx,al;关所有八段管
ret
DisplayLEDendp
2.键盘扫描显示
图8.读键输入子程序框图
键盘扫描子程序清单:
TestKeyprocnear;判断有无键入
movdx,OUTBIT
moval,0
outdx,al;输出线置为0
movdx,IN_KEY
inal,dx;读入键状态
notal
andal,0fh;高四位不用
ret
TestKeyendp
GetKeyprocnear;读入键码
movch,00100000b
movcl,6
KLoop:
movdx,OUTBIT
moval,ch;找出键所在列
notal
outdx,al
shrch,1
movdx,IN_KEY
inal,dx
notal
andal,0fh
jneGoon_;该列有键入
deccl
jnzKLoop
movcl,0ffh;没有键按下,返回0ffh
jmpExit1
Goon_:
deccl
shlcl,2;键值=列X4+行
movch,4
LoopC:
testal,1
jnzExit1
shral,1
inccl
decch
jnzLoopC
Exit1:
movdx,OUTBIT
moval,0
outdx,al
movch,0
movbx,offsetKeyTable
addbx,cx
moval,[bx];取出键码
movbl,al
WaitRelease:
movdx,OUTBIT
moval,0
outdx,al;等键释放
movah,10
callDelay
callTestKey
jneWaitRelease
moval,bl
ret
GetKeyendp
3.定时器设计
图9.定时中断服务子程序框图
定时器设计的程序清单:
IEnterprocnear
pushax
pushdx
incSecond
moval,Second
cmpal,60
jneExit
movSecond,0
incMinute
moval,Minute
cmpal,60
jneExit
movMinute,0
incHour
moval,Hour
cmpal,24
jneExit
movHour,0
Exit:
movdx,CS8259A
moval,20h;中断服务程序结束指令
outdx,al
popdx
popax
iret
IEnterendp
IInitproc
movdx,CS8259A
moval,ICW1
outdx,al
movdx,CS8259B
moval,ICW2
outdx,al
moval,ICW4
outdx,al
moval,OCW1
outdx,al
ret
IInitendp
startprocnear
movax,data
movds,ax
movHour,0
movMinute,0
movSecond,0
cli
movax,0
movds,ax
moval,76h;01110110B;计数器1,16位,方式3,二进制
movdx,CONTROL
outdx,al
movax,62500
movdx,COUNT1
outdx,al;计数器低字节
moval,ah
outdx,al;计数器高字节
moval,MD8255
movdx,CTL8255
outdx,al
movbx,4*ICW2;中断号
movax,code
shlax,4;x16
addax,offsetIEnter;中断入口地址(段地址为0)
mov[bx],ax
movax,0
incbx
incbx
mov[bx],ax;代码段地址为0
callIInit
movax,data
movds,ax
movCNT,0;计数值初始为0
moval,CNT
movdx,PA8255
outdx,al
sti
LP:
;等待中断,并计数。
moval,Hour
movah,0
movcl,10
divcl
movch,ah
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movLEDBuf,al
movbx,offsetLEDMAP
moval,ch
movah,0
addbx,ax
moval,[bx]
oral,80h
movLEDBuf+1,al
moval,Minute
movah,0
movcl,10
divcl
movch,ah
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movLEDBuf+2,al
movbx,offsetLEDMAP
moval,ch
movah,0
addbx,ax
moval,[bx]
oral,80h
movLEDBuf+3,al
moval,Second
movah,0
movcl,10
divcl
movch,ah
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movLEDBuf+4,al
movbx,offsetLEDMAP
moval,ch
movah,0
addbx,ax
moval,[bx]
oral,80h
movLEDBuf+5,al
callDisplayLED
jmpLP
startendp
4.总程序设计
将上述三个子模块的功能结合起来,把键盘输入的数据转换成十进制,分别赋给Hour、Minute、Second,电子时钟就实现了。
总程序清单:
TurboAssemblerVersion3.008/12/2511:
21:
36Page1
F:
\05141101\DD.ASM
1=C003CONTROLequ0c003h
2=C000COUNT0equ0c000h
3=C001COUNT1equ0c001h
4=C002COUNT2equ0c002h
5
6=0082md8255equ82h;8255工作方式
7=8000PA8255equ8000h;8255PA口输出地址
8=8003CTL8255equ8003h;8255控制口地址
9=8001IN_KEYequ08001h;键盘读入口
10
11=8002OUTBITequ08002h;位控制口
12=8004OUTSEGequ08004h;段控制口
13
14=0013ICW1equ00010011b;单片8259,上升沿中断,要写ICW4
15=0020ICW2equ00100000b;中断号为20H
16=0001ICW4equ00000001b;工作在8086/88方式
17=00FEOCW1equ11111110b;只响应INT0中断
18=D000CS8259Aequ0d000h;8259地址
19=D001CS8259Bequ0d001h
20
210000datasegment
22000000CNTdb0
23000100Hourdb0
24000200Minutedb0
25000300Seconddb0
26000406*(?
?
)LEDBufdb6dup(?
);显示缓冲
27000A01*(?
?
)Numdb1dup(?
);显示的数据
28000B01*(?
?
)DelayTdb1dup(?
)
29000C06*(?
?
)dinglindb6dup(?
)
300012LEDMAP:
;八段管显示码
3100123F065B4F666D7D+db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
3207
33001A7F6F777C395E79+db7fh,6fh,77h,7ch,39h,5eh,79h,71h
3471
350022KeyTable:
;键码定义
360022161514FFdb16h,15h,14h,0ffh
37002613121110db13h,12h,11h,10h
38002A0D0C0B0Adb0dh,0ch,0bh,0ah
39002E0E030609db0eh,03h,06h,09h
4000320F020508db0fh,02h,05h,08h
41003600010407db00h,01h,04h,07h
42003Adataends
43
440000codesegment
45assumecs:
code,ds:
data
46
470000Delayprocnear
48000050pushax;延时子程序
49000151pushcx
50
510002B000moval,0
5200048BC8movcx,ax
530006E2FEloop$
54
55000859popcx
56000958popax
57000AC3ret
TurboAssemblerVersion3.008/12/2511:
21:
36Page2
F:
\05141101\DD.ASM
58000BDelayendp
59
60000BDisplayLEDprocnear
61000BBB0004rmovbx,offsetLEDBuf
62000EB106movcl,6;共6个八段管
630010B420movah,00100000b;从左边开始显示
640012DLoop:
650012BA8002movdx,OUTBIT
660015B000moval,0
670017EEoutdx,al;关所有八段管
6800188A07moval,[bx]
69001ABA8004movdx,OUTSEG
70001DEEoutdx,al
71
72001EBA8002movdx,OUTBIT
7300218AC4moval,ah
740023EEoutdx,al;显示一位八段管
75
76002450pushax
770025B401movah,1
780027E8FFD6callDelay
79002A58popax
80
81002BD0ECshrah,1
82002D43incbx
83002EFEC9deccl
84003075E0jnzDLoop
85
860032BA8002movdx,OUTBIT
870035B000moval,0
880037EEoutdx,al;关所有八段管
890038C3ret
900039DisplayLEDendp
91
92
930039TestKeyprocnear
940039BA8002movdx,OUTBIT
95003CB000moval,0
96003EEEoutdx,al;输出线置为0
97003FBA8001movdx,IN_KEY
980042ECinal,dx;读入键状态
99
1000043F6D0notal
1010045240Fandal,0fh;高四位不用
1020047C3ret
1030048TestKeyendp
104
1050048GetKeyprocnear
1060048B520movch,00100000b
107004AB106movcl,6
108004CKLoop:
109004CBA8002movdx,OUTBIT
110004F8AC5moval,ch;找出键所在列
1110051F6D0notal
1120053EEoutdx,al
1130054D0EDshrch,1
114
TurboAssemblerVersion3.008/12/2511:
21:
36Page3
F:
\05141101\DD.ASM
1150056BA8001movdx,IN_KEY
1160059ECinal,dx
117005AF6D0notal
118005C240Fandal,0fh
119005E7509jneGoon_;该列有键入
1200060FEC9deccl
121006275E8jnzKLoop
122
1230064B1FFmovcl,0ffh;没有键按下,返回0ffh
1240066EB1590jmpExit1
1250069Goon_:
1260069FEC9deccl
127006BD0E1D0E1shlcl,2;键值=列X4+行
128
129006FB504movch,4
1300071LoopC:
1310071A801testal,1
13200737508jnzExit1
1330075D0E8shral,1
1340077FEC1inccl
1350079FECDdecch
136007B75F4jnzLoopC
137007DExit1:
138007DBA8002movdx,OUTBIT
1390080B000moval,0
1400082EEoutdx,al
141
1420083B500movch,0