OUTBIT equ 8001h ; 位控制口
OUTSEG equ 8000h ; 段控制口
IN equ 8002h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲
Hour equ 40h ; 时分秒数据缓冲地址
Minute equ 41h
Second equ 42h
C100us equ 43h
Close equ 50h ;省电功能标志位
alarm equ 51h
keyhms equ 52h ;按键时分秒标志位
Tick equ 100 ;软件计数器
T100us equ 3192 ;方式0定时10ms
org 0000h
ljmp Start
org 000bh ;定时器t0入口
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 ;秒操作
jnb P1.0,alarm1
inc alarm
mov a,alarm
cjne a,#1,alarm1
clr P1.0
alarm1: mov a, Second
cjne a, #60, Exit
mov Second, #0 ;分操作
inc Minute
mov a, Minute
cjne a, #60, Exit
mov Minute, #0
setb P1.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 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h ;led共阳码表
db 80h,90h,88h,83h,0c6h,0a1h,86h,8eh
DisplayLED: ;显示子程序
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00000001b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #00h
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 ; 显示下一位
rl a
mov r2, a
inc r0
djnz r1, Loop
ret
; ============取数码管显示码表子程序=========
ToLED:
mov dptr, #LEDMap
movc a, @a+dptr
ret
;================================================
;================键盘keycan======================
Testkey: ;判断是否有键按下
mov dptr,#OUTBIT
mov a,#00h
movx @dptr,a
mov dptr,#IN
movx a,@dptr
anl a,#01h
ret
GetKey: mov dptr,#OUTBIT ;找出按下的按键开关
mov P2,dph
mov r0,#Low(IN)
mov r1,#00100000b
mov r2,#06h ;共6列
KLoop:
mov a,r1 ;找出健所在的列
cpl a
movx @dptr,a
cpl a
rr a
mov r1,a
movx a,@r0
cpl a
anl a,#01h
jnz Goon0
djnz r2,KLoop
mov r2,#0ffh
Goon0: ;按键处理程序
mov a,r2
cjne a,#6,Goon1
sjmp key5
Goon1: cjne a,#5,Goon2
sjmp key4
Goon2: cjne a,#4,Goon3
sjmp key3
Goon3: cjne a,#3,Goon4
sjmp key2
Goon4: cjne a,#2,Goon5
sjmp key1
Goon5: cjne a,#1,Goon6
sjmp key0
Goon6: sjmp WaitRelease
key0: CPL TR0 ;启动,停止
sjmp WaitRelease
key1:
mov a,keyhms
jz k3
mov a,Close
jnz openled ;判断省电模式标志位是否为1
mov Close,#1
sjmp k3
openled:mov Close,#0
k3: sjmp WaitRelease
;mov dptr, #OUTBIT
;mov a, #0Dfh
;movx @dptr, a ; 关所有八段管
key2: mov a,keyhms
jz WaitRelease
mov Hour, #0 ;清零
mov Minute, #0
mov Second, #0
sjmp WaitRelease
key3: clr P1.0
mov a,keyhms
jz WaitRelease
inc Second ;设置秒
mov a,Second
cjne a,#60,WaitRelease
mov Second,#0
sjmp WaitRelease
key4:
mov a,keyhms
jz WaitRelease
inc Minute ;设置分
mov a,Minute
cjne a,#60,WaitRelease
mov Minute,#0
sjmp WaitRelease
key5: mov a,keyhms
jz WaitRelease
inc Hour ;设置时
mov a,Hour
cjne a,#24,WaitRelease
mov Hour,#0
sjmp WaitRelease
WaitRelease: ;等待键的释放
mov dptr,#OUTBIT
mov a,#00h
movx @dptr,a
mov r6,#10
acall Delay
acall TestKey
jz WaitRelease
ret
Start:
mov Close,#01h
mov keyhms,#01h
clr p1.0
mov a,#89h
mov dptr,#8003h
movx @dptr,a
mov TMOD, #00h ; 放方式0, 定时器
mov tl1,#0ch ;定时10ms
mov th1,#78h
mov IE, #10000010b ; EA=1, IT0 = 1
OUTSEG equ 8000h ; 段控制口
IN equ 8002h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲
Hour equ 40h ; 时分秒数据缓冲地址
Minute equ 41h
Second equ 42h
C100us equ 43h
Close equ 50h ;省电功能标志位
alarm equ 51h
keyhms equ 52h ;按键时分秒标志位
Tick equ 100 ;软件计数器
T100us equ 3192 ;方式0定时10ms
org 0000h
ljmp Start
org 000bh ;定时器t0入口
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 ;秒操作
jnb P1.0,alarm1
inc alarm
mov a,alarm
cjne a,#1,alarm1
clr P1.0
alarm1: mov a, Second
cjne a, #60, Exit
mov Second, #0 ;分操作
inc Minute
mov a, Minute
cjne a, #60, Exit
mov Minute, #0
setb P1.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 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h ;led共阳码表
db 80h,90h,88h,83h,0c6h,0a1h,86h,8eh
DisplayLED: ;显示子程序
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00000001b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #00h
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 ; 显示下一位
rl a
mov r2, a
inc r0
djnz r1, Loop
ret
; ============取数码管显示码表子程序=========
ToLED:
mov dptr, #LEDMap
movc a, @a+dptr
ret
;================================================
;================键盘keycan======================
Testkey: ;判断是否有键按下
mov dptr,#OUTBIT
mov a,#00h
movx @dptr,a
mov dptr,#IN
movx a,@dptr
anl a,#01h
ret
GetKey: mov dptr,#OUTBIT ;找出按下的按键开关
mov P2,dph
mov r0,#Low(IN)
mov r1,#00100000b
mov r2,#06h ;共6列
KLoop:
mov a,r1 ;找出健所在的列
cpl a
movx @dptr,a
cpl a
rr a
mov r1,a
movx a,@r0
cpl a
anl a,#01h
jnz Goon0
djnz r2,KLoop
mov r2,#0ffh
Goon0: ;按键处理程序
mov a,r2
cjne a,#6,Goon1
sjmp key5
Goon1: cjne a,#5,Goon2
sjmp key4
Goon2: cjne a,#4,Goon3
sjmp key3
Goon3: cjne a,#3,Goon4
sjmp key2
Goon4: cjne a,#2,Goon5
sjmp key1
Goon5: cjne a,#1,Goon6
sjmp key0
Goon6: sjmp WaitRelease
key0: CPL TR0 ;启动,停止
sjmp WaitRelease
key1:
mov a,keyhms
jz k3
mov a,Close
jnz openled ;判断省电模式标志位是否为1
mov Close,#1
sjmp k3
openled:mov Close,#0
k3: sjmp WaitRelease
;mov dptr, #OUTBIT
;mov a, #0Dfh
;movx @dptr, a ; 关所有八段管
key2: mov a,keyhms
jz WaitRelease
mov Hour, #0 ;清零
mov Minute, #0
mov Second, #0
sjmp WaitRelease
key3: clr P1.0
mov a,keyhms
jz WaitRelease
inc Second ;设置秒
mov a,Second
cjne a,#60,WaitRelease
mov Second,#0
sjmp WaitRelease
key4:
mov a,keyhms
jz WaitRelease
inc Minute ;设置分
mov a,Minute
cjne a,#60,WaitRelease
mov Minute,#0
sjmp WaitRelease
key5: mov a,keyhms
jz WaitRelease
inc Hour ;设置时
mov a,Hour
cjne a,#24,WaitRelease
mov Hour,#0
sjmp WaitRelease
WaitRelease: ;等待键的释放
mov dptr,#OUTBIT
mov a,#00h
movx @dptr,a
mov r6,#10
acall Delay
acall TestKey
jz WaitRelease
ret
Start:
mov Close,#01h
mov keyhms,#01h
clr p1.0
mov a,#89h
mov dptr,#8003h
movx @dptr,a
mov TMOD, #00h ; 放方式0, 定时器
mov tl1,#0ch ;定时10ms
mov th1,#78h
mov IE, #10000010b ; EA=1, IT0 = 1