;--------------------------VARIABLES USED-----------------------------------------
LEFT_WORD EQU 1100B ; when written to port2,will turn robo to left.
RIGHT_WORD EQU 0011B ; when written to port2,will turn robo to right.
FWD_WORD EQU 1010B ; when written to port2,will move robo in forward direction.
REV_WORD EQU 0101B ; when written to port2,will move robo in reverse direction.
STOP_WORD EQU 1111B ; when written to port2,will stop the robo.
SPEED EQU R0 ; used to hold the speed of the robo;
DIRECT1 EQU 30H ; internal RAM location used for genrating PWM.
DIRECT2 EQU 31H ; internal RAM location used for genrating PWM.
TEMP EQU 117D ; used delay generation in PWM.
;---------------------------------------------------------------------------------------------
ORG 000H
SJMP RESET_VECTOR ;
; ------------------------EXTERNALINTERRUPT-------------------------------------
ORG 0003H
SJMP EXT_INT ;
;---------------------------------------------
ORG 032H
RESET_VECTOR: MOV IE, #10000001B ;enable external interrupt
CLR C ;
MOV SPEED, #0001H ; initialize speed with 1
SJMP FIND_SPEED ;
;----------------------------------------------------------------------------------
ORG 060H
EXT_INT: MOV A, P1 ; read port1 to accumulator
TEST_STOP: CJNE A, #11111111B, TEST_LEFT ;
SJMP STOP ;
TEST_LEFT: CJNE A, #11110111B, TEST_RIGHT ;
SJMP LEFT ;
TEST_RIGHT: CJNE A, #11111011B, TEST_REV ;
SJMP RIGHT ;
TEST_REV: CJNE A, #11111101B, TEST_FWD ;
SJMP REV ;
TEST_FWD: CJNE A, #11111110B, TEST_INCSPEED ;
SJMP FWD ;
TEST_INCSPEED: CJNE A, #11111100B, TEST_DECSPEED ;
SJMP INCSPEED ;
TEST_DECSPEED: CJNE A, #11110011B, TEST_STOP ;
SJMP DECSPEED ;
;----------------------------------------------------------------
STOP: MOV P2, #STOP_WORD ; stops the robo
SJMP PWM ;
LEFT: MOV P2, #LEFT_WORD ; turns robo to left
SJMP PWM ;
RIGHT: MOV P2, #RIGHT_WORD ; turns robo to right
SJMP PWM ;
REV: MOV P2, #REV_WORD ; moves robo in reverse direction
SJMP PWM ;
FWD: MOV P2, #FWD_WORD ; moves robo in forward direction
SJMP PWM ;
INCSPEED: INC SPEED ; increase the speed
SJMP FIND_SPEED ;
DECSPEED: DEC SPEED ; decrease the speed
SJMP FIND_SPEED ;
;------------------finds the speed -----------------------------------------------
FIND_SPEED:
CJNE SPEED, #4H, FAIL1 ;
SJMP SPEED4 ;
FAIL1: CJNE SPEED, #3D, FAIL2 ;
SJMP SPEED3 ;
FAIL2: CJNE SPEED, #2D, FAIL3 ;
SJMP SPEED2 ;
FAIL3: CJNE SPEED, #1D, FAIL4 ;
SJMP SPEED1 ;
FAIL4: CJNE SPEED, #0D, FAIL5 ;
MOV SPEED, #1D ;
SJMP FIND_SPEED ;
FAIL5: MOV SPEED, #4D ;
SJMP FIND_SPEED ;
;----------- turns on LEDs to indicate the speed and loads registers with delay -------------
SPEED4: MOV P0, #11110111B ;
SJMP $ ;
SPEED3: MOV DIRECT1, #255D ;
MOV DIRECT2, #2D ;
MOV P0, #1011B ;
SJMP PWM ;
SPEED2: MOV DIRECT1, #130D ;
MOV DIRECT2, #127D ;
MOV P0, #1101B ;
SJMP PWM ;
SPEED1: MOV DIRECT1, #5D ;
MOV DIRECT2, #252D ;
MOV P0, #1110B ;
SJMP PWM ;
;----------------generates PWM on pin P3.0---------------------------------------------------
PWM:
MOV R1, DIRECT1 ;
MOV R2, DIRECT2 ;
CPL P3.0 ;
LOOP1: DJNZ R1, LOOP1 ;
MOV R1, #TEMP ;
LOOP2: DJNZ R1, LOOP2 ;
CPL P3.0 ;
LOOP3: DJNZ R2, LOOP3 ;
MOV R2, #TEMP ;
LOOP4: DJNZ R2, LOOP4 ;
SJMP PWM ;
END
;----------------end of the code--------------------------------------------