设计任务:
1. 屏幕保护的检查(P.从右至左流动)
2. 按下A键显示8个P.,然后开始运行
3. 时分秒、年月日之间用“-”分割,并闪烁
4. 运行时按下A进入调整时钟状态,再按一次恢复运行
5. 在运行状态下,按下BCD分别显示三种功能,可切换观看,按A键返回运行
6. 在各调整状态下,按B调秒(日),C调分(月),D调时(年),短时间按下只加一次,长时间按下不停歇的加数,调整完毕后按A键返回运行状态。
7. 定时功能:在运行时按下B显示定时,再按B进入调整状态,设置完成按A返回。
8. 当“时”小于10时,高位不显示,即高位“清零”。
9. 秒表功能:在运行时按下C键,进入秒表功能,奇数次C开启秒表,偶数次C关闭,按A键返回。
10. 在运行时按下D键显示日期,再按D键静茹调整状态,按A键返回。
ORG OOOOH
START: AJMP MAIN
ORG OOOBH
AJMP PITO
;==============/////主程序///=====================---=========
ORG 0030H
MAIN: MOV SP, #60H ;设置堆栈起始地址
MOV R0, #30H
MOV R7, #08H
WAIT: MOV @R0, #0AH ;缓存全置P.
INC R0
DJNZ R7, WAIT
;————————屏保程序————————————
MOV P2, #0CH ;显示P
MOV R4, #80H
WAITO: MOV A, R4
MOV P0, A
RR A
MOV R4, A
MOV R7, #250 ;延时
WAIT1: LCALL DELY
LCALL KEY
JB 20H.O, WAIT2 ;按下A键进入时钟运行
DJNZ R7, WAIT1
AJMP WAITO
;————————————————————
WAIT2: CLR 20H.0
MOV 30H, #00H ;缓存清零
MOV 31H, #00H
MOV 32H, #0BH
MOV 33H, #00H
MOV 34H, #00H
MOV 35H, #0BH
MOV 36H. #00H
MOV 37H. #00H
;————————————————————
MOV 50H, #06H ;初始日期
MOV 51H, #00H
MOV 52H, #0BH
MOV 53H, #02H
MOV 54H, #0lH
MOV 55H, #OBH
MOV 56H, #09H
MOV 57H, #00H
——————————————————————
MOV 38H, #00H ;初始定时
MOV 39H, #00H
MOV 3AH, #0BH
MOV 3BH, #00H
MOV 3CH, #00H
MOV 3DH, #0BH
MOV 3EH, #07H
MOV 3FH, #00H
;——————————————————————————
MOV 58H, #00H ;缓存清零
MOV 59H, #00H
MOV 5AH, #0BH
MOV 5BH, #00H
MOV 5CH, #0BH
MOV 5DH, #0BH
MOV 5EH, #00H
MOV 5FH, #00H
;——————————————————————————
MOV TMOD, #0lH ;设置定时中断
MOV TLO, #ODCH
MOV THO, #3FH
MOV IE, #82H
SETB TRO
MOV 40H, #10H ;用6MHz,循环次数为8,用12MHz循环16次
;=============///闪烁程序////===========================================
WAIT3 : MOV R7, #50
WAIT4 : LCALL DISP
LCALL DINGSHI ;调用显示,键扫,定时子程序
LCALL KEY
JB 20H. 0, TOA ;运行时闪烁,等待中断或功能键按下
JB 20H. 1, TOB
JB 20H. 2, TOC
JB 20H. 3, TOD
LCALL DELY
DJNZ R7, WAIT4
MOV 32H, #OCH ;各级单位之间闪烁
MOV 35H, #OCH
MOV R7 #50
WAIT5 : LCALL DISP
LCALL DINGSHI
LCALL KEY
JB 20H.0, TOA ;运行时闪烁,等待中断或功能键按下
JB 20H.1, TOB
JB 20H.2, TOC
JB 20H.3, TOD
LCALL DELY
DJNZ R7, WAIT5
MOV 32H, #OBH
MOV 35H, #OBH
SJMP WAIT3
TOA: JBC 0F0H, WAIT6 ;确保A键按下显示时间时分秒
JBC 0F1H, WAIT6
JBC 0F2H, WAIT6 ;判断清零并转移
LJMP ANKEYO
WAIT6: CLR 0F4H
CLR 0F3H
CLR 0F5H
LJMP WAIT3
TOB: CLR 0F0H ;清除其他标志位
CLR 0F1H
JB 0F2H. TOBl
SETB 0F2H ;作为标志位使用
MOV 20H, #00H
AJMP WAIT3
TOBl: SETB 0F4H
AJMP ANKEY ;跳到键功能子程序
TOC : CLR OFOH
CLR OF2H
JB OF1H, TOCl ;OF2,0F4-B键定时38H-3FH
SETB OFIH ;OF1,0F3-C键秒表58H-5FH
MOV 20H, #OOH
AJMP WAIT3 ;OFO,OF5-D键日期50H-57H
TOC1 : SETB OF3H
LCALL MIAOBIAO
CLR OF1H
CLR OF3H
LJMP WAIT3
TOD : CLR OFIH
CLR OF2H
JB OFOH, TOD1
SETB OFOH
MOV 20H #OOH
AJMP WAIT3
TOD1 : SETB OF5H
LJMP ANKEY
;=====///中断服务程序///======== -
ORG 0300H
PITO: PUSH PSW ;中断保护现场
PUSH ACC
SETB PSW.3
MOV TLO, #ODCH ;重置定时器数
MOV THO, #0FH
MOV A, 40H
DEC A
MOV 40H, A
JNZ RETO
MOV 40H, #10H
MOV A, 37H ;中断高位清零程序
XRL A #OCH
JNZ PITl
PIT1: MOV RO #31H ;加1程序
ACALL DAAD1
MOV A, R2
XRL A, #60H
JNZ RETO ;满60清零,不满返回。
ACALL CLRO
MOV RO, #34H
ACALL DAADl
MOV A, R2
XRL A, #60H
JNZ RETO
ACALL CLRO
MOV RO #37H
ACALL DAADl
MOV A, R2
XRL A, #24H
JNZ RETO
ACALL CLRO
LCALL DATE ;满24小时则日加1
RETO : MOV A, 37H ;中断高位清零程序
JNZ RETl
MOV 37H, #OCH
RETl: POP ACC
POP PSW
RETl
DAADl: MOV A @RO ;加1子程序
DEC RO
SWAP A
ORL A, @RO
ADD A, #OlH
DA A
MOV R2, A
ANL A, #OFH
MOV @RO, A
MOV A, R2
INC RO
ANL A, #OFOH
SWAP A
MOV @RO, A
RET
CLRO : CLR A ;高位清零
MOV @RO, A
DEC RO
MOV @RO, A
RET
;=======///显示字程序///===================================
ORG 0400H
DISP: PUSH ACC
PUSH PSW
SETB RS1
MOV RO, #50H
JB OFOH, LD2 ;判断显示哪种状态
MOV RO, #58H
JB OF1H, LD2
MOV RO, #38H
JB OF2H, LD2
MOV RO, #30H
LD2 : MOV R3, #80H
MOV A , R3
LD0 : MOV 80H, A ;高128单元只能直接寻址
MOV A, @RO
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV OAOH, A ;高128单元只能直接寻址
ACALL DL
INC RO
MOV A, R3
JB ACC.O, LD1 ;是否显示到最高位
RR A
MOV R3, A
AJMP LDO
LDl: POP PSW
POP ACC
RET
DL: MOV R2 #7DH ;延时程序
LOOP: NDP
NDP
DJNZ R2, LOOP
RET
TABLE: DB OCOH., OF9H,OA4H,OBOH,99H,92H,82H,OF8H, 80H,90H
DB OCH,0BFH,OFFH,OOH
;=============///键盘功能子程序///============
ORG 0500H
ANKEYO :PUSH IE ;
PUSH TLO
PUSH THO
MOV IE, #OOH
MOV 20H, #OOH
ANKEY : LCALL DISP ;判断要进入的键功能
JNB Pl.1, TOKEYB
JNB Pl.2, TOKEYC
JNB Pl.3, TOKEYD
LCALL DISP
LCALL KEY
JB 20H.0, KEYA
LJMP ANKEY
TOKEYB: CLR P1.1 ;跳到B键
LJMP KEYB
TOKEYC: CLR Pl.2
LJMP KEYC
TOKEYD: CLR P1.3
LJMP KEYD
KEYA : MOV 20H #OOH ;A键返回
POP THO
POP TLO
POP IE
MOV IE, #82H
LJMP WAIT3
KEYB: LCALL DISP ;是否跳到其他键
JNB P1.O, KEYB2
JNB Pl.2, KEYC
JNB PI.3, GOKEYD
MOV Pl, #OFFH ;恢复Pl口高电平
MOV R7, #60
PPPP1 : LCALL DISP
DJNZ R7, PPPP1
MOV RO, #51H ;日期
JB OF5H, LD3 ;判断显示哪种状态
MOV RO, #39H ;定时
JB OF4H, LD3
MOV RO, #31H
LD3 : LCALL DAADl ;根据不同的标志位
MOV A, R2 ;加不同的值
JB OF5H, LD4
XRL A, #60H
AJMP LD5
LD4: XRL A, #31H
JNZ KEYBl
MOV 51H, #OOH
MOV 50H, #OlH
AJMP KEYBl
LD5: JNZ KEYBl
LCALL CLRO
KEYB1 : AJMP KEYB ;A不按下则不返回
GOKEYD: LJMP KEYD
KEYB2: JB OF4H, KEYB3
JB OF5H, KEYB3
LJMP ANKEY
KEYB3 : LJMP WAIT3 ;A按下则返回
KEYC : LCALL DISP
JNB Pl.O, KEYC2
JNB P1.1, KEYB
JNB P1.3, KEYD
JB PI.2, KEYC
MOV Pl, #OFFH
MOV R7, #60
PPPP2: LCALL DISP
DJNZ R7, PPPP2
MOV RO, #54H ;日期
JB OF5H, LD6 ;判断显示哪种状态
MOV RO, #3CH ;定时
JB OF4H, LD6
MOV RO, #34H
LD6: LCALL DAADl
MOV A, R2
JB OF5H, LDD7
XRL A, #60H
AJMP LD8
LDD7 : XRL A, #13H
JNZ KEYCl
MOV 54H, #OOH
MOV 53H, #OlH
AJMP KEYCl
LD8 : JNZ KEYCl :满60/12清零,不满返回
LCALL CLRO
KEYC1 : AJMP KEYC
KEYC2: JB OF4H, KEYC3
JB OF5H, KEYC3
LJMP ANKEY
KEYC3: LJMP WAIT3
KEYO : LCALL DISP
MOV A, 37H ;按键高位清零程序
XRL A, #OCH
JNZ PPPP4
MOV 37H, #00H
PPPP4 : JNB P1.O, KEY02
JNB P1.1, GOKEYB
JNB P1.2, KEYC
JB P1.3, KEYO
MOV Pl, #OFFH
MOV R7, #60
PPPP3 : LCALL DISP
DJNZ R7, PPPP3
MOV RO, #57H ;日期
JB OF5H, L09 ;判断显示哪种状态
MOV RO, #3FH ;定时
JB OF4H, LD9
MOV RO, #37H
LD9: LCALL DAAD1
MOV A, R2
JB OF5H, LDDO
JB OF4H, LDD2
XRL A, #24H
AJMP LOO1
LDDO : XRL A, #99H
LDD2: XRL A, #25H ;关闭定时功能的关键
LDDl: JNZ KEYDl ;满24 /99/25清零,不满返回。
LCALL CLRO
KEYD1 : AJMP KEYD
GOKEYB: LJMP KEYB
KEYD2 : JB OF4H, KEYD3
JB OF5H, KEYD3
KEYD3 : LJMP WAIT3
============///按键判断子程序////==============
ORG 0700H
KEY : MOV P1, #OFFH
MOV A, P1
CPL A
ANL A, #OFH
JZ RETX ;等零返回
LCALL DISP ;延时12ms
LCALL DISP
MOV A, Pl
CPL A
ANL A #OFH
JZ RETX ;判断是否有按键
MOV 20H, A
LOOP1: LCALL DISP
MOV 20H, A ;等待键松
MOV A, Pl
CPL A
ANL A, #OFH
JNZ LOOPl
RETX: RET
;==========///延时子程序///===============
DELY: MOV R6, #03 ;延时3ms程序
LOOP3:MOV R5, #250
LOOP4 : NOP
NOP
DJNZ R5, LOOP4
DJNZ R6, LOOP3
RET
;===========///日期程序 ///================
ORG 0800H
DATE: MOV RO, #51H
LCALL DAADl ;加1子程序
MOV A, R2
XRL A, #31H
JNZ BACK ;满30清零,不满返回。
LCALL DAADl
MOV A, R2
XRL A, #13H
JNZ BACK
LCALL CLRO
MOV R0, #57H
LCALL DAADl
MOV A, R2
XRL A, #99H
JNZ BACK
LCALL CLRO
BACK : RET
;==============////秒表功能///============
ORG 0900H
MIAOBIAO:CLR 20H.2 ;调显示和延时程序
LCALL DISP
LCALL DELY
LCALL DELY
MOV RO, #59H
LCALL DAADl
MOV A, R2
XRL A, #99H
JNZ RETM ;满99清零,不满返回。
LCALL CLRO
MOV RO, #5CH
LCALL DAADl
MOV A, R2
XRL A, #60H
JNZ RETM
LCALL CLRO
MOV RO, #5FH
LCALL DAADl
MOV A, R2
XRL A, #60H
JNZ RETM
LCALL CLRO
RETM: LCALL KEY
JB 20H.0, TOBACK ;A键若按下则返回
JB 20H.2, PAUSE
LJMP MIAOBIAO
PAUSE: CLR 20H.2 MIAOBIAO
JB 20H.0, TOBACK
AJMP PAUSE
TOBACK : MOV 20H, #OOH
RET
;==============///定时功能///============
DINGSHI: LCALL DISP ;在子程序中慎用堆栈
MOV R2, #08H
MOV RO, #37H
MOV Rl, #3FH
MOV A, 37H ;
XRL A, #OCH
JNZ DING
MOV R2, #07H
MOV R0, #36H
MOV R1, #3EH
DING: MOV A, @RO
XRL A, @Rl
JNZ RETD
DEC RO
DEC Rl
DJNZ R2 DING
CLR P3.0 ;接其他口对程序有影响
MOV R3. #100
DINGl: MOV R4. #200
ING2 : LCALL DISP
LCALL DELY
LCALL KEY
JB 20H.0, RETD ;按下A键返回
DJNZ R4. DING2
DJNZ R3. DINGl
RETD: MOV 20H #OOH
SETB P3.0
RET
;==========================================================
END
;============///程序结束///================================
一周热门 更多>