這是一個自己獨立完成的時鐘程序,已經測試成功,用數碼管來顯示.
HOUR EQU 030H MINUTE EQU 031H SECOND EQU 032H COUNT1 equ 033H;總計數到4000:拆分成40*100 COUNT2 equ 034H SPL EQU 020H;閃爍判斷的依據 SET_BTN EQU 021H; ORG 0000H AJMP MAIN ORG 001BH AJMP IT_1 ORG 040H MAIN: MOV SPL,#00H CLR SPL.0 CLR SPL.1 CLR SPL.2 MOV DPTR,#TABLE MOV HOUR,#00H MOV MINUTE,#00H MOV SECOND,#00H MOV COUNT1,#00H MOV COUNT2,#00H MOV TMOD,#20H MOV TH1,#06H MOV TL1,#06H MOV IE,#10001000B;設置允許中斷,并且打開兩個定時器 SETB TR1 LOOP: JNB P0.0,JUST_TIME JB SET_BTN.0,JUST_TIME JNB P0.1, SUBB_TIME JB SET_BTN.1,SUBB_TIME JNB P0.2, ADD_TIME JB SET_BTN.2,ADD_TIME TIME: ACALL HOUR_SHOW ACALL MINUTE_SHOW AJMP LOOP SUBB_TIME: JB SET_BTN.1,WAIT_BTN2_UP ACALL DELAY2; JB P0.1, TIME SETB SET_BTN.1 JB SPL.1,SUBB_HOUR JB SPL.2,SUBB_MIN AJMP TIME SUBB_MIN: MOV R1,MINUTE CJNE R1,#00H,SUBB_MIN_OPT AJMP TIME SUBB_MIN_OPT: DEC MINUTE AJMP TIME SUBB_HOUR: MOV R1,HOUR CJNE R1,#00H,SUBB_HOUR_OPT AJMP TIME SUBB_HOUR_OPT: DEC HOUR AJMP TIME WAIT_BTN2_UP: JNB P0.1,TIME CLR SET_BTN.1 AJMP TIME ADD_TIME: JB SET_BTN.2,WAIT_BTN3_UP ACALL DELAY2; JB P0.2, TIME SETB SET_BTN.2 JB SPL.1,ADD_HOUR JB SPL.2,ADD_MIN AJMP TIME ADD_MIN: MOV R1,MINUTE CJNE R1,#3BH,ADD_MIN_OPT AJMP TIME ADD_MIN_OPT: INC MINUTE AJMP TIME ADD_HOUR: MOV R1,HOUR CJNE R1,#17H,ADD_HOUR_OPT AJMP TIME ADD_HOUR_OPT: INC HOUR AJMP TIME WAIT_BTN3_UP: JNB P0.2,TIME CLR SET_BTN.2 AJMP TIME JUST_TIME: JB SET_BTN.0,WAIT_UP ACALL DELAY2;防抖 JB P0.0, TIME SETB SET_BTN.0 JB SPL.2, CLR_M JNB SPL.1, SET_H CLR SPL.1 SET_M: SETB SPL.2;分鐘位置 AJMP TIME SET_H: SETB SPL.1;小時位置 CLR_M: CLR SPL.2 AJMP TIME LJUMP_TIME:LJMP TIME WAIT_UP: JNB P0.0,LJUMP_TIME CLR SET_BTN.0 AJMP TIME WAIT2_DL1: ACALL DELAY1 ACALL DELAY1 RET HOUR_SHOW: JNB SPL.1, HOUR_SHOW_HRER JB SPL.0, HOUR_SHOW_HRER ACALL WAIT2_DL1 RET HOUR_SHOW_HRER: SETB P2.0 SETB P2.1 CLR A MOV A,HOUR MOV B,#0AH DIV AB MOVC A,@A+DPTR MOV P1,#00H MOV P1,A CLR P2.0 ;延時 ACALL DELAY1 SETB P2.0 MOV P1,#00H MOV A,B MOVC A,@A+DPTR MOV P1,A CLR P2.1 ;延時 ACALL DELAY1 SETB P2.1 MOV P1,#00H RET MINUTE_SHOW: JNB SPL.2, MINUTE_SHOW_HERE JB SPL.0, MINUTE_SHOW_HERE ACALL WAIT2_DL1 RET MINUTE_SHOW_HERE: SETB P2.2 SETB P2.3 CLR A MOV A,MINUTE MOV B,#0AH DIV AB MOVC A,@A+DPTR MOV P1,#00H MOV P1,A CLR P2.2 ;延時 ACALL DELAY1 SETB P2.2 MOV P1,#00H MOV A,B MOVC A,@A+DPTR MOV P1,A CLR P2.3 ;延時 ACALL DELAY1 SETB P2.3 MOV P1,#00H RET DELAY1: ;短延時 MOV R6,#03H DL1: MOV R7,08H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET DELAY2: ;按鍵延時 MOV R6,#0AH DL21: MOV R7,0AH DL22: DJNZ R7,DL22 DJNZ R6,DL21 RET IT_1: PUSH ACC PUSH B PUSH PSW INC COUNT1 MOV A,COUNT1 CJNE A,#28H,RETI_LABLE INC COUNT2 MOV COUNT1,#00H MOV A,COUNT2 MOV B,#32H DIV AB MOV A,B JNZ C2_OPT CPL P3.7;秒的閃爍 CPL SPL.0 ;INC SPL;給閃爍設置值 C2_OPT: MOV A,COUNT2 CJNE A,#64H,RETI_LABLE INC SECOND MOV COUNT2,#00H MOV A,SECOND CJNE A,#3CH,RETI_LABLE; INC MINUTE MOV SECOND,#00H MOV A,MINUTE CJNE A,#3CH,RETI_LABLE; INC HOUR MOV MINUTE,#00H MOV A,HOUR CJNE A,#18H,RETI_LABLE MOV HOUR,#00H RETI_LABLE: POP PSW POP B POP ACC RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H END