数字电子钟设计说明书 - 图文 下载本文

LCALL DELAY SETB P2.2 MOVC

;调延时

;时个位送累加器

;取时个位段码

;时个位段码送P0口

;显示“-”

MOV A, 5BH MOV P0, A CLR P2.6

LCALL DELAY

A, @A+DPTR

;复位P2.0

;调延时

SETB P2.6 ;显示时个位

MOV DPTR, #TABLE1 ;该位使用TABLE1以消除时的十位置0 MOV A,

5AH

;时十位

;取时十位段码 ;时十位段码送P0口 ;复位P2.0

;调延时 ;子程序返回

MOVC A, @A+DPTR MOV P0, A CLR P2.7 SETB P2.7 RET

;----------------- ;定时器中断1s程序 ;-----------------

TIMET0:PUSH ACC ;保护现场 PUSH PSW

;保护现场

;重新装载定时初值TH0 ;重新装载定时初值TL0 ;调时闪烁值加1

MOV TH0, #3CH MOV TL0, #0B0H INC

54H

LCALL DELAY

;显示时十位

CPL 47H ;产生脉冲用于调时快进 MOV A, 54H

;读调时闪烁值

CJNE A, #10,ADD_TIME ;产生0.5秒,用于调时闪烁 CPL 48H ;取反调时闪烁标志位 MOV 54H, #00H MOV A, 50H

CJNE A, #10,ZDBACD SETB P3.1

;关蜂鸣器

35

;清零调时闪烁值

ADD_TIME: INC 50H

;整点报时时蜂鸣器响延迟时间

ZDBACD:CJNE A, #20,RETI1 ;产生1秒时钟

MOV 50H, #00H ;一秒钟时间到,清零50H MOV A, 51H ADD DA

A, #01H A

A

#60H,RETI1 52H #01H

;十进制调整

A #60H,RETI1

;开蜂鸣器 ;清零时寄存器 ;十进制调整

#00H ;一小时到,开蜂鸣器,清分显示 53H A

#24H,RETI1 ;判断是否满24小时 #00H ;到24点,清零小时

;恢复现场

;恢复现场 ;中断返回

;清零分寄存器

;十进制调整

;清零秒寄存器

MOV 51H, CJNE A, MOV A, ADD A, DA A CJNE A,

MOV 52H, CLR P3.1 MOV 52H, MOV A, ADD

A,

DA A CJNE A, RETI1:POP

MOV 51H, #00H ;一分钟到

#01H

MOV 53H, MOV 53H,

PSW

POP ACC RETI ;------------- ;键盘扫描程序

;R4设置为00H是为了在进入长按处理前加长延时,以区分长按与短按键 ;-------------

KEY_SCAN:CLR MOV MOV CPL ANL JZ

P1, A, A

A, #07H ;只判断P1口的前3位 EXIT_KEY

36

46H ;关闭调时快进标志

#0FFH ;将P1口设置成输入状态 P1

LCALL DELAY ;延时去抖动

MOV CPL ANL JZ MOV MOV MOV CPL ANL JB INC LJMP MOV SETB

A, A A, R5, R4, A, A A, 47H,

P1 ;重新判断

;取P1口各按键状态

;保留低七位按键值

#07H A

#00H ;用于控制调时快进速度 P1

;取P1口各按键状态 ;取反各按键状态

;保留低七位按键值

EXIT_KEY

LOOP:LCALL DISPLAY ;进入长按处理

#07H LOOP1

R4 LOOP3

;调时快进间隔时间基准加1

LOOP1:CJNE R1, LOOP2:CJNE R4,

46H

#03H,LOOP2 ;如果调秒时长按,则不处理

#99H,LOOP3

R4, #70H ;确认长按后,加快调时快进速度

;调加功能子程序

;调减功能子程序 ;等待键释放 ;子程序返回

;子程序返回

LCALL ADD_KEY LCALL DEC_KEY

LOOP3:JNZ LOOP MOV A, R5 RET

EXIT_KEY:RET ;------------ ;延时子程序 ;------------

;输出键值

DELAY:MOV R7, #200 DJNZ R7, $ RET

DELAY1:MOV R3, #50 MOV TMOD, #00H MOV TH1, #63H MOV TL1, #18H SETB

;置延时初值 ;延时400us ;置定时循环初值

;设定定时器1为工作方式0 ;装载定时初值TH1

;子程序返回

;装载定时初值TL1

37

TR1 ;开定时器1

LP1:JBC TF1, LP2 SJMP LP1 LP2:MOV

TH1, #63H

;查询定时溢出 ;重新装载定时初值TH1 ;重新装载定时初值TL1

;继续查询溢出

MOV TL1, #18H DJNZ R3, LP1 RET

;----------------- ;选择键处理子程序 ;-----------------

SET_KEY:CJNE R5, INC CJNE MOV RET

R1, R1,

;循环定时50次 ;子程序返回

#01H,EXIT ;选择键键值

;调整选择功能标志加一

R1

#4,EXIT #0

MOV 54H, #00H

;---------- ;加1子程序 ;----------

ADD_KEY:CJNE CJNE MOV ADD DA MOV CJNE MOV MOV ADD DA MOV CJNE MOV

R1, A, A, A 53H, A, 53H, A, A,

52H, A, 52H,

R5,

;调时闪烁清零

;子程序返回

#02H,EXIT ;加1键值

;选择键功能标志为1调时,否则跳出

;时值送累加器 ;时值加1 ;十进制调整

;加1后的值再送回时值存储单元 ;时值不等于

#01H,NEXT1 53H #01H

A #00H 52H #01H A

#60H,EXIT #00H

#24H,EXIT

NEXT1:CJNE R1, #02H,NEXT2 ;选择键功能标志为2调分,否则跳出

A ;十进制调整

NEXT2:CJNE R1,

#03H,EXIT ;选择键功能标志为3调秒,否则跳出

38