电子秒表的设计
- 格式:doc
- 大小:258.50 KB
- 文档页数:9
实验二:电子秒表的设计
一、功能分析
1.6位LED:
5 9 5 9 9
9
分 秒 1/10秒 1/100秒
2.按键启动、停止秒表计数,可以清零。
二、硬件设计
1. 硬件电路图
2. 元器件清单
伟福Lab6000综合实验/仿真系统一台套;微机一台;导线若干
三、程序设计
1.程序:
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口 - 1 - IN equ 08001h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲
Hour equ 40h
Minute equ 41h
Second equ 42h
C100us equ 43h
Speaker equ P1.2
Tick equ 200
T100us equ 256-50
ljmp Start
org 000bh
ljmp T0Int
T0Int:
push PSW
push ACC
mov a, C100us+1
jnz Goon0
dec C100us
Goon0:
dec C100us+1
mov a, C100us
orl a, C100us+1
jnz Exit
mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
inc Second
mov a, Second
cjne a, #60, Exit
mov Second, #0
inc Minute
call lightup
mov a, Minute
cjne a, #60, Exit
mov Minute, #0
inc Hour
mov a, Hour
cjne a, #24, Exit
mov Hour, #0
Exit:
pop ACC
pop PSW - 2 - reti
Delay:
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 输出线置为0
mov dptr, #IN
movx a, @dptr ; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 键码定义
db 16h, 15h, 14h, 0ffh
db 13h, 12h, 11h, 10h
db 0dh, 0ch, 0bh, 0ah
db 0eh, 03h, 06h, 09h
db 0fh, 02h, 05h, 08h
db 00h, 01h, 04h, 07h
GetKey:
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b
mov r2, #6
KLoop:
mov a, r1 ; 找出键所在列
cpl a
movx @dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, @r0
cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入
djnz r2, KLoop
mov r2, #0ffh ; 没有键按下, 返回 0ffh
sjmp Exit3
Goon1: - 3 - mov r1, a ; 键值 = 列 X 4 + 行
mov a, r2
dec a
rl a
rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中为读入的行值
mov r1, #4
LoopC:
rrc a ; 移位找出所在行
jc Exit3
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit3:
mov a, r2 ; 取出键码
mov dptr, #KeyTable
movc a, @a+dptr
mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等键释放
clr a
movx @dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示
LOOP:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2 - 4 - movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
ret
LIGHTUP:
jb p1.3,lightstop
setb Speaker
mov b,#0ffh
LIGHTDELAY:
nop
nop
djnz b,lightdelay
clr speaker
LIGHTSTOP:
ret
ToLED:
mov dptr, #LEDMap
movc a, @a+dptr
ret
START:
mov LEDBuf+0, #07ch
mov LEDBuf+1, #03fh
mov LEDBuf+2, #07fh
mov LEDBuf+3, #05bh
mov LEDBuf+4, #05bH
mov LEDBuf+5, #05bH
call displayled
call testkey
jz start
call getkey
cjne a,#0ah,start
START1:
mov TMOD, #02h ; 模式2, 定时器
mov TH0, #T100us
mov TL0, #T100us
mov IE, #10000010b
mov Hour, #0
mov Minute, #0
mov Second, #0 - 5 - mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
setb TR0
MAIN:
JB P1.0,stop
JB P1.1,clear
Call testkey
call getkey
mov b,a
xrl a,#0bh
jz stop0
mov a,b
cjne a,#0ch,main2
ljmp clear0
MAIN2:
mov a, Hour
mov b, #10
div ab
call ToLED