Code:
;------------------------------------------------------------------------------------
;
;                         PIC 16F84A/04
;                       _______  _______
;                      |       \/       |
;    Pulsador 1__RA2 --+ 1 >>     << 18 +-- RA1__Sensores Derecha    
;                      |                |
;    Pulsador 2__RA3 --+ 2 >>     << 17 +-- RA0__Sensores Izquierda
;                      |                |
;  * Pulsador 3__RA4 --+ 3 >>     << 16 +-- OSC1
;                      |                |
;              /MCLR --+ 4 >>        15 +-- OSC2
;                      |                |
;                Vss --+ 5 >>     << 14 +-- Vdd
;                      |                |
;          * NC__RB0 --+ 6        >> 13 +-- RB7__Motor Drcho.2
;                      |                |
;         LED 1__RB1 --+ 7 <<     >> 12 +-- RB6__Motor Drcho.1
;                      |                |
;         LED 2__RB2 --+ 8 <<     >> 11 +-- RB5__Motor Izdo.2
;                      |                |
;         LED 3__RB3 --+ 9 <<     >> 10 +-- RB4__Motor Izdo.1
;                      |                |
;                      +----------------+
;
;  * Se ha cambiado la conexión el la placa del pulsador 3 de RB0 por RA4 para simplificar !!!
;
;------------------------------------------------------------------------------------
;
; Funcionamiento de los motores (visto desde atrás):
;
; +-------------+----------|----------|--------|-----------|----------+                       
; |   MOTOR ->  |Izquierdo |          |        |  Derecho  |          |
; +-------------+----------+ Función  +--------+-----------+ Función  |
; |  Puerto ->  | RB4  RB5 |          |        | RB6   RB7 |          |
; +-------------+----------+----------+--------+-----------+----------+              
; |             |  0    1  |  Atrás   |        |  0    1   |  Atrás   | 
; +-------------+----------+----------+--------+-----------+----------+             
; |             |  1    0  | Adelante |        |  1    0   | Adelante |
; +-------------+----------+----------+--------+-----------+----------+
;
;
;------------------------------------------------------------------------------------

            LIST  P=16F84, F=INHX8M
            include "P16F84.inc"
            errorlevel 1,-224,-302

;******************************************************


		constant LED1 = 01
		constant LED2 = 02
		constant LED3 = 03

		constant IZD = 00	;Sensor Derecha
		constant DRC = 01	;Sensor Izda.
		constant SW1 = 02	;Pulsador 1
		constant SW2 = 03	;Pulsador 2
		constant SW3 = 04	;Pulsador 3

		constant LONG = 0x0C	;Puntero RAM para contar longitud recorrida

		constant TMP1 = 0x0D	;Punteros para temporizar
		constant TMP2 = 0x0E
		constant TMP3 = 0x0F

		constant PRG1 = 0x10	;Punteros tiempo programas 
		constant PRG2 = 0x11
		constant PRG3 = 0x12

		constant CNT  = 0x25	;Ajuste carga temporizadores

;******************************************************

		ORG		0x0000
		MOVLW		30
		CALL		Tiempo

		MOVLW		0x00
		OPTION

		MOVLW		0x1F
		TRIS		PORTA		;Pone puerto A como entradas.
		
		MOVLW		0x00		
		TRIS		PORTB		;Pone puerto B como salidas.

Set_Prog	MOVLW		b'11110000'	;Enciende los LEDS y motores parados.
		MOVWF		PORTB

		BSF		STATUS,C
		MOVLW		50
		CALL		Tiempo		;0,5 Sg de parpadeo de LEDS.

		BTFSS		PORTA,SW1
		GOTO		Set_Prog1
		BTFSS		PORTA,SW2
		GOTO		Set_Prog2
		BTFSS		PORTA,SW3
		GOTO		Set_Prog3

		MOVLW		b'11111110'	;Apaga los LEDS y motores parados.
		MOVWF		PORTB

		BSF		STATUS,C
		MOVLW		50
		CALL		Tiempo		;0,5 Sg de parpadeo de LEDS
		GOTO		Set_Prog

Set_Prog1	CALL		Prog1
		GOTO		Inicio

Set_Prog2	CALL		Prog2
		GOTO		Inicio

Set_Prog3	CALL		Prog3


Inicio		MOVLW		b'01011111'	;Rb5 y Rb7 = 0, ir hacia delante.
		ANDWF		PORTB,F		;Pone puertoB para ir hacia delante.

Loop		BTFSS		PORTA,IZD
		GOTO		Topei
		BTFSS		PORTA,DRC
		GOTO		Toped
		BTFSS		PORTA,SW1
		CALL		Prog1
		BTFSS		PORTA,SW2
		CALL		Prog2
		BTFSS		PORTA,SW3
		CALL		Prog3
		GOTO		Loop


Topei		CALL		Ostia		;Retrocede un poco.
		MOVLW		b'10011111'	;Giro a derecha.
Toptop		ANDWF		PORTB,F
		BTFSS		PORTB,LED1	;PROG1 ?
		CALL		Tm1		;Coge tiempo giro Prog1
		BTFSS		PORTB,LED2	;PROG2 ?
		CALL		Tm2		;Coge tiempo giro Prog2
		BTFSS		PORTB,LED3	;PROG3 ?
		CALL		Tm3		;Coge tiempo giro Prog3
		CALL		Tiempo
		CALL		Para
		BTFSS		PORTA,IZD	;Comprobamos si nos hemos
		GOTO		Topei		;dado otra ostia.
		BTFSS		PORTA,DRC
		GOTO		Toped
		GOTO		Inicio		;Continua marcha alante.

Toped		CALL		Ostia		;Retrocede un poco.
		MOVLW		b'01101111'	;Giro a Izda.
		GOTO		Toptop		;Ahorramos un poco de código.

Tm1		MOVLW		0x02		;Tiempo giro PROG1 = 0x15..0x30
		ADDWF		PRG1,f		;Sumamos 2 al tiempo de giro anterior
		MOVF		PRG1,w
		SUBLW		0x30		;30 - W = W, si negativo C=0, reiniciar a 15.
		BTFSS		STATUS,C
		GOTO		PP1		;Pone tiempo inicial.
		MOVF		PRG1,w		;Cogemos el tiempo.
		RETURN

Tm2		MOVLW		0x02		;Tiempo giro PROG2 = 0x30..0x45
		ADDWF		PRG2,f		;Sumamos 2 al tiempo de giro anterior
		MOVF		PRG2,w
		SUBLW		0x45		;45 - W = W, si negativo C=0, reiniciar a 30.
		BTFSS		STATUS,C
		GOTO		PP2		;Pone tiempo inicial.
		MOVF		PRG2,w		;Cogemos el tiempo.
		RETURN

Tm3		MOVLW		0x02		;Tiempo giro PROG3 = 0x45..0x60
		ADDWF		PRG3,f		;Sumamos 2 al tiempo de giro anterior
		MOVF		PRG3,w
		SUBLW		0x60		;60 - W = W, si negativo C=0, reiniciar a 45.
		BTFSS		STATUS,C
		GOTO		PP3		;Pone tiempo inicial.
		MOVF		PRG3,w		;Cogemos el tiempo.
		RETURN

Ostia		CALL		Para
		MOVLW		b'10101111'	;Rb4 y Rb6 = 0, ir patrás.
		ANDWF		PORTB,F		;Marcha Atras.
		BTFSS		PORTB,LED1	;PROG1 ?
		MOVF		PRG1,w		;Tiempo PRG1 para retroceso.
		BTFSS		PORTB,LED2	;PROG2 ?
		MOVF		PRG2,w		;Tiempo PRG2 para retroceso.
		BTFSS		PORTB,LED3	;PROG3 ?
		MOVF		PRG3,w		;Tiempo PRG3 para retroceso.
		MOVWF   	TMP3
		ADDWF		TMP3,w		;Doblamos retroceso,no permitida parada.
		BSF		STATUS,C	;Impedir parada en esta temporización.
		CALL		Tiempo		;Temp y termina retornando tras 
						;hacer la siguiente rutina Para.
Para		MOVLW		b'11110000'	;Rb4-Rb7 = 1, parar motores.
		IORWF		PORTB,F		;Para Motores.
		CALL		Pausa
		RETURN

PP1		MOVF		PRG1,w		;Mas tiempo de giro.
		CALL		Tiempo
Prog1		MOVLW		b'00001111'
		IORWF		PORTB,F
		MOVLW		b'11111101'	;Enciende LED1
		ANDWF		PORTB,F
		CALL		Pausa
		MOVLW		b'00001111'	;Apaga LEDS.
		IORWF		PORTB,F
		CALL		Pausa
		MOVLW		b'11111101'	;Enciende LED1
		ANDWF		PORTB,F

		MOVLW		0x15		;Tiempo de giro inicial Prog1 = 0,15 Sg
		MOVWF		PRG1
		RETURN

PP2		MOVF		PRG2,w		;Mas tiempo de giro.
		CALL		Tiempo
Prog2		MOVLW		b'00001111'
		IORWF		PORTB,F
		MOVLW		b'11111011'	;Enciende LED2
		ANDWF		PORTB,F
		CALL		Pausa
		MOVLW		b'00001111'	;Apaga LEDS.
		IORWF		PORTB,F
		CALL		Pausa
		MOVLW		b'11111011'	;Enciende LED2
		ANDWF		PORTB,F

		MOVLW		0x30		;Tiempo de giro inicial Prog2 = 0,3 Sg
		MOVWF		PRG2
		RETURN

PP3		MOVF		PRG3,w		;TMas tiempo de giro.
		CALL		Tiempo
Prog3		MOVLW		b'00001111'
		IORWF		PORTB,F
		MOVLW		b'11110111'	;Enciende LED3
		ANDWF		PORTB,F
		CALL		Pausa
		MOVLW		b'00001111'	;Apaga LEDS.
		IORWF		PORTB,F
		CALL		Pausa
		MOVLW		b'11110111'	;Enciende LED3
		ANDWF		PORTB,F

		MOVLW		0x45		;Tiempo de giro inicial Prog3 = 0,45 Sg
		MOVWF		PRG3
		RETURN

Pausa		BSF		STATUS,C	;Impedir parada en esta temporización.
		MOVLW		10		;0,1 Sg.
Tiempo		MOVWF   	TMP3		;Carga el tiempo
		MOVLW		CNT
		MOVWF		TMP1		;Carga primera,
		MOVWF		TMP2		;segunda y 

Tmp_Loop	BTFSC		STATUS,C	;Permitir parada en la temporización?
		GOTO		Bien		;No permitido, saltar a Bien.
		BTFSC		PORTA,IZD	;Comprobamos si nos damos la ostia
		GOTO		Topedrc		;en el giro temporizado para
		MOVLW		b'11110000'	;detener los motores.
		IORWF		PORTB,F
		RETURN				;Terminamos

Topedrc		BTFSC		PORTA,DRC
		GOTO		Bien		;No hay ostia en la temporización.
		MOVLW		b'11110000'	;detener los motores.
		IORWF		PORTB,F
		RETURN				;Terminamos

Bien		DECF		TMP1,F
		BTFSS		STATUS,Z
		GOTO		Tmp_Loop
		MOVLW		CNT
		MOVWF		TMP1
		DECF		TMP2,F
		BTFSS		STATUS,Z
		GOTO		Tmp_Loop
		MOVLW		CNT
		MOVWF		TMP2
		DECF		TMP3,F
		BTFSS		STATUS,Z
		GOTO		Tmp_Loop
		BCF		STATUS,C
		RETURN


;-----------------------------------------------------------------------
; Read a byte from the PIC EEPROM
; The address is read from W and the read value is returned in W

Rd_eeprom   MOVWF   EEADR          ; Load address
            BSF     STATUS,RP0     ; Select page 1 (80H - FFH)
            BSF     EECON1,0x00
            BCF     STATUS,RP0     ; Select page 0 (00H - 7FH)
            MOVF    EEDATA,W       ; Return value
            RETURN

;=======================================================================
; Signature
;=======================================================================

            ORG     0x03F8

            DATA    0x00,'R','e','d','s','t','a','r'

;=======================================================================
; Identifier
;=======================================================================

          __idlocs  0x0010         ; Version 1.0

;=======================================================================
; Fuses
;======================================================================= 
; Bit 13  Bit 12  Bit 11  Bit 10  Bit 9   Bit 8   Bit 7   Bit 6   Bit 5   Bit 4   Bit 3   Bit 2   Bit 1   Bit 0 
; CP      CP      CP      CP      CP      CP      CP      CP      CP      CP      PWRTE   WDTE    FOSC1   FOSC0 
;          __config  0x0009         ; 00 0000 0000 1001 code protect
         __config  0x3FF9         ; 11 1111 1111 1001 no code protect

;=======================================================================
; Internal EEPROM
;=======================================================================

            ORG     0x2100
            DATA    0x20
            DATA    0x20
            DATA    0x28
            DATA    0x43
            DATA    0x29
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x4D
            DATA    0x4F
            DATA    0x52
            DATA    0x45
            DATA    0x52
            DATA    0x41
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x32
            DATA    0x30
            DATA    0x30
            DATA    0x34
            DATA    0x20
            DATA    0x20
            DATA    0x21
            DATA    0x21
            DATA    0x20
            DATA    0x51
            DATA    0x75
            DATA    0x65
            DATA    0x20
            DATA    0x64
            DATA    0x69
            DATA    0x76
            DATA    0x65
            DATA    0x72
            DATA    0x74
            DATA    0x69
            DATA    0x64
            DATA    0x6F
            DATA    0x20
            DATA    0x65
            DATA    0x73
            DATA    0x20
            DATA    0x65
            DATA    0x73
            DATA    0x74
            DATA    0x6F
            DATA    0x20
            DATA    0x64
            DATA    0x65
            DATA    0x6C
            DATA    0x20
            DATA    0x72
            DATA    0x6F
            DATA    0x62
            DATA    0x6F
            DATA    0x6D
            DATA    0x61
            DATA    0x78
            DATA    0x78
            DATA    0x21
            DATA    0x21
            DATA    0x20


;-----------------------------------------------------------------------

            END
Code:
:1000000030309620003062001F30650000306600FE
:10001000F0308600031450309620051D1928851DE8
:100020001B28051E1D28FE30860003145030962024
:10003000082869201E2878201E2887205F30860522
:10004000051C2B28851C3B28051D6920851D782053
:10005000051E8720202856209F308605861C3E20BE
:10006000061D4620861D4E2096206320051C2B2849
:10007000851C3B281E2856206F302D280230900703
:100080001008303C031C6728100808000230910754
:100090001108453C031C762811080800023092071D
:1000A0001208603C031C8528120808006320AF304A
:1000B0008605861C1008061D1108861D12088F0073
:1000C0000F0703149620F0308604942008001008CF
:1000D00096200F308604FD30860594200F3086046C
:1000E0009420FD30860515309000080011089620F8
:1000F0000F308604FB30860594200F308604942050
:10010000FB308605303091000800120896200F3031
:100110008604F730860594200F3086049420F7304B
:100120008605453092000800031410308F002530FA
:100130008D008E000318A6280518A128F03086042B
:1001400008008518A628F030860408008D03031DDA
:100150009A2825308D008E03031D9A2825308E00A5
:100160008F03031D9A2803100800890083160814C2
:06017000831208080800DC
:1007F0000000520065006400730074006100720024
:084000000000000001000000B7
:02400E00F93F78
:10420000200020002800430029002000200020007A
:1042100020004D004F005200450052004100200098
:104220002000200032003000300034002000200048
:10423000210021002000510075006500200064006D
:1042400069007600650072007400690064006F0008
:1042500020006500730020006500730074006F008B
:104260002000640065006C00200072006F00620096
:104270006F006D00610078007800210021002000AF
:00000001FF