Sie sind auf Seite 1von 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

unos

movf PORTA,W; carga el registro del puerto A en (W)

COMF PORTA,W

; Esta instrucción complementa un registro, es decir, los unos por ceros y los ceros por

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 actúa como salida, es controlado por el bit 0 del Puerto A, que actúa como entrada. De manera tal, que:

;Si RA0=1, se encienden todos los LEDs de salida ;Si RA0=0, se encienden sólo 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, ;después de medio segundo deben de apagarse y encenderse los leds conectados a RA1 y RB6,

;medio segundo después, 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

;de Fibonacci. La velocidad del movimiento será fijada por la lectura de 3 switches ;conectados al puerto A de manera que se visualice cada posición durante un tiempo:

;Si (PORTA)=0, cada posición se visualiza durante 0x100 ms=0 ms ;Si (PORTA)=1, cada posición se visualiza durante 1x100 ms=100

;Si (PORTA)=2, cada posición se visualiza durante 2x100 ms=200 ;Si (PORTA)=3, cada posición se visualiza durante 3x100 ms=300 ;Si (PORTA)=4, cada posición se visualiza durante 4x100 ms=400 ;Si (PORTA)=7, cada posición se visualiza durante 7x100 ms=700

233,

es decir los números de la sucesión

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

;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

;define el valo de una cosntante o vector

TablaLongitud

;etiquetas

TablaPosicion

;etiquetas

ContadorTiempo

;etiquetas

GuardaContador

;etiqutas

ENDC

;termina c

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

ORG

0

;indica al compilador que el código por debajo de ella debe

alojarse a partir de la posición 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' movwf PORTA

; El puerto A se configura como entrada. ;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 información válida.

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 movwf TablaLongitud

clrf

TablaPosicion

VisualizaOtraPosicion

; Calcula la longitud de la tabla y la carga en ; este registro que actuará como contador. ; Apunta a la primera posición de la tabla.

movf

TablaPosicion,W

; Aquí posición a leer de la tabla.

call

LeeTabla

; Visualiza la posición 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 posición por visualizar.

decfsz

TablaLongitud,F

; ¿Ha terminado la tabla?

goto

VisualizaOtraPosicion

; No, pues visualiza la siguiente posición.

Fin

goto

Principal

; aplica el bucle infinito desde principal

; Subrutina "LeeTabla" ------------------------------------------------------------------

;

LeeTabla

addwf

PCL,F

TablaInicio

; Indica la posición inicial de la tabla.

retlw

b'00000000'

; Cada uno de los siguientes valores es

retlw

b'00000001'

; forma parte de la sucesion de fibonacci

retlw

b'00000001'

; en binario

retlw

b'00000010'

retlw

b'00000011'

retlw

b'00000101'

retlw

b'00001000'

retlw

b'00001101'

retlw

b'00010101'

retlw

b'00100010'

retlw

b'00110111'

retlw

b'01011001'

retlw

b'10010000'

retlw

b'11101001'

TablaFin

; Indica la posición 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,4…255 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

; Envia a salida del puerto B

goto Bucle2

; Es mas de 255 y envia a la resta

Bucle

movf Numero,W

; mueve numero a W

movwf PORTB CALL Retardo_50ms

goto Rutina

; Mueve w al puerto B ; Llama a retardo de 50 ms

; 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 movwf PORTB

;Envia numero a W

;Envia W al puerto B (salida) ;Llama a retardo de 50 ms

;Manda a la resta

CALL Retardo_50ms goto Bucle2

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 ;

bsf STATUS,RP0; Entra al modo de configuracion de los puertos.

indica a la memoria en que posicion iniciar.

;Conconfiguracion de puertos***********************************

clrf TRISB; Las lineas del púerto 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

movlw d'21'; Mueve numero al registro w movwf Numero ; Mueve Numero a F

;Sale del modo de definicion.

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 número, ;lo manda al pic, y el pic regresa el numero mas 3. Los números ;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 comunicación con el puerto

Principal

Suma

call RS232_LeeDato

movwf GuardaDato

call LCD_Caracter

;Subrutina Suma

movf GuardaDato,W

addlw 3

; Envia a subrutina para leer dato

; Lo envia a GuardaDato

; Se visualiza el dato en pantalla

;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>

INCLUDE <LCD_4BIT.INC> ; Incluye libreria de LCD

INCLUDE <RETARDOS.INC> ; Fin del Programa

; Incluye libreria de conexion

; Incluye la libreria de retardos

;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

;Inicimos el valor de etiquetas.

ENDC

RetornoCarro EQU .13 CambioLinea EQU .10

;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 comunicación con el puerto

Principal

 

movlw Mensaje0

; Mueve Mensaje a W

call RS232_Mensaje

; Llama a subrutina de Mensaje

call Retardo_1s

; Llama a retardo de un 1s

Goto Principal

; Envia a Principal

;Configuración de Mensaje *******************************************************************

Mensajes

Mensaje0

addwf PCL,F

DT RetornoCarro

DT "Hola Mundo"

; Suma PCL a F

; Envia a pantalla un espacio

;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>

INCLUDE <RS232MEN.INC> ;Incluye libreria de conexion INCLUDE <LCD_4BIT.INC> ; Incluye libreria de LCD

INCLUDE <RETARDOS.INC> ; Fin del Programa

; Incluye libreria de conexion

; Incluye la libreria de retardos

;Programa Leds. ;Hacer un programa que desde la computadora mande una señal 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

; Va a guardar el contenido de la tecla pulsada.

MensajeApuntado

; Va a guarda la dirección del mensaje apuntado.

ENDC

#DEFINE

Salida1

PORTB,7

; Define puerto de salidas

#DEFINE

Salida2

PORTB,6

; Define dónde se sitúa cada una de las salidas.

#DEFINE

Salida3

PORTB,5

#DEFINE

Salida4

PORTB,4

#DEFINE

Salida5

PORTB,3

#DEFINE

Salida6

PORTB,2

#DEFINE

Salida7

PORTB,1

#DEFINE

Salida8

PORTB,0

TECLA1_ON

EQU '1'

; Código de las teclas utilizadas.

TECLA1_OFF

EQU '0'

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

ORG 0

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

Inicio

 

call

LCD_Inicializa

; Inicializa el display LCD

call

RS232_Inicializa

; Inicializa RS232

bsf

STATUS,RP0

; Configura como salidas las 8 líneas del

bcf

Salida1

; del Puerto B

bcf

Salida2

bcf

Salida3

bcf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

bcf

STATUS,RP0

Parado

;Sale de la configuracion de puertos

call

;En un pricipio los leds deben estar apagados

Principal

; apagados.

call

RS232_LeeDato

; Espera a recibir un carácter.

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.

movf

TeclaPulsada,W

; Recupera el contenido de la tecla pulsada.

xorlw

TECLA1_OFF

; ¿Es la tecla del movimiento hacia atrás?

btfsc

STATUS,Z

;

goto

R1_OFF

; Sí, se desea movimiento hacia atrás.

goto

Fin

R1_ON

bsf

Salida1

;Mantiene todas las salidas prendidas

bsf

Salida2

bsf

Salida3

bsf

Salida4

bsf

Salida5

 

bsf

Salida6

bsf

Salida7

bsf

Salida8

goto

Fin

R1_OFF

bcf

Salida1

;Mantiene todas las salidas apagadas

bcf

Salida2

bcf

Salida3

bcf

Salida4

 

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

Parado

 

bcf

Salida1

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

bcf

Salida2

bcf

Salida3

bcf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

Fin

return

INCLUDE

<RS232.INC>

;Librerias utilizadas.

INCLUDE <RETARDOS.INC> INCLUDE <LCD_4BIT.INC>

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

; Va a guardar el contenido de la tecla pulsada.

MensajeApuntado

; Va a guarda la dirección del mensaje apuntado.

ENDC

#DEFINE

Salida1

PORTB,7

; Define puerto de salidas

#DEFINE

Salida2

PORTB,6

; Define dónde se sitúa cada una de las salidas.

#DEFINE

Salida3

PORTB,5

#DEFINE

Salida4

PORTB,4

#DEFINE

Salida5

PORTB,3

#DEFINE

Salida6

PORTB,2

#DEFINE

Salida7

PORTB,1

#DEFINE

Salida8

PORTB,0

UnLed

EQU '1'

; Código 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

call

RS232_Inicializa

; Inicializa RS232

bsf

STATUS,RP0

; Configura como salidas las 8 líneas del

bcf

Salida1

; del Puerto B

bcf

Salida2

bcf

Salida3

bcf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

bcf

STATUS,RP0

Parado

;Sale de la configuracion de puertos

call

;En un pricipio los leds deben estar apagados

Principal

; apagados.

call

RS232_LeeDato

; Espera a recibir un carácter.

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.

movf

TeclaPulsada,W

; Recupera el contenido de la tecla pulsada.

xorlw

DosLed

; ¿Es la tecla del movimiento hacia atrás?

btfsc

STATUS,Z

;

goto

L2_ON

; Sí, se desea movimiento hacia atrás.

 

movf

TeclaPulsada,W

; Guarda el contenido de la tecla pulsada.

xorlw

TresLed

; ¿Es la tecla del movimiento hacia adelante?

btfsc

STATUS,Z

L3_ON

;

goto

; Sí, se desea movimiento hacia adelante.

movf

TeclaPulsada,W

CuatroLed

; Guarda el contenido de la tecla pulsada.

xorlw

; ¿Es la tecla del movimiento hacia adelante?

btfsc

STATUS,Z

L4_ON

;

goto

; Sí, se desea movimiento hacia adelante.

 

movf

TeclaPulsada,W

CincoLed

; Guarda el contenido de la tecla pulsada.

xorlw

; ¿Es la tecla del movimiento hacia adelante?

btfsc

STATUS,Z

L5_ON

;

goto

; 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

TeclaPulsada,W

; Guarda el contenido de la tecla pulsada.

xorlw

SieteLed

; ¿Es la tecla del movimiento hacia adelante?

btfsc

STATUS,Z

;

goto

L7_ON

; 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

;Definimos el modo en que deseamos

que se ejecute

 

bsf

Salida1

;cada una de las salidas, desde un solo led encendido

bsf

Salida2

; hasta los 8 mas una rutina donde todos se encuentran

bsf

Salida3

; apagados y otra donde no se realiza alguna accion

bsf

Salida4

bsf

Salida5

bsf

Salida6

bsf

Salida7

bsf

Salida8

goto

Fin

L1_ON

;Un led encendido

bsf

Salida1

bcf

Salida2

bcf

Salida3

bcf

Salida4

 

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

L2_ON

;Dos led encendidos

bsf

Salida1

bsf

Salida2

bcf

Salida3

bcf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

L3_ON

;Tres led encendidos

bsf

Salida1

bsf

Salida2

bsf

Salida3

bcf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

L4_ON

;Cuatro led encendidos

bsf

Salida1

bsf

Salida2

bsf

Salida3

bsf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

L5_ON

;Cinco led encendidos

bsf

Salida1

bsf

Salida2

bsf

Salida3

bsf

Salida4

bsf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

L6_ON

;Seis Led encendidos

bsf

Salida1

bsf

Salida2

 

bsf

Salida3

bsf

Salida4

bsf

Salida5

bsf

Salida6

bcf

Salida7

bcf

Salida8

goto

Fin

L7_ON

;Siete eld encendidos.

bsf

Salida1

bsf

Salida2

bsf

Salida3

bsf

Salida4

bsf

Salida5

bsf

Salida6

bsf

Salida7

bcf

Salida8

goto

Fin

Parado

;Todos apagados

 

bcf

Salida1

bcf

Salida2

 

bcf

Salida3

bcf

Salida4

bcf

Salida5

bcf

Salida6

bcf

Salida7

bcf

Salida8

Lomismo

Fin

return

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

END

;no hace algun cambio.

;Regresa

;Fin del programa

;Programa Motores.

;Dos motores están conectados al pic mediante el driver L293B (usar en la simulación 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 CÓDIGOS *********************************************************************

ORG

0

;El programa incia en el bit cero de la memoria

Inicio

bsf

STATUS,RP0

;Entramos al modo de configuracion de puertos.

bsf

EntradaMarcha

; Configura las líneas de entrada y salida.

bsf

EntradaSentido

bsf

EntradaMarcha2

bsf

EntradaSentido2

bcf

SalidaMarcha

bcf

SalidaSentido

bcf

SalidaMarcha2

bcf

SalidaSentido2

bcf

STATUS,RP0

Principal

btfsc

EntradaMarcha

; Comprueba el estado del interruptor de funcionamiento.

goto

Gira

; Si el interruptor esta encendido, envia a la subrutina.

bcf

SalidaMarcha

; Para el motor, poniendo a cero la línea de habilitacion.

Principal2

btfsc

EntradaMarcha2

; Comprueba el estado del interruptor de funcionamiento.

goto

Gira2

bcf

SalidaMarcha2

; Para el motor, poniendo a cero la línea de habilitacion.

Principal3

btfsc

EntradaSentido

; Comprueba el estado del interruptor de funcionamiento.

goto

Gira3

bcf

SalidaSentido

; Para el motor, poniendo a cero la línea de habilitacion.

Principal4

btfsc

EntradaSentido2

; Comprueba el estado del interruptor de funcionamiento.

goto

Gira4

bcf

SalidaSentido2

; Para el motor, poniendo a cero la línea de habilitacion.

;goto

Fin3

; habilitación y sale.

Gira

bsf

SalidaMarcha

; Pone en marcha el motor.

goto

Fin

Gira2

 

bsf

SalidaMarcha2

; Pone en marcha el motor.

goto

Fin2

Gira3

 

bsf

SalidaSentido

goto

Fin3

Gira4

 

bsf

SalidaSentido2

; Pone en marcha el motor.

goto

Fin4

Fin

;Inicia los bucles infinitos.

goto

Principal2

Fin2

goto

Principal3

 

Fin3

goto

Principal4

 

Fin4

goto

Principal

END

;Laboratorio de Robotica y control ;Programa:Motor compu ;Desde la computadora, dependiendo de la tecla, se obtiene lo siguiente:

;Tecla

Efecto

;1

Enciende todos los motores

;0

Apaga todos los motores

;D

Los motores giran a la derecha

;I

Los motores giran a la izquierda

;M

Un motor gira a la derecha y otro a la izquierda

;L

Los motores se mueven a la mitad de la velocidad máxima

;A

Los motores se mueven a velocidad máxima

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

;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'

movwf GuardaEntrada ; Mueve Numero a F

; Mueve numero al registro w

;Definicion de Teclas

EnciendeTodos

EQU '1'

; Código de las teclas utilizadas.

ApagaTodos

EQU '0'

TodosDerecha

EQU 'd'

TodosIzquierda

EQU 'i'

DerechaIzquierda

EQU 'm'

MitadV

EQU 'l'

MaximaV

EQU 'a'

call

LCD_Inicializa

call

RS232_Inicializa ; Inicia la comunicación con el puerto

Principal

call RS232_LeeDato

call TesteaTeclado

goto Principal

; Envia a subrutina para leer dato

;; Verifica caracter recibido y ejecuta accion

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

;*

Teclado

*

;*

*

 

;*

Verifica caracer recibido y decide que accion ejecutar

*

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

TesteaTeclado

 

movwf

TeclaPulsada

; Guarda el contenido de la tecla pulsada.

xorlw

EnciendeTodos

; ¿Es la tecla del encendido?

btfsc

STATUS,Z

;

goto

TodosEncendidos

; Sí

movf

TeclaPulsada,W

; Recupera el contenido de la tecla pulsada.

xorlw

ApagaTodos

; ¿Es la tecla de todos apagados?

btfsc

STATUS,Z

;

goto

TodosApagados

; 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

; Guarda el contenido de la tecla pulsada.

xorlw

DerechaIzquierda

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

btfsc

STATUS,Z

;

goto

DI

; 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

TeclaPulsada,W

; Guarda el contenido de la tecla pulsada.

xorlw

MaximaV

; ¿Es la tecla de maxima velocidad?

btfsc

STATUS,Z

;

goto

AltaVelocidad

; Sí

TodosEncendidos

movlw b'10100110'

; envia a todos encendidos

 

goto ActivaSalida

; envia a la sailida de puerto

TodosApagados

 

clrf PORTB

; Apaga los motores

goto ActivaSalida

; envia a salida de puerto

Derecha

 

movlw b'10100110'

; Los motores hacia la derecha

goto ActivaSalida

; envia a la salida de puerto

Izquierda

 

movlw b'01100101'

; los dos motores hacia la izquierda

goto ActivaSalida

; encia a salida de puerto

DI

 

movlw b'01100110'

; Un motor hacia la derecha y otro en direccion opuesta

goto ActivaSalida

;

envia salida de puerto

MediaVelocidad

movlw Ciclos_OFF

movf GuardaEntrada,W; envia guardar dato a w

movwf Ciclos_ON

; Mueve ciclos a w

; Envia ciclos on a f

motor_ON

 

movlw b'10100110'

;Enciende los motores

movwf PORTB call Retardo_5ms decfsz Ciclos_ON,F goto motor_ON+2

; 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

AltaVelocidad

movlw b'10100110'

goto ActivaSalida

;Enciende los dos motores a maxima velocidad

; Envia a Salida del puerto

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

ActivaSalida

movwf PORTB

;Manda a la salida del puerto B

return

;termina subrutina Crea un bucle cerrado e infinito

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

; Incluye libreria de conexion

END

; 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 EntradaSentido PORTA,1

;Define el puerto y su utilización (encendido o apagado)

;Define el puerto y su utilización (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

;Con esta combinacion se detiene el motor

btfsc EntradaMarcha

goto ActivaSalida

;Comprueba el estado del interruptor de funcionamiento

movlw b'00000110'

btfsc EntradaSentido

ActivaSalida

movlw b'00000101'

;Gira en un sentido

;Gira en otro sentido

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 línea negra

;

marcada sobre fondo blanco a modo de pista.

;

;

Los sensores ópticos de reflexión CNY70 están 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 línea 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 línea 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 línea, se le hace girar a la izquierda

;

hasta que vuelva a encontrarla.

;

;

La señal de los sensores CNY70 se aplican a las entradas del microcontrolador a través 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 línea negra, se ha salido de la pista)

;

- Color Negro

--> transistor en corte --> entrada al inversor "1" --> RAx = "0".

;

(Está encima de la línea negra, está dentro de la pista)

;

;

ZONA DE DATOS **********************************************************************

CONFIG

_CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST

INCLUDE <P16F84A.INC>

P=16F84A

#DEFINE SensorDerecha

PORTA,0

; Sensor óptico Derecho.

#DEFINE SensorIzquierda

PORTA,1

; Sensor óptico Izquierdo.

; ZONA DE CÓDIGOS ********************************************************************

Inicio

ORG

bsf

bsf

0

STATUS,RP0

SensorDerecha

; Selecciona Banco 1 de registros. ; Estas líneas se configuran como entrada.

bsf

SensorIzquierda

clrf

PORTB

; Las líneas del Puerto B se configuran como salidas.

bcf

STATUS,RP0

; Selecciona Banco 0 de registros.

Principal

movlw b'00001110'

movlw b'00001110'

btfss

goto

SensorDerecha

ActivaSalida

movlw b'00000111' btfss SensorIzquierda movlw b'00001111' ActivaSalida movwf PORTB

movlw b'00000111' btfss SensorIzquierda movlw b'00001111' ActivaSalida movwf PORTB

; Para girar a la derecha. ; ¿Ha salido por la derecha?, ¿detecta blanco? ; No, el detector derecho está encima de la línea ; negra, gira a la derecha. ; Para girar a la izquierda. ; ¿Ha salido también por la izquierda? ; No, está en el borde derecho. Sigue recto.

; Para girar a la izquierda. ; ¿Ha salido también por la izquierda? ; No, está
; Para girar a la izquierda. ; ¿Ha salido también por la izquierda? ; No, está
; Para girar a la izquierda. ; ¿Ha salido también por la izquierda? ; No, está

goto

Principal

END

;Robotica y control. ;Programa:robot baliza

;

Programa de control para Microbot TRASTO el cual detecta una baliza que genera

;

una señal infrarroja modulada a 38 kHz.

;

;

Los sensores ópticos SFH5110 están 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

;

línea de salida.

;

;

El programa adopta la estrategia siguiente:

;

- Si no se detecta la baliza por ningún 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

INCLUDE <P16F84A.INC>

P=16F84A

#DEFINE SensorDerecha

PORTA,2

; Sensor Derecho.

#DEFINE SensorIzquierda

PORTA,3

; Sensor Izquierdo.

; ZONA DE CÓDIGOS *********************************************************************

 

ORG

0

Inicio

 

bsf

STATUS,RP0

; Selecciona Banco 1 de registros.

bsf

SensorDerecha

; Estas líneas se configuran como entrada.

bsf

SensorIzquierda

clrf

PORTB

; Las líneas del Puerto B se configuran como salidas.

bcf

STATUS,RP0

; Selecciona Banco 0 de registros.

Principal

btfsc

SensorDerecha

; ¿Ha detectado señal por la derecha?

goto

Ver_Izquierda

; No recibe por la derecha.

btfsc

SensorIzquierda

; Sí, ¿también señal por la izquierda?

goto

GiroDerecha

; No, solo señal por la derecha, gira a derecha.

movlw b'00001111'

; Sí, recibe por los dos sensores. Sigue recto.

goto

ActivaSalida

Ver_Izquierda

btfsc

SensorIzquierda

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

goto

GiroDerecha

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

GiroIzquierda

movlw b'00000111'

goto

ActivaSalida

GiroDerecha movlw b'00001110'

ActivaSalida movwf PORTB

goto

Principal

END

; Gira a la izquierda.

; Gira a la derecha.