; SIMPLE MULTITASKING PROGRAM $MOD51 $NOPRINT $INCLUDE(MYPAULM2.EQU) LED equ P1.7 CR EQU 13 DSEG AT 20H FLAG1: DS 1 TICK: DS 1 SEC: DS 1 MIN: DS 1 HOUR: DS 1 TIMER1: DS 1 TIMER2: DS 1 TIMER3: DS 1 TIMER4: DS 1 COMMAND: DS 1 CSEG AT 8000H jmp main ORG 8100H ; 10ms tick ; ____|____|____|____|____ ; WAIT_TICK: JNB TF0,$ CLR TF0 ORL TH0,#0DCH INC TICK RET UPDATE_CLOCK: MOV A,TICK CJNE A,#100,EXIT_CLOCK MOV TICK,#0 SETB FLAG1.0 ; flag that signals print time function SETB FLAG1.1 ; for tick led MOV A,SEC ADD A,#1 DA A MOV SEC,A CJNE A,#60H,EXIT_CLOCK MOV SEC,#0 MOV A,MIN ADD A,#1 DA A MOV MIN,A CJNE A,#60H,EXIT_CLOCK MOV MIN,#0 MOV A,HOUR ADD A,#1 DA A MOV HOUR,A CJNE A,#24H,EXIT_CLOCK MOV HOUR,#0 EXIT_CLOCK: RET ; MAKE LED ON EVERY ONE SECOND ; ------______------------------------------______----------------- ; |50ms| ; |-------------------- 1000ms -------| ; TICK_LED: JNB FLAG1.1,EXIT1 CLR LED INC TIMER1 MOV A,TIMER1 CJNE A,#5,EXIT1 SETB LED CLR FLAG1.1 MOV TIMER1,#0 EXIT1: RET ; check serial port every 10ms ; exit: COMMAND == -1 NO CHARACTER ; COMMAND != -1 ASCII CODE GETCHAR: JNB RI,EXIT2 CLR RI MOV A,SBUF MOV COMMAND,A RET EXIT2: MOV COMMAND,#-1 RET ; PRINT TIME TO TERMINAL EVERY SECOND PRINT_TIME: JNB FLAG1.0,EXIT_PRINT_TIME CLR FLAG1.0 PRINT_TIME1: MOV A,#CR CALL COUT MOV A,HOUR CALL PHEX MOV A,#':' CALL COUT MOV A,MIN CALL PHEX MOV A,#':' CALL COUT MOV A,SEC CALL PHEX EXIT_PRINT_TIME: RET HOUR_KEY: MOV A,COMMAND CJNE A,#'h',EXIT_HOUR_KEY MOV A,HOUR ADD A,#1 DA A MOV HOUR,A CJNE A,#24H,SKIP_CLEAR_HOUR MOV HOUR,#0 SKIP_CLEAR_HOUR: CALL PRINT_TIME1 EXIT_HOUR_KEY: RET MIN_KEY: MOV A,COMMAND CJNE A,#'m',EXIT_MIN_KEY MOV A,MIN ADD A,#1 DA A MOV MIN,A CJNE A,#60H,SKIP_CLEAR_MIN MOV MIN,#0 SKIP_CLEAR_MIN: CALL PRINT_TIME1 EXIT_MIN_KEY: RET ;*************************** MAIN *************************** main: ORL TMOD,#1 SETB TR0 MOV SEC,#0 MOV MIN,#55H MOV HOUR,#17H MOV TICK,#0 CALL NEWLINE ; main 10ms loop LOOP: CALL WAIT_TICK ; following tasks will be executed every 10ms CALL TICK_LED CALL UPDATE_CLOCK CALL GETCHAR CALL PRINT_TIME CALL HOUR_KEY CALL MIN_KEY JMP LOOP END