Está en la página 1de 29

Ejemplos de lenguaje ensamblador para PIC

16f84.
;Programa entrenador04
;Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y los ceros. Por ejemplo si por el Puerto A se
introduce xxx11001 por el Puerto B deber aparecer 00000110
;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
INICIO bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
movlw b'11100000';LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movwf TRISB; se mueve al puerto B
movlw b'00011111'; Las lineas del puerto A configuradas como entrada
movwf TRISA; Mueve w al registro f
; Cero si es salida y uno si es entrada
Rutina bcf STATUS,RP0; Sale del modo de configuracion de los puertos
movf PORTA,W; carga el registro del puerto A en (W)
COMF PORTA,W ; Esta instruccin complementa un registro, es decir, los unos por ceros y los ceros por
unos
movwf PORTB; El contenido de W se deposita en el puerto de salida
goto Rutina; Crea un bucle cerrado e infinito
END; Fin del programa

;Programa entrenador03
;Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2, es necesario poner 5 switches en todos los
pines del puerto A
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
INICIO bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movlw b'00011111'; Las lineas del puerto A configuradas como entrada
movwf TRISA; Mueve w al registro f
; Cero si es salida y uno si es entrada
Rutina bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************
movf PORTA,W; carga el registro del puerto A en (W)
addwf PORTA,W; SUMA EL CONTENIDO DEL PUERTO A CON W
movwf PORTB; El contenido de W se deposita en el puerto de salida
goto Rutina; Crea un bucle cerrado e infinito
END; Fin del programa.
;Programa entrenador02
;El Puerto B, que acta como salida, es controlado por el bit 0 del Puerto A, que acta como entrada. De manera
tal, que:
;Si RA0=1, se encienden todos los LEDs de salida
;Si RA0=0, se encienden slo los LEDs del nibble alto

;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
INICIO bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movlw b'00000001'; Las lineas del puerto A configuradas como entrada
movwf TRISA; Mueve w al registro f
; Cero si es salida y uno si es entrada
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************
Principal

; Inicio del bucle del programa

BTFSC PORTA, 0; Instruccion para elejir una opcion dependiendo del bit 0 en el puerto A
GOTO Principal1; Envia a los nibbles de arriba
GOTO Principal2; Envia a todos los nibbles
Principal1

movlw b'11110000'; Manda a encender los nibles de arriba

Movwf PORTB; manda w a los registros de B


GOTO Principal ; Envia al inicio del programa
Principal2

movlw b'11111111'; Manda a encender todos los leds

Movwf PORTB; Manda a las Salidas

GOTO Principal; Crea un bucle cerrado e infinito


END; Fin del programa
;Programa entrenador01
;enciende el nibble alto de la barra de LEDS
;y apaga el nibble bajo
;***********************************************************
;Zona de datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de codigos********************************************
bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
movlw b'00000000'; Las lineas del puerto B configuradas como salidas
movwf TRISB; Mueve w al registro f
movlw b'00000001'; Registra todos los puertos de A como salidas
movwf TRISA; Mueve w al registro f
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
;

Inicio del programa de Bucle*********************************************

INICIO ; Inicio del bucle del programa


movlw b'11110000'; manda a las salidas a w
Movwf PORTB; manda w a los registros de B
END; Fin del programa

;Programa tiempos03.
;Los puertos A y B se usaran como salidas,
;debe de haber conectados 13 leds,
;inicialmente se deben encender los leds conectados a RA0 y a RB7,
;despus de medio segundo deben de apagarse y encenderse los leds conectados a RA1 y RB6,

;medio segundo despus, se apagan y se encienden los leds conectados a RA2 y RB5,
;medio segundo mas tarde, se apagan y encienden los leds de RA3 y RB4, el proceso sigue as,
;para RA4 y RB3, RB1 y RB2, cuando se apaguen RB1 y RB2 debe pasar un segundo,
;y deben encenderse todos los leds por 2 segundos, apagarse por 2 segundos,
;encenderse por un segundo, apagarse un segundo, encenderse por medio segundo,
;apagarse, esperar un segundo y volver a repetir desde el principio.
;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado.
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados.
CBLOCK 0x0C; Definimos algunas constantes y etiqutas
ENDC
; Salimos del modo de definicon.
SEC1 equ
b'00000000';Cada una de estas etiquetas
SEC2 equ
b'10000000';tiene asignado un movimento
SEC3 equ
b'01000000';de la secuancia deseada.
SEC4 equ
b'00100000';Se inicia todos los puertos a cero
SEC5 equ
b'00010000';para que la secuencia no se desfase.
SEC6 equ
b'00001000'
SEC7 equ
b'00000110'
SEC8 equ
b'00000000'
SEC9 equ b'00000001'
SEC10 equ
b'00000010'
SEC11 equ
b'00000100'
SEC12 equ
b'00001000'
SEC13 equ
b'00010000'
SEC14 equ
b'00000000'
SEC15 equ b'00000000'
SEC16 equ b'11111111'
;Zona de Codigos *******************************************
ORG 0;Indica en que parte de la memoria incia el programa.
BSF STATUS,5 ; activa la pagina 1
MOVLW B'00000' ; carga 00000 en W
MOVWF TRISA ; puerto A se configura como salida
MOVLW B'00000000' ; carga 00000000 en W
MOVWF TRISB ; puerto B se configura como salida
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTA; ponemos a cero el puerto A
CLRF PORTB ; ponemos a cero el puerto B
Inicio

inicio del programa de bucle.

Repetir. ;Etiqueta de la secuencia deseada


MOVLW SEC8 ; carga el valor de SEC8 en W
MOVWF PORTA; carga w en el puerto A
MOVLW SEC1 ; carga el valor de SEC1 en W
MOVWF PORTB; carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC9 ; carga el valor de SEC9 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC2 ; carga el valor de SEC2 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC10 ; carga el valor de SEC10 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC3 ; carga el valor de SEC3 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC11 ; carga el valor de SEC11 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC4 ;carga el valor de SEC4 en W
MOVWF PORTB ;carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC12 ; carga el valor de SEC12 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC5 ;carga el valor de SEC5 en W
MOVWF PORTB ;carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC13 ; carga el valor de SEC13 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC6 ;carga el valor de SEC6 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC14 ; carga el valor de SEC14 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC7 ;carga el valor de SEC7 en W
MOVWF PORTB ;carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_1s ; demora de 500ms
MOVLW SEC16 ; carga el valor de SEC16 en W
MOVWF PORTA ; carga w en el puerto B
MOVLW SEC16 ; carga el valor de SEC16 en W

MOVWF PORTB ; carga el valor de W al puerto B


CALL Retardo_2s ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_2s ; demora de 500ms
MOVLW SEC16 ; carga el valor de SEC16 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC16 ; carga el valor de SEC16 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_1s ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_1s ; demora de 500ms
MOVLW SEC16 ; carga el valor de SEC16 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC16 ;carga el valor de SEC16 en W
MOVWF PORTB ;carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en W
MOVWF PORTA ; carga w en el puerto A
MOVLW SEC15 ; carga SEC15 en W
MOVWF PORTB ; carga el valor de W en el puerto B
CALL Retardo_500ms ; demora de 500ms
GOTO Inicio
INCLUDE <RETARDOS.INC>;Biblioteca de retardos.
END; Fin del programa.
;Programa Selector.
;Por la barra de LEDS conectada al puerto de salida se visualiza un juego de luces con
;la secuencia expresada en binario 1,1,2,3...233, es decir los nmeros de la sucesin
;de Fibonacci. La velocidad del movimiento ser fijada por la lectura de 3 switches
;conectados al puerto A de manera que se visualice cada posicin durante un tiempo:
;Si (PORTA)=0, cada posicin se visualiza durante 0x100 ms=0 ms
;Si (PORTA)=1, cada posicin se visualiza durante 1x100 ms=100
;Si (PORTA)=2, cada posicin se visualiza durante 2x100 ms=200
;Si (PORTA)=3, cada posicin se visualiza durante 3x100 ms=300
;Si (PORTA)=4, cada posicin se visualiza durante 4x100 ms=400
;Si (PORTA)=7, cada posicin se visualiza durante 7x100 ms=700
;***********************************************************
;Zona de Datos**********************************************

__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC


LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
CBLOCK 0x0C
TablaLongitud
TablaPosicion
ContadorTiempo
GuardaContador
ENDC

;define el valo de una cosntante o vector


;etiquetas
;etiquetas
;etiquetas
;etiqutas
;termina c

;Zona de Codigos *******************************************


ORG 0
;indica al compilador que el cdigo por debajo de ella debe
alojarse a partir de la posicin de memoria 0 del PIC
Inicio
bsf
STATUS,RP0
; Entra al modo de configuracion de puertos.
clrf
PORTB
; Limpia el puerto B.
movlw b'00000111'
; El puerto A se configura como entrada.
movwf PORTA
;Mueve el valor al puerto A.
bcf
STATUS,RP0
;Sale del modo de configuracion de puertos.
Principal
clrf
PORTB
; El puerto de salida esta apagado.
movf PORTA,W
; Lee el puerto de entrada.
andlw b'00000111'
; Almacena la informacin vlida.
movwf ContadorTiempo
; Lo pasa al contador
movwf GuardaContador
; y a su copia.
movf ContadorTiempo,F
; Comprueba si es cero.
btfsc STATUS,Z
; Si es cero sale fuera.
goto Fin
movlw TablaFin-TablaInicio ; Calcula la longitud de la tabla y la carga en
movwf TablaLongitud
; este registro que actuar como contador.
clrf
TablaPosicion
; Apunta a la primera posicin de la tabla.
VisualizaOtraPosicion
movf TablaPosicion,W
; Aqu posicin a leer de la tabla.
call
LeeTabla
; Visualiza la posicin de la tabla.
movwf PORTB
; El resultado se visualiza por la salida.
movf GuardaContador,W
; Recupera el valor del contador.
movwf ContadorTiempo
MantieneVisualizacion
; Durante un tiempo igual a (ContadorTiempo)x100 ms.
call
Retardo_100ms
decfsz ContadorTiempo,F
;aplica el retardo.
goto MantieneVisualizacion; aplica el bucle
incf
TablaPosicion,F
; apunta a la siguiente posicin por visualizar.
decfsz TablaLongitud,F
; Ha terminado la tabla?
goto VisualizaOtraPosicion ; No, pues visualiza la siguiente posicin.
Fin
goto Principal
; aplica el bucle infinito desde principal
; Subrutina "LeeTabla" ------------------------------------------------------------------

;
LeeTabla
addwf
TablaInicio
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,F
b'00000000'
b'00000001'
b'00000001'
b'00000010'
b'00000011'
b'00000101'
b'00001000'
b'00001101'
b'00010101'
b'00100010'
b'00110111'
b'01011001'
b'10010000'
b'11101001'

; Indica la posicin inicial de la tabla.


; Cada uno de los siguientes valores es
; forma parte de la sucesion de fibonacci
; en binario

TablaFin

; Indica la posicin final de la tabla.

INCLUDE <RETARDOS.INC>;
END.

Utiliza la biblioteca de retardos

;Programa Contador.
;Se pone el 0 en binario, y en incrementos de 50 milisegundos, muestra sucesivamente
;el 1,2,3,4255 en binario, una vez que llegue al 255 que son los 8 leds encendidos,
;comienza la cuenta regresiva 254,253,252,0 y de ah comenzar nuevamente el
;programa.
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
ORG 0
bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movlw b'00011111'; Las lineas del puerto A configuradas como entrada
movwf TRISA; Mueve w al registro f

; Cero si es salida y uno si es entrada


bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************g
CBLOCK 0X0C
; Define a numero
Numero
ENDC
movlw d'0'
; Mueve numero al registro w
movwf Numero ; Mueve Numero a F
Rutina
suma

incfsz Numero,f; incrementa una unidad a numero, si es mayor que 255 salta a la siguiente intruccion
goto Bucle
goto Bucle2

; Envia a salida del puerto B


; Es mas de 255 y envia a la resta

Bucle movf Numero,W


; mueve numero a W
movwf PORTB
; Mueve w al puerto B
CALL Retardo_50ms ; Llama a retardo de 50 ms
goto Rutina
; Envia al inicio de la suma
Bucle2 decfsz Numero,f ; Decrece en una unidad si es diferente de 0 sigue si igual a cero salta a la siguiente
instruccion
goto Bucle3
; Envia a la salida del puerto B
goto suma
; Como es cero envia a la suma
Bucle3 movf Numero,W
;Envia numero a W
movwf PORTB
;Envia W al puerto B (salida)
CALL Retardo_50ms ;Llama a retardo de 50 ms
goto Bucle2
;Manda a la resta

END

INCLUDE <RETARDOS.INC> ; Incluye la libreria de retardos


; Fin del Programa

;Programa Selector.
;Compara el numero definido '21', con el numero asignado con las entradas
;del puerto A.
;************************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado.
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados.

;Zona de Codigos *******************************************


ORG 0 ;
indica a la memoria en que posicion iniciar.
bsf STATUS,RP0; Entra al modo de configuracion de los puertos.
;Conconfiguracion de puertos***********************************
clrf TRISB; Las lineas del perto B se configuran como salidas.
movlw b'00011111'; Las lineas del puerto A configuradas como entradas.
movwf TRISA; Mueve w al registro f.
; Cero si es salida y uno si es entrada.
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************
CBLOCK 0X0C ; Definimos etiquetas y constantes.
Numero ;Etiqueta.
ENDC ;Sale del modo de definicion.
movlw d'21'; Mueve numero al registro w
movwf Numero ; Mueve Numero a F
Rutina
movf PORTA,W ; mueve el valor del puerto A a W
subwf Numero,W ; hace la resta PORTA - numero
menor movlw b'00001111';Supone que la entrada es menor
btfss STATUS,C; Verifica el valor el C de la resta si es C=1 salta al siguiente comando
goto salida ; Envia a la salida
igual

movlw b'11111111'; Supone que los dos numeros son iguales son iguales
btfsc STATUS,Z ; Ve si Z=0 si es cero salta a siguiente comando
goto salida ; si Z=1 son iguales y envia a la salida

mayor movlw b'11110000' ; Z=0 y entonces no son iguales, por lo tanto la entrada es mayor
salida
movwf PORTB ;Envia a salida
Goto Rutina; Bucle de proceso infinito

END; Fin del programa


;Programa Suma.
;Programa donde desde la computadora se teclea un nmero,
;lo manda al pic, y el pic regresa el numero mas 3. Los nmeros
;que se introducen son del 0 al 6.
;************************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
CBLOCK 0x0C ;Define Variable
GuardaDato
Numero
ENDC
;Termina definir variable.

; Inicio del programa de Bucle*********************************************


Inicio ORG 0
call LCD_Inicializa ;Llama a la sub rutina de LCD
call RS232_Inicializa ; Inicia la comunicacin con el puerto
Principal
call RS232_LeeDato

; Envia a subrutina para leer dato

movwf GuardaDato

; Lo envia a GuardaDato

call LCD_Caracter

; Se visualiza el dato en pantalla

Suma ;Subrutina Suma


movf GuardaDato,W
addlw 3

;pone el dato de entrada en W


;le suma 3

call RS232_EnviaDato ;llama a la subrutina


Goto Principal

;bucle infinito

END

INCLUDE <RS232.INC>
; Incluye libreria de conexion
INCLUDE <LCD_4BIT.INC> ; Incluye libreria de LCD
INCLUDE <RETARDOS.INC>
; Incluye la libreria de retardos
; Fin del Programa

;Programa Mundo
;Guarda un mensaje en el PIC, por ejemplo:
;Hola Mundo
;Mi nombre es:Erick. Y lo despliega en el monitor de la computadora repetidamente a intervalos de 1 segundo.
;************************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
CBLOCK 0X0C
ENDC
RetornoCarro EQU .13
CambioLinea EQU .10

;Inicimos el valor de etiquetas.


;Definimos el valor de las etiquetas.

; Inicio del programa de Bucle*********************************************


Inicio
call LCD_Inicializa ;Llama a la sub rutina de LCD
call RS232_Inicializa ; Inicia la comunicacin con el puerto
Principal
movlw Mensaje0

Goto Principal

; Mueve Mensaje a W

call RS232_Mensaje

; Llama a subrutina de Mensaje

call Retardo_1s

; Llama a retardo de un 1s
; Envia a Principal

;Configuracin de Mensaje *******************************************************************


Mensajes

addwf PCL,F

; Suma PCL a F

Mensaje0
DT RetornoCarro

; Envia a pantalla un espacio

DT "Hola Mundo"

;Envia el mensaje Hola Mundo

DT RetornoCarro, CambioLinea ; Envia a pantalla un espacio


DT "Mi nombre es Erick"

; Envia a pantalla Mi nombre es Erick

DT CambioLinea, CambioLinea, CambioLinea, 0X00 ; Envia a pantalla 3 espacios

END

INCLUDE <RS232.INC>
; Incluye libreria de conexion
INCLUDE <RS232MEN.INC> ;Incluye libreria de conexion
INCLUDE <LCD_4BIT.INC> ; Incluye libreria de LCD
INCLUDE <RETARDOS.INC>
; Incluye la libreria de retardos
; Fin del Programa

;Programa Leds.
;Hacer un programa que desde la computadora mande una seal para prender 8 leds y
;otra para apagarlos. Con 1 que se enciendan y con 0 que se apaguen
;*********************************************************************************
;Zona de Datos********************************************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
CBLOCK 0x0C
TeclaPulsada
MensajeApuntado
ENDC
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE

Salida1
Salida2
Salida3
Salida4
Salida5
Salida6
Salida7
Salida8

; Va a guardar el contenido de la tecla pulsada.


; Va a guarda la direccin del mensaje apuntado.
PORTB,7
PORTB,6
PORTB,5
PORTB,4
PORTB,3
PORTB,2
PORTB,1
PORTB,0

TECLA1_ON
EQU '1'
; Cdigo de las teclas utilizadas.
TECLA1_OFF EQU '0'

; Define puerto de salidas


; Define dnde se sita cada una de las salidas.

;Zona de Codigos *****************************************************************


ORG 0
; Inicio del programa de Bucle*********************************************
Inicio
call
LCD_Inicializa
; Inicializa el display LCD
RS232_Inicializa
; Inicializa RS232
STATUS,RP0
; Configura como salidas las 8 lneas del
Salida1
; del Puerto B
Salida2
Salida3
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
bcf
STATUS,RP0
;Sale de la configuracion de puertos
call
Parado
;En un pricipio los leds deben estar apagados
Principal
; apagados.
call RS232_LeeDato
; Espera a recibir un carcter.
call TesteaTeclado
; Verifica caracter recibido y ejecuta accion
goto Principal
; Loop Infinito
;****************************************************************************
;*
Testea Teclado
*
;*
*
;* Verifica caracer recibido y decide que accion ejecutar
*
;****************************************************************************
TesteaTeclado
movwf TeclaPulsada
; Guarda el contenido de la tecla pulsada.
xorlw TECLA1_ON
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto R1_ON
; S, se desea movimiento hacia adelante.
call
bsf
bcf
bcf
bcf
bcf

movf TeclaPulsada,W
xorlw TECLA1_OFF
btfsc STATUS,Z
goto R1_OFF
goto
Fin
R1_ON
bsf
bsf
bsf
bsf

Salida1
Salida2
Salida3
Salida4
bsf
Salida5
bsf
Salida6
bsf
Salida7
bsf
Salida8
goto
Fin

; Recupera el contenido de la tecla pulsada.


; Es la tecla del movimiento hacia atrs?
;
; S, se desea movimiento hacia atrs.

;Mantiene todas las salidas prendidas

R1_OFF
bcf
Salida1
bcf
Salida2
bcf
Salida3
bcf
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin

;Mantiene todas las salidas apagadas

Parado
bcf
bcf
bcf

bcf
Salida1
Salida2
Salida3
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8

;Mantiene todas las salidas apagadas, el sistema se encuentra detenido

Fin
return
INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>

;Librerias utilizadas.

END

;Fin del programa

;Programa Encendido.
;Hacer un programa que desde la computadora mande un numero entre 1 y 8
;de acuerdo con esto se enciendan 1 led, 2 led y asi hasta 8
;cualquier otra tecla no debe generar algun efecto.
;*********************************************************************************
;Zona de Datos********************************************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
CBLOCK 0x0C
TeclaPulsada
MensajeApuntado
ENDC

; Va a guardar el contenido de la tecla pulsada.


; Va a guarda la direccin del mensaje apuntado.

#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE

Salida1
Salida2
Salida3
Salida4
Salida5
Salida6
Salida7
Salida8

PORTB,7
PORTB,6
PORTB,5
PORTB,4
PORTB,3
PORTB,2
PORTB,1
PORTB,0

; Define puerto de salidas


; Define dnde se sita cada una de las salidas.

UnLed
EQU '1'
; Cdigo de las teclas utilizadas.
DosLed
EQU '2'
TresLed
EQU '3'
CuatroLed
EQU '4'
CincoLed
EQU '5'
SeisLed
EQU '6'
SieteLed
EQU '7'
OchoLed
EQU '8'
;Zona de Codigos *****************************************************************
ORG 0
; Inicio del programa de Bucle*********************************************
Inicio
call
LCD_Inicializa
; Inicializa el display LCD
RS232_Inicializa
; Inicializa RS232
STATUS,RP0
; Configura como salidas las 8 lneas del
Salida1
; del Puerto B
Salida2
Salida3
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
bcf
STATUS,RP0
;Sale de la configuracion de puertos
call
Parado
;En un pricipio los leds deben estar apagados
Principal
; apagados.
call RS232_LeeDato
; Espera a recibir un carcter.
call TesteaTeclado
; Verifica caracter recibido y ejecuta accion
goto Principal
; Loop Infinito
;****************************************************************************
;*
Testea Teclado
*
;*
*
;* Verifica caracer recibido y decide que accion ejecutar
*
;****************************************************************************
TesteaTeclado
movwf TeclaPulsada
; Guarda el contenido de la tecla pulsada.
xorlw UnLed
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto L1_ON
; S, se desea movimiento hacia adelante.
call
bsf
bcf
bcf
bcf
bcf

movf

TeclaPulsada,W

; Recupera el contenido de la tecla pulsada.

xorlw DosLed
btfsc STATUS,Z
goto L2_ON

; Es la tecla del movimiento hacia atrs?


;
; S, se desea movimiento hacia atrs.

movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw TresLed
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto L3_ON
; S, se desea movimiento hacia adelante.
movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw CuatroLed
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto L4_ON
; S, se desea movimiento hacia adelante.
movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw CincoLed
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto L5_ON
; S, se desea movimiento hacia adelante.
movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw SeisLed
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto L6_ON
; S, se desea movimiento hacia adelante.
movf
xorlw
btfsc
goto

TeclaPulsada,W
SieteLed
STATUS,Z
L7_ON

; Guarda el contenido de la tecla pulsada.


; Es la tecla del movimiento hacia adelante?
;
; S, se desea movimiento hacia adelante.

movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw OchoLed
; Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
;
goto L8_ON
; S, se desea movimiento hacia adelante.
;
goto Lomismo
;tecla no valida

L8_ON
que se ejecute
bsf
Salida1
bsf
Salida2
bsf
Salida3
bsf
Salida4
bsf
Salida5
bsf
Salida6
bsf
Salida7
bsf
Salida8
goto
Fin
L1_ON
bsf
bcf
bcf

;Definimos el modo en que deseamos


;cada una de las salidas, desde un solo led encendido
; hasta los 8 mas una rutina donde todos se encuentran
; apagados y otra donde no se realiza alguna accion

;Un led encendido


Salida1
Salida2
Salida3

bcf

Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin
L2_ON
bsf
bsf
bcf
bcf

;Dos led encendidos

L3_ON
bsf
bsf
bsf
bcf

;Tres led encendidos

L4_ON
bsf
bsf
bsf
bsf

;Cuatro led encendidos

L5_ON
bsf
bsf
bsf
bsf

;Cinco led encendidos

Salida1
Salida2
Salida3
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin
Salida1
Salida2
Salida3
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin
Salida1
Salida2
Salida3
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin
Salida1
Salida2
Salida3
Salida4
bsf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin

L6_ON
bsf

;Seis Led encendidos


Salida1

bsf
bsf
bsf

Salida2
Salida3
Salida4
bsf
Salida5
bsf
Salida6
bcf
Salida7
bcf
Salida8
goto
Fin
L7_ON
bsf
bsf
bsf
bsf

;Siete eld encendidos.

Parado

;Todos apagados

Salida1
Salida2
Salida3
Salida4
bsf
Salida5
bsf
Salida6
bsf
Salida7
bcf
Salida8
goto
Fin
bcf
Salida1
bcf
Salida2
bcf
Salida3
bcf
Salida4
bcf
Salida5
bcf
Salida6
bcf
Salida7
bcf
Salida8

Lomismo

;no hace algun cambio.

Fin

;Regresa
return

INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
END

;Fin del programa

;Programa Motores.
;Dos motores estn conectados al pic mediante el driver L293B (usar en la simulacin el L293D)
;Se usan 4 interruptores, un interruptor para determinar el sentido de giro de cada uno de los motores.
;Las combinaciones de los otros dos interruptores, deben seguir la siguiente tabla.
;Interruptor 1
Interruptor 2
Motor 1
Motor 2
;1
1
Encendido
Encendido
;0
1
Encendido
Apagado
;1
0
Apagado
Encendido
;0
0
Apagado
Apagado

;
******************************************************************************************
************
;Zona
de
datos**************************************************************************************
***
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
;PIC usado
INCLUDE <P16F84A.INC>
;Paqueteria usada.
#DEFINE SalidaSentido
PORTB,0
; Definimos el valor de cada uno de los bits
#DEFINE
SalidaSentido2
PORTB,7
#DEFINE SalidaMarcha
PORTB,1
#DEFINE
SalidaMarcha2
PORTB,6
#DEFINE EntradaMarcha
PORTA,0
#DEFINE
EntradaMarcha2
PORTA,4
#DEFINE EntradaSentido
PORTA,1
#DEFINE
EntradaSentido2
PORTA,3
; ZONA DE CDIGOS *********************************************************************
ORG

;El programa incia en el bit cero de la memoria

Inicio
bsf
bsf
bsf
bsf
bsf
bcf
bcf
bcf
bcf
bcf
Principal
btfsc
goto
bcf
Principal2
btfsc
goto
bcf
Principal3
btfsc
goto
bcf
Principal4
btfsc
goto
bcf
;goto
Gira
bsf
goto

STATUS,RP0
EntradaMarcha
EntradaSentido
EntradaMarcha2
EntradaSentido2
SalidaMarcha
SalidaSentido
SalidaMarcha2
SalidaSentido2
STATUS,RP0

;Entramos al modo de configuracion de puertos.


; Configura las lneas de entrada y salida.

EntradaMarcha
Gira
SalidaMarcha

; Comprueba el estado del interruptor de funcionamiento.


; Si el interruptor esta encendido, envia a la subrutina.
; Para el motor, poniendo a cero la lnea de habilitacion.

EntradaMarcha2
Gira2
SalidaMarcha2
EntradaSentido
Gira3
SalidaSentido

; Comprueba el estado del interruptor de funcionamiento.


; Para el motor, poniendo a cero la lnea de habilitacion.
; Comprueba el estado del interruptor de funcionamiento.
; Para el motor, poniendo a cero la lnea de habilitacion.

EntradaSentido2
Gira4
SalidaSentido2
Fin3

; Comprueba el estado del interruptor de funcionamiento.

SalidaMarcha
Fin

; Pone en marcha el motor.

; Para el motor, poniendo a cero la lnea de habilitacion.


; habilitacin y sale.

Gira2
bsf
goto

SalidaMarcha2
Fin2

bsf
goto

SalidaSentido
Fin3

bsf
goto

SalidaSentido2
Fin4

; Pone en marcha el motor.

Gira3
Gira4
Fin
goto
Fin2
goto
Fin3
goto
Fin4
goto

; Pone en marcha el motor.


;Inicia los bucles infinitos.

Principal2
Principal3
Principal4
Principal

END
;Laboratorio de Robotica y control
;Programa:Motor compu
;Desde la computadora, dependiendo de la tecla, se obtiene lo siguiente:
;Tecla Efecto
;1
;0
;D
;I
;M
;L
;A

Enciende todos los motores


Apaga todos los motores
Los motores giran a la derecha
Los motores giran a la izquierda
Un motor gira a la derecha y otro a la izquierda
Los motores se mueven a la mitad de la velocidad mxima
Los motores se mueven a velocidad mxima

;************************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
ORG 0
bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************

clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS

; Cero si es salida y uno si es entrada


bcf STATUS,RP0; Sale del modo de configuracion de los puertos
;Zona de Codigos *******************************************
CBLOCK 0x0C ;Define Variable
TeclaPulsada
Ciclos_ON
Ciclos_OFF
GuardaEntrada
ENDC
movlw d'0'
; Mueve numero al registro w
movwf GuardaEntrada ; Mueve Numero a F
;Definicion de Teclas
EnciendeTodos
ApagaTodos
TodosDerecha
TodosIzquierda
DerechaIzquierda
MitadV
MaximaV
call
call

EQU '1'

; Cdigo de las teclas utilizadas.


EQU '0'
EQU 'd'
EQU 'i'
EQU 'm'
EQU 'l'
EQU 'a'

LCD_Inicializa
RS232_Inicializa ; Inicia la comunicacin con el puerto

Principal
call RS232_LeeDato

; Envia a subrutina para leer dato

call TesteaTeclado

;; Verifica caracter recibido y ejecuta accion

goto Principal
;****************************************************************************
;*
Teclado
*
;*
*
;* Verifica caracer recibido y decide que accion ejecutar
*
;****************************************************************************
TesteaTeclado

movwf TeclaPulsada
xorlw EnciendeTodos
btfsc STATUS,Z
;
goto TodosEncendidos
movf TeclaPulsada,W
xorlw ApagaTodos
btfsc STATUS,Z
goto TodosApagados

; Guarda el contenido de la tecla pulsada.


; Es la tecla del encendido?
; S
; Recupera el contenido de la tecla pulsada.
; Es la tecla de todos apagados?

;
; S

movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw TodosDerecha
; Es la tecla de todos derecha?
btfsc STATUS,Z
;
goto Derecha
; S
movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw TodosIzquierda
; Es la tecla de todos izquierda?
btfsc STATUS,Z
;
goto Izquierda
; S
movf TeclaPulsada,W
xorlw DerechaIzquierda
btfsc STATUS,Z
;
goto DI

; Guarda el contenido de la tecla pulsada.


; Es la tecla de uno derecha y otro opuesto?
; S

movf TeclaPulsada,W
; Guarda el contenido de la tecla pulsada.
xorlw MitadV
; Es la tecla de mitad de velocidad?
btfsc STATUS,Z
;
goto MediaVelocidad
; S
movf
xorlw
btfsc
goto

TeclaPulsada,W
MaximaV
STATUS,Z
AltaVelocidad

; Guarda el contenido de la tecla pulsada.


; Es la tecla de maxima velocidad?
;
; S

TodosEncendidos
movlw b'10100110'

; envia a todos encendidos

goto ActivaSalida

; envia a la sailida de puerto

TodosApagados
clrf PORTB
goto ActivaSalida
Derecha

; Apaga los motores


; envia a salida de puerto

movlw b'10100110'

; Los motores hacia la derecha

goto ActivaSalida

; envia a la salida de puerto

movlw b'01100101'

; los dos motores hacia la izquierda

goto ActivaSalida

; encia a salida de puerto

movlw b'01100110'

; Un motor hacia la derecha y otro en direccion opuesta

goto ActivaSalida

; envia salida de puerto

Izquierda

DI

MediaVelocidad
movlw Ciclos_OFF
; Mueve ciclos a w
movf GuardaEntrada,W; envia guardar dato a w
movwf Ciclos_ON
; Envia ciclos on a f
motor_ON
movlw b'10100110'
movwf PORTB
call Retardo_5ms
decfsz Ciclos_ON,F
goto motor_ON+2

;Enciende los motores


; Llama a un retardo de 5ms
;Si es 0 salta a la siguiente instruccion
; envia a motor encendido +2

motor_OFF
clrf PORTB
call Retardo_5ms
decfsz Ciclos_OFF,F
goto motor_OFF+1
goto ActivaSalida

;pone a ceros el puerto b


;llama a un retardo de 5ms
;verifica si ciclos off es 0 si es asi salta a la siguiente instruccion
;envia a motor off +1
; envia a salida

movlw b'10100110'

;Enciende los dos motores a maxima velocidad

goto ActivaSalida

; Envia a Salida del puerto

AltaVelocidad

; Salida de Puerto ********************************************************


ActivaSalida
movwf PORTB
return

;Manda a la salida del puerto B


;termina subrutina Crea un bucle cerrado e infinito

INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
END

; Incluye libreria de conexion

; Fin del Programa

;Robotica y control
;Programa:Giro
;Programa para controlar un motor de corriente directa (DC)
;El puerto A se define como entrada, se conectaran 2 interruptores
;El puerto B se usara como salida
;El interruptor RA0 si manda 1, el motor se mueve, si manda 0, el motor se detiene
;El interruptor RA1 determina si el giro es para la derecha o para la izquierda.
;************************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
#DEFINE EntradaMarcha PORTA,0

;Define el puerto y su utilizacin (encendido o apagado)

#DEFINE EntradaSentido PORTA,1

;Define el puerto y su utilizacin (giro derecha o izquierda)

;Zona de Codigos *******************************************


ORG 0
Inicio
bsf STATUS,RP0; Entra al modo de configuracion de los puertos
bsf EntradaMarcha
bsf EntradaSentido
clrf PORTB

; Las lineas del puerto B configuradas como salidas

bcf STATUS,RP0
Principal
clrw
btfsc EntradaMarcha
goto ActivaSalida

;Con esta combinacion se detiene el motor


;Comprueba el estado del interruptor de funcionamiento

movlw b'00000110'

;Gira en un sentido

btfsc EntradaSentido
movlw b'00000101'

;Gira en otro sentido

ActivaSalida
movwf PORTB

;Manda a la salida del puerto B

goto Principal

; Crea un bucle cerrado e infinito

END; Fin del programa


;Robotica y control.
;Programa:robot seguidor.
; Programa de control para el microbot TRASTO, el cual se desplaza siguiendo una lnea negra
; marcada sobre fondo blanco a modo de pista.
;
; Los sensores pticos de reflexin CNY70 estn situados en la parte delantera inferior del
; microbot: El sensor de la derecha est conectado a RA0 y el sensor de la izquierda a RA1.
;
; El programa adopta la estrategia de seguir la lnea por el borde derecho:
; - Si detecta que est en el borde derecho: sensor izquierdo sobre negro y derecho sobre
; blanco sigue en hacia delante.
; - Si el sensor de la derecha detecta lnea negra gira hacia la derecha buscando el borde,
; independientemente de como est el sensor de la izquierda.
; - Si el microbot tiene los dos sensores fuera de la lnea, se le hace girar a la izquierda
; hasta que vuelva a encontrarla.
;
; La seal de los sensores CNY70 se aplican a las entradas del microcontrolador a travs de un
; inversor 40106 de manera tal, que para color:
; - Color Blanco --> transistor saturado --> entrada al inversor "0" --> RAx = "1".
; (No est encima de la lnea negra, se ha salido de la pista)
; - Color Negro --> transistor en corte --> entrada al inversor "1" --> RAx = "0".
; (Est encima de la lnea negra, est dentro de la pista)
;
; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST
P=16F84A
INCLUDE <P16F84A.INC>
#DEFINE SensorDerecha
#DEFINE SensorIzquierda

PORTA,0
PORTA,1

; Sensor ptico Derecho.


; Sensor ptico Izquierdo.

; ZONA DE CDIGOS ********************************************************************


ORG

bsf
bsf

STATUS,RP0
SensorDerecha

Inicio
; Selecciona Banco 1 de registros.
; Estas lneas se configuran como entrada.

bsf
clrf
bcf
Principal
movlw
btfss
goto

SensorIzquierda
PORTB
STATUS,RP0

movlw
btfss
movlw
ActivaSalida
movwf
goto

b'00000111'
SensorIzquierda
b'00001111'

b'00001110'
SensorDerecha
ActivaSalida

; Las lneas del Puerto B se configuran como salidas.


; Selecciona Banco 0 de registros.
; Para girar a la derecha.
; Ha salido por la derecha?, detecta blanco?
; No, el detector derecho est encima de la lnea
; negra, gira a la derecha.
; Para girar a la izquierda.
; Ha salido tambin por la izquierda?
; No, est en el borde derecho. Sigue recto.

PORTB
Principal

END
;Robotica y control.
;Programa:robot baliza
; Programa de control para Microbot TRASTO el cual detecta una baliza que genera
; una seal infrarroja modulada a 38 kHz.
;
; Los sensores pticos SFH5110 estn situados en la parte frontal del microbot:
; El sensor de la derecha est conectado a RA2 y el sensor de la izquierda a RA3.
;
; Cuando el sensor SFH5110 detecta luz infrarroja modulada, proporciona un nivel bajo en su
; lnea de salida.
;
; El programa adopta la estrategia siguiente:
; - Si no se detecta la baliza por ningn sensor el microbot gira siempre a la derecha.
; - Si los dos sensores detectan portadora el microbot avanza hacia adelante.
; - Si se detecta portadora en el sensor de la izquierda y no en el de la derecha el
;
microbot gira a la izquierda hasta que los dos sensores detecten la baliza.
; - Si se detecta portadora en el sensor de la derecha y no en el de la izquierda el
;
microbot gira a la derecha hasta que los dos sensores detecten la baliza.
;
; ZONA DE DATOS *********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
#DEFINE SensorDerecha
#DEFINE SensorIzquierda

PORTA,2
PORTA,3

; Sensor Derecho.
; Sensor Izquierdo.

; ZONA DE CDIGOS *********************************************************************


ORG

bsf
bsf
bsf
clrf

STATUS,RP0
SensorDerecha
SensorIzquierda
PORTB

Inicio
; Selecciona Banco 1 de registros.
; Estas lneas se configuran como entrada.
; Las lneas del Puerto B se configuran como salidas.

bcf
Principal
btfsc
goto
btfsc
goto
movlw
goto
Ver_Izquierda
btfsc
goto
GiroIzquierda
movlw
goto
GiroDerecha
movlw
ActivaSalida
movwf
goto
END

STATUS,RP0

; Selecciona Banco 0 de registros.

SensorDerecha
Ver_Izquierda
SensorIzquierda
GiroDerecha
b'00001111'
ActivaSalida

; Ha detectado seal por la derecha?


; No recibe por la derecha.
; S, tambin seal por la izquierda?
; No, solo seal por la derecha, gira a derecha.
; S, recibe por los dos sensores. Sigue recto.

SensorIzquierda
GiroDerecha

; Por la derecha no recibe. Y por la izquierda?


; Tampoco, ni por la derecha ni por la izquierda.

b'00000111'
ActivaSalida

; Gira a la izquierda.

b'00001110'

; Gira a la derecha.

PORTB
Principal

También podría gustarte