;**************************************************************** ; ; I/O practise with push buttons input and LED output ; ; Using AT89C2051 with 12MHz Osc Crystal ; ; All Port 3 pins are used for push button input ; ; All Port 1 pins are used for LED output, low active ; ;***************************************************************** ORG 00H ; set origin of memory MOV SP, #5FH ; set stack point, start at 60H MOV TMOD, #01H ; set timer 0 to 16 bit mode MOV P1, #0FFH ; turn off all LEDs ORL P3, #0FFH ; set P3 ready to read input START: MOV P1, #0FEH ; turn on LED at Port 1 LSB CALL WAIT500 ; delay for 0.5 second MOV P1, #0FFH ; turn off Port 1 LSB LED CALL WAIT500 ; delay for 0.5 second AJMP START WAIT500: MOV R0, #10 ; loop counter 10 to delay 10 x 50ms = 0.5s LOOP: MOV TH0, #HIGH (-49990) ; set high byte of timer 0 to delay 50ms MOV TL0, #LOW (-49990) ; set low byte of timer 0 to delay 50ms JB P3.0, PATTERN0 ; if button at P3.0 pressed JB P3.1, PATTERN1 ; if button at P3.1 pressed JB P3.2, PATTERN2 ; if button at P3.2 pressed JB P3.3, PATTERN3 ; if button at P3.3 pressed JB P3.4, PATTERN4 ; if button at P3.4 pressed JB P3.5, PATTERN5A ; if button at P3.5 pressed JB P3.7, PATTERN7A ; if button at P3.7 pressed CARRYON: CLR TF0 ; reset timer 0 overflow flag SETB TR0 ; start timer 0 JNB TF0, $ ; do nothing and wait for timer 0 overflow CLR TR0 ; stop timer 0 DJNZ R0, LOOP ; loop for 10 times RET WAIT20: MOV TH0, #HIGH (-20000) ; delay for 20ms MOV TL0, #LOW (-20000) CLR TF0 SETB TR0 JNB TF0, $ CLR TR0 RET PATTERN0: CALL WAIT20 ; wait for 20ms JNB P3.0, CARRYON ; if unpressed after 20ms, false alarm, carry on JB P3.0, $ ; wait indefinitely until button released LOOP0: MOV P1, #00H ; turn on all P1 LEDs CALL WAIT500 ; wait for 0.5 second MOV P1, #0FFH ; turn off all P1 LEDs CALL WAIT500 ; wait for 0.5 second SJMP LOOP0 ; always performing pattern 0 flashing PATTERN1: CALL WAIT20 ; wait for 20ms JNB P3.1, CARRYON ; if unpressed after 20ms, false alarm, carry on JB P3.1, $ ; wait indefinitely until button released LOOP1: MOV P1, #0FH CALL WAIT500 ; wait for 0.5 second MOV P1, #0F0H CALL WAIT500 ; wait for 0.5 second SJMP LOOP1 ; always performing pattern 0 flashing PATTERN5A: AJMP PATTERN5 ; stations for instruction jump to avoid out of range error PATTERN7A: AJMP PATTERN7 CARRYONA: AJMP CARRYON PATTERN2: CALL WAIT20 ; wait for 20ms JNB P3.2, CARRYON ; if unpressed after 20ms, false alarm, carry on JB P3.2, $ ; wait indefinitely until button released MOV A, #01H LOOP2: MOV P1, A CALL WAIT500 RL A SJMP LOOP2 PATTERN3: CALL WAIT20 ; wait for 20ms JNB P3.3, CARRYON ; if unpressed after 20ms, false alarm, carry on JB P3.3, $ ; wait indefinitely until button released MOV A, #10000000B LOOP3: MOV P1, A CALL WAIT500 RR A SJMP LOOP3 PATTERN4: CALL WAIT20 ; wait for 20ms JNB P3.4, CARRYON ; if unpressed after 20ms, false alarm, carry on JB P3.4, $ ; wait indefinitely until button released LOOP4: MOV P1, #11100111B CALL WAIT500 MOV P1, #11011011B CALL WAIT500 MOV P1, #10111101B CALL WAIT500 MOV P1, #01111110B CALL WAIT500 SJMP LOOP4 CARRYONB: AJMP CARRYON PATTERN5: CALL WAIT20 ; wait for 20ms JNB P3.5, CARRYONA ; if unpressed after 20ms, false alarm, carry on JB P3.5, $ ; wait indefinitely until button released LOOP5: MOV P1, #01111110B CALL WAIT20 CALL WAIT20 MOV P1, #00111100B CALL WAIT20 CALL WAIT20 MOV P1, #00011000B CALL WAIT20 CALL WAIT20 MOV P1, #00000000B CALL WAIT500 MOV P1, #0FFH CALL WAIT500 MOV P1, #11100111B CALL WAIT20 CALL WAIT20 MOV P1, #11000011B CALL WAIT20 CALL WAIT20 MOV P1, #10000001B CALL WAIT20 CALL WAIT20 MOV P1, #00000000B CALL WAIT500 MOV P1, #0FFH CALL WAIT500 SJMP LOOP5 PATTERN7: CALL WAIT20 ; wait for 20ms JNB P3.7, CARRYONB ; if unpressed after 20ms, false alarm, carry on JB P3.7, $ ; wait indefinitely until button released LOOP7: MOV P1, #00000000B CALL WAIT500 MOV P1, #10000000B CALL WAIT500 MOV P1, #11000000B CALL WAIT500 MOV P1, #11100000B CALL WAIT500 MOV P1, #11110000B CALL WAIT500 MOV P1, #11111000B CALL WAIT500 MOV P1, #11111100B CALL WAIT500 MOV P1, #11111110B CALL WAIT500 MOV P1, #11111111B CALL WAIT500 SJMP LOOP7 END