闹钟代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)abc键的判断
OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口
IN equ 08001h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲LEDBuf1 equ 50h ; 显示缓冲
Hour equ 40h
Minute equ 41h
Second equ 42h
C100us equ 43h
Hour1 equ 44h
Minute1 equ 45h
Second1 equ 46h
SPK equ P3.6 ;扬声器接P3.6口
Tick equ 10000
T100us equ 256-50
Num equ 70h
ljmp Start ;跳入主程序
org 000bh ;定时器中断0入口地址
jmp T0Int
org 001bh ;定时器中断1入口地址
T0Int:
push PSW
push ACC
mov a, C100us+1
jnz Goon
dec C100us
Goon:
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
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
reti
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
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
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
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 Exit1
Goon1:
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 Exit1
inc r2 ; r2 = r2+ 行值
djnz r1, Loopc
Exit1:
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
ToLED:
mov dptr, #LEDMap
movc a, @a+dptr
ret
isplayLED1:
mov r0, #LEDBuf1
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示DisplayLED1:
mov r0, #LEDBuf1
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示Loop1:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop1
ret
dsloop:
call jsloop
call sfm
ret
jsloop :
t1p: call TestKey ; 有键入?
jz t1p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t2p: call TestKey ; 有键入?
jz t2p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Hour1,a
t3p: call TestKey ; 有键入?
jz t3p ; 无键入, 继续显示
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t4p: call TestKey ; 有键入?
jz t4p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Minute1,a
t5p: call TestKey ; 有键入?
jz t5p
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t6p: call TestKey ; 有键入?
jz t6p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Second1,a
ret
sfm:
mov a, Hour
mov b, #10
div ab
call ToLED
mov LEDBuf, a
;将小时分开两位来显示
mov a, b
call ToLED
orl a, #80h; (;)
mov LEDBuf+1, a
mov a, Minute
mov b, #10
div ab
call ToLED
;将分钟分开两位来显示
mov LEDBuf+2, a
mov a, b
call ToLED
orl a, #80h;()
mov LEDBuf+3, a
mov a, Second
mov b, #10
div ab
call ToLED
;将秒钟分开两位来显示
mov LEDBuf+4, a
mov a, b
call ToLED
mov LEDBuf+5, a
ret
jjloop :
t1: call TestKey ; 有键入?
jz t1 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t2: call TestKey ; 有键入?
jz t2 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Hour,a
t3: call TestKey ; 有键入?
jz t3 ; 无键入, 继续显示
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t4: call TestKey ; 有键入?
jz t4 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Minute,a
t5: call TestKey ; 有键入?
jz t5
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t6: call TestKey ; 有键入?
jz t6 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Second,a
ret
xxloop: call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
anl a, #0fh ; 显示键码
cjne a,#77h, yyloop ;判断A键是否被按下
mov r4,#1
call jjloop
call bjloop
ret
yyloop:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
anl a, #0fh ; 显示键码
cjne a,#39h, MLoop;判断c键是否被按下
call dsloop
call bjloop
ret
Start: MOV SP,#50H
mov r4,#0
mov TMOD, #02h ;(02h)模式2, 定时器mov TH0, #T100us
mov TL0, #T100us
mov IE, #10000010b;EA=1, IT0 = 1, #10001010b
MOV TH1,#0D8H
MOV TL1,#0EFH
;MOV TMOD,#10H
mov Hour, #0;;#09 ;(#0)
mov Minute, #0
mov Second, #0
mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
setb TR0 ; 启动定时器0
MLoop:
Call sfm
call DisplayLED ;调用显示程序
call xxloop
bjloop:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz bjLoop ; 无键入, 继续显示
call GetKey ; 读入键码
anl a, #0fh ; 显示键码
call ToLED
cjne a,#7ch,bjloop;判断B键是否被按下
call sfm
zzloop:
mov a,#60
;对当前输入的时间和计时时间进行比较
cjne a,50h,rrr
mov a,61h
cjne a,51h,rrr
mov a,62h
cjne a,52h,rrr
mov a,63h
cjne a,53h,rrr
mov a,64h
cjne a,54h,rrr
mov a,65h
cjne a,55h,rrr
;call MUSIC0 ;相等即调用音乐程序mov r4,#0
rrr: ljmp MLoop ;不相等调用显示程序End
(2)附件
OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口
IN equ 08001h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲LEDBuf1 equ 50h ; 显示缓冲
Hour equ 40h
Minute equ 41h
Second equ 42h
C100us equ 43h
Hour1 equ 44h
Minute1 equ 45h
Second1 equ 46h
SPK equ P3.6 ;扬声器接P3.6口
Tick equ 10000
T100us equ 256-50
Num equ 70h
ljmp Start ;跳入主程序
org 000bh ;定时器中断0入口地址
jmp T0Int
org 001bh ;定时器中断1入口地址
T0Int:
push PSW
push ACC
mov a, C100us+1
jnz Goon
dec C100us
Goon:
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
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
reti
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
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
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
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 Exit1
Goon1:
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 Exit1
inc r2 ; r2 = r2+ 行值
djnz r1, Loopc
Exit1:
mov a, r2 ; 取出键码
mov dptr, #KeyTable
movc a, @a+dptr
WaitRelease:
mov dptr, #OUTBIT ; 等键释放
clr a
movx @dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
ToLED:
mov dptr, #LEDMap
movc a, @a+dptr
ret
isplayLED1:
mov r0, #LEDBuf1
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示DisplayLED1:
mov r0, #LEDBuf1
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示Loop1:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop1
ret
dsloop:
call jsloop
call sfm
ret
jsloop :
t1p: call TestKey ; 有键入?
jz t1p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t2p: call TestKey ; 有键入?
jz t2p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Hour1,a
t3p: call TestKey ; 有键入?
jz t3p ; 无键入, 继续显示
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t4p: call TestKey ; 有键入?
jz t4p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Minute1,a
t5p: call TestKey ; 有键入?
jz t5p
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t6p: call TestKey ; 有键入?
jz t6p ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Second1,a
ret
sfm:
mov a, Hour
mov b, #10
div ab
call ToLED
mov LEDBuf, a
;将小时分开两位来显示
mov a, b
call ToLED
orl a, #80h; (;)
mov LEDBuf+1, a
mov a, Minute
mov b, #10
div ab
call ToLED
;将分钟分开两位来显示
mov LEDBuf+2, a
mov a, b
call ToLED
orl a, #80h;()
mov LEDBuf+3, a
mov a, Second
mov b, #10
div ab
call ToLED
;将秒钟分开两位来显示
mov LEDBuf+4, a
mov a, b
call ToLED
mov LEDBuf+5, a
ret
jjloop :
t1: call TestKey ; 有键入?
jz t1 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t22: call TestKey ; 有键入?
jz t22 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Hour,a
t3: call TestKey ; 有键入?
jz t3 ; 无键入, 继续显示
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t4: call TestKey ; 有键入?
jz t4 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Minute,a
t5: call TestKey ; 有键入?
jz t5
call GetKey
anl a, #0fh ; 显示键码
mov b, #10
MUL ab
mov b,a
t6: call TestKey ; 有键入?
jz t6 ; 无键入, 继续显?
call GetKey
anl a, #0fh ; 显示键码
add a,b
mov Second,a
ret
xxloop: call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
anl a, #0fh ; 显示键码
cjne a,#77h, yyloop ;判断A键是否被按下
mov r4,#1
call jjloop
call bjloop
ret
yyloop:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
anl a, #0fh ; 显示键码
cjne a,#39h, MLoop;判断c键是否被按下
call dsloop
call bjloop
ret
Start: MOV SP,#50H
mov r4,#0
mov TMOD, #02h ;(02h)模式2, 定时器mov TH0, #T100us
mov TL0, #T100us
mov IE, #10000010b;EA=1, IT0 = 1, #10001010b
MOV TH1,#0D8H
MOV TL1,#0EFH
;MOV TMOD,#10H
mov Hour, #0;;#09 ;(#0)
mov Minute, #0
mov Second, #0
mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
setb TR0 ; 启动定时器0
MLoop:
Call sfm
call DisplayLED ;调用显示程序
call xxloop
bjloop:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz bjLoop ; 无键入, 继续显示
call GetKey ; 读入键码
anl a, #0fh ; 显示键码
call ToLED
cjne a,#7ch,bjloop;判断B键是否被按下
call sfm
zzloop:
mov a,#60
;对当前输入的时间和计时时间进行比较
cjne a,50h,rrr
mov a,61h
cjne a,51h,rrr
mov a,62h
cjne a,52h,rrr
mov a,63h
cjne a,53h,rrr
mov a,64h
cjne a,54h,rrr
mov a,65h
cjne a,55h,rrr
;call MUSIC0 ;相等即调用音乐程序
mov r4,#0
rrr: ljmp MLoop ;不相等调用显示程序end。