Uso de las tablas en lenguaje ensamblador

29
DIAGRAMAS DE FLUJO PARA RUTINAS DE RETARDO DE 1 HASTA 60 MINUTOS DIAGRAMA DE FLUJO PARA CERROJO AUTOMÁTICO SI ¿CONTACERR= 200? CONTACERR= CONTACERR +1 NO Delay 15 msegundos IR A PARADA Delay 15 msegundos La sacamos del PDEL Return ¿Ocurrió condición? NO SI TAREA1 TAREA2 CERROJO TRADICIONAL CERROJO AUTOMÁTICO ¿Ocurrió condición? SI TAREA1 TAREA2 Inicializar registro: CONTACERR=0 NO

Transcript of Uso de las tablas en lenguaje ensamblador

Page 1: Uso de las tablas en lenguaje ensamblador

DIAGRAMAS DE FLUJO PARA RUTINAS DE RETARDO DE 1 HASTA 60 MINUTOS

DIAGRAMA DE FLUJO PARA CERROJO AUTOMÁTICO

SI

¿CONTACERR=200?

CONTACERR=CONTACERR +1

NO

Delay 15msegundos

IR A PARADA

Delay 15msegundos

La sacamos del PDEL

Return

¿Ocurriócondición?

NO

SI

TAREA1

TAREA2

CERROJOTRADICIONAL

CERROJOAUTOMÁTICO

¿Ocurriócondición?

SI

TAREA1

TAREA2

Inicializar registro:CONTACERR=0

NO

Page 2: Uso de las tablas en lenguaje ensamblador

¿Cuánto tiempo pasa para salir del cerrojo?

CONTACERR se incrementará hasta 200, y por cada incremento se debe esperar 15

milisegundos, es decir=

Tiempo de espera en cerrojo= 15mseg*200= 3 segundos.

Este tiempo puede ajustarse según sea el diseño que se esté realizando.

USO DE LAS TABLAS EN LENGUAJE ENSAMBLADOR

Las tablas nos permiten extraer valores para ser utilizados en otras tareas, tales

como la visualización de datos, linealización de valores, conversión de códigos, etc.

Su aplicación era principalmente para el uso de los sistemas contadores en conjunto

con la multiplexación de displays, sin el uso de un decodificador BCD a 7 segmentos; sin

embargo, pueden servir para semáforos, sistemas de monitoreo, aplicaciones

residenciales, entre otras.

Su funcionamiento se basa en la manipulación del contador de programa (PC)

mediante la suma de un dato a extraer de la tabla (registro) y la parte baja del contador de

programa (PCL). Para un rango máximo de 256 valores, se manipula directamente el PCL.

En caso de valores superiores, se debe manipular adicionalmente el PCLATH, que amplía la

capacidad de datos en una tabla.

La instrucción RETLW K (Retorna de la subrutina y carga en W el valor constante k),

está muy asociada a las tablas, ya que cuando se llama a una subrutina “tabla”, esta

instrucción regresa de la subrutina y a su vez extrae el valor de la misma previamente

seleccionada por el puntero de tabla.

Normalmente, cuando se llama a una subrutina “tabla”, previamente se carga el

valor del dato a sacar de la tabla. Dentro de la subrutina “tabla”, el dato a sacar, se suma al

PCL que es el encabezado o puntero de la tabla, “saltando” al valor correspondiente

indicado por el dato que se desea extraer de la tabla.

En la siguiente imagen, supongamos que se desea sacar el valor del registro UNIDAD

(supongamos que UNIDAD= 5 al momento de ejecutar el llamado a la tabla), por lo que se

le sumará UNIDAD + PCL (5+PCL ubicado en el puntero o encabezado de la tabla), y éste

saltará desde el encabezado al valor de la UNIDAD (que vale 5 para este ejemplo) y W

retornará con ese valor cargado (W=’Valor5’).

Page 3: Uso de las tablas en lenguaje ensamblador

Cuando se trabaja con displays y la respectiva multiplexación es un estándar utilizar

los siguientes códigos o extractos de un programa:

movf DATO,0 ;DATO pasa a W. es el dato que se

call TABLA ;quiere extraer de la tabla

; Después que se regresa de la tabla con el valor del registro

; “DATO”, se saca este valor y se pasa a la salida del puerto

; que está controlando los 7 sgmentos de los displays.

movwf PORTB ;o puede ser PORTC o D, según el PIC

Es importante resaltar que el uso de las tablas elimina tener que utilizar un

decodificador y permite mostrar números, letras y algunos símbolos al manipular

directamente los 7 segmentos de un display.

Veamos los siguientes ejemplos del uso de las tablas en programas con estructura

de contadores y multiplexación de displays.

Page 4: Uso de las tablas en lenguaje ensamblador

Ejemplo 1. Contador de 2 cifras estándar (00 a 99).

El diagrama de flujo es el mismo de contador ascendente de 2 cifras en la guía 3_2 de

microcontroladores I, de Rutinas intermedias.

Programa en Lenguaje Ensamblador:

LIST P=16F877A

INCLUDE P16F877A.INC

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

;DECLARACIÓN DE REGISTROS=

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

UNI EQU 20H

DEC EQU 21H

COPIA EQU 26H

PDel0 EQU 27H

CONTADOR EQU 28H

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

ORG 00H

GOTO INICIO

INICIO BSF STATUS,5

MOVLW B'00000110'

MOVWF ADCON1

CLRF TRISA

MOVLW B'00001111'

MOVWF TRISB

CLRF TRISC

BCF STATUS,5

CLRF UNI

CLRF DEC

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

;CONTADOR CLÁSICO DE 00 A 99

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

EME CALL MOSTRAR

BTFSC PORTB,0 ;+1=0?

GOTO EME ;NO. VA A EXPLORAR DE NUEVO

ANTIREB1 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,0 ;+1=1?

GOTO ANTIREB1

MOVF UNI,0 ;UNI A W

SUBLW .9

Page 5: Uso de las tablas en lenguaje ensamblador

BTFSS STATUS,2 ;Z=1? UNI=9?

GOTO SUBEUNI

GOTO DECENA

SUBEUNI INCF UNI,1 ;UNI=UNI+1

GOTO EME

DECENA CLRF UNI

MOVF DEC,0 ;DEC A W

SUBLW .9

BTFSS STATUS,2 ;Z=1? DEC=9?

GOTO SUBEDEC

CLRF DEC

CLRF UNI

GOTO EME

SUBEDEC INCF DEC,1 ;DEC=DEC+1

GOTO EME

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

;RUTINA MOSTRAR(INCLUYE CONVERSIONES BINARIO A BCD)

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

MOSTRAR BCF PORTB,5 ;DISPLAY DEC OFF

BSF PORTB,4 ;DISPLAY UNI ON

;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=

;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)

MOVF UNI,0 ;UNI A W

CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR DE UNI

MOVWF PORTC ;UNI ES SACADO HACIA LA TABLA

;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

;MOVF UNI,0

;MOVWF PORTA ;UNIV A PORTA

CALL DELAY5MS

BSF PORTB,5 ;DISPLAY DEC ON

BCF PORTB,4 ;DISPLAY UNI OFF

;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=

;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)

MOVF DEC,0 ;DEC A W

CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR DE DEC

MOVWF PORTC ;DEC ES SACADO HACIA LA TABLA

;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=

Page 6: Uso de las tablas en lenguaje ensamblador

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

;MOVF

;MOVWF

CALL DELAY5MS

RETURN

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

;**********************SUBRUTINA DE TABLA************************

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

;CONVIERTE DATO BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR

;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE

;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'

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

;IMPORTANTE: ¿PARA QUÉ SON ESTOS VA

;TOMEMOS EL PRIMERO= B’11000000’, RECORDANDO QUE ESTE DATO VA A SALIR

;POR UN PUERTO DE 8 BITS, SEA EL PORTB, PORTC O PORTD HACIA LOS 7 SEGMENTOS

;DE UN DISPLAY ÁNODO COMÚN:

;VEMOS QUE SE HA FORMADO EL CERO (0) Y ASÍ PA

;SE VERÁ EN EL EJEMPLO 3.

TABLA ADDWF

RETLW

RETLW

RETLW

RETLW

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

DEC,0

PORTA ;DECV A PORTA

DELAY5MS

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

;**********************SUBRUTINA DE TABLA************************

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

BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR

;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE

;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'

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

;IMPORTANTE: ¿PARA QUÉ SON ESTOS VALORES QUE SE MUESTRAN EN LA TABLA?

;TOMEMOS EL PRIMERO= B’11000000’, RECORDANDO QUE ESTE DATO VA A SALIR

;POR UN PUERTO DE 8 BITS, SEA EL PORTB, PORTC O PORTD HACIA LOS 7 SEGMENTOS

;DE UN DISPLAY ÁNODO COMÚN:

;VEMOS QUE SE HA FORMADO EL CERO (0) Y ASÍ PARA CADA NÚMERO O LETRA COMO

;SE VERÁ EN EL EJEMPLO 3.

PCL,1

B'11000000' ;VALOR 0

B'11111001' ;VALOR 1

B'10100100' ;VALOR 2

B'10110000' ;VALOR 3

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

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

;**********************SUBRUTINA DE TABLA************************

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

BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR

;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE

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

LORES QUE SE MUESTRAN EN LA TABLA?

;TOMEMOS EL PRIMERO= B’11000000’, RECORDANDO QUE ESTE DATO VA A SALIR

;POR UN PUERTO DE 8 BITS, SEA EL PORTB, PORTC O PORTD HACIA LOS 7 SEGMENTOS

RA CADA NÚMERO O LETRA COMO

Page 7: Uso de las tablas en lenguaje ensamblador

RETLW B'10011001' ;VALOR 4

RETLW B'10010010' ;VALOR 5

RETLW B'10000011' ;VALOR 6

RETLW B'11111000' ;VALOR 7

RETLW B'10000000' ;VALOR 8

RETLW B'10011000' ;VALOR 9

;;;RUTINA 5MS GENERADA DEL PDEL;

DELAY5MS movlw .248 ; 1 set numero de repeticion

movwf PDel0 ; 1 |

PLoop0 clrwdt ; 1 clear watchdog

decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?

goto PLoop0 ; 2 no, loop

PDelL1 goto PDelL2 ; 2 ciclos delay

PDelL2 clrwdt ; 1 ciclo delay

return ; 2+2 Fin.

END

Circuito en Proteus:

Page 8: Uso de las tablas en lenguaje ensamblador

Ejemplo 2. Marcador para cancha de Bolas criollas.

Es el mismo ejercicio pero sin el uso del decodificador. Se migró a un PIC16F877 por no

alcanzar los pines del PIC16F84A. Asumir el mismo diagrama de flujo. Lo que varia es la

rutina de mostrar, ya que no se utiliza el decodificador.

Programa en Lenguaje Ensamblador:

LIST P=16F877A

INCLUDE P16F877A.INC

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

;DECLARACIÓN DE REGISTROS=

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

UNIV EQU 20H

DECV EQU 21H

UNIR EQU 22H

DECR EQU 23H

CONTAV EQU 24H

CONTAR EQU 25H

COPIA EQU 26H

PDel0 EQU 27H

CONTADOR EQU 28H

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

ORG 00H

GOTO INICIO

INICIO BSF STATUS,5

MOVLW B'00000110'

MOVWF ADCON1

CLRF TRISA

MOVLW B'00001111'

MOVWF TRISB

CLRF TRISC

BCF STATUS,5

CLRF UNIV

CLRF DECV

CLRF UNIR

CLRF DECR

CLRF CONTAV

CLRF CONTAR

EME CALL MOSTRAR

Page 9: Uso de las tablas en lenguaje ensamblador

BTFSC PORTB,0 ;+1V=0?

GOTO SIGUE1 ;NO. VA A -1V

ANTIREB1 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,0 ;+1V=1?

GOTO ANTIREB1

MOVF CONTAV,0

SUBLW .24

BTFSS STATUS,2 ;Z=1? CONTAV=24?

GOTO SUBEV

GOTO EME

SUBEV INCF CONTAV,1 ;CONTAV=CONTAV+1

GOTO EME

SIGUE1 BTFSC PORTB,1 ;-1V=0?

GOTO SIGUE2 ;VA A +1R

ANTIREB2 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,1 ;-1V=1?

GOTO ANTIREB2

MOVF CONTAV,0

SUBLW .0

BTFSS STATUS,2 ;Z=1? CONTAV=0?

GOTO BAJAV

GOTO EME

BAJAV DECF CONTAV,1 ;CONTAV=CONTAV-1

GOTO EME

SIGUE2 BTFSC PORTB,2 ;+1R=0?

GOTO SIGUE3 ;NO. VA A -1R

ANTIREB3 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,2 ;+1R=1?

GOTO ANTIREB3

MOVF CONTAR,0

SUBLW .24

BTFSS STATUS,2 ;Z=1? CONTAR=24?

GOTO SUBER

GOTO EME

SUBER INCF CONTAR,1 ;CONTAR=CONTAR+1

GOTO EME

SIGUE3 BTFSC PORTB,3 ;-1R=0?

GOTO EME

Page 10: Uso de las tablas en lenguaje ensamblador

ANTIREB4 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,3 ;-1R=1?

GOTO ANTIREB4

MOVF CONTAR,0

SUBLW .0

BTFSS STATUS,2 ;Z=1? CONTAR=0?

GOTO BAJAR

GOTO EME

BAJAR DECF CONTAR,1 ;CONTAR=CONTAR-1

GOTO EME

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

;RUTINA MOSTRAR(INCLUYE CONVERSIONES BINARIO A BCD)

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

MOSTRAR CALL BIN_BCDV

CALL BIN_BCDR

BCF PORTB,7 ;DISPLAY DECROJO OFF

BCF PORTB,6 ;DISPLAY UNIROJO OFF

BCF PORTB,5 ;DISPLAY DECVERDE OFF

BSF PORTB,4 ;DISPLAY UNIVERDE ON

;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=

;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)

MOVF UNIV,0 ;UNIV A W

CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR UNIV

MOVWF PORTC ;UNIV SE MUESTRA POR EL PORTC

;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

;MOVF UNIV,0

;MOVWF PORTA ;UNIV A PORTA

CALL DELAY5MS

BCF PORTB,7 ;DISPLAY DECROJO OFF

BCF PORTB,6 ;DISPLAY UNIROJO OFF

BSF PORTB,5 ;DISPLAY DECVERDE ON

BCF PORTB,4 ;DISPLAY UNIVERDE OFF

;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=

;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)

MOVF DECV,0 ;DECV A W

CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR DECV

MOVWF PORTC ;DECV SE MUESTRA POR EL PORTC

Page 11: Uso de las tablas en lenguaje ensamblador

;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

;MOVF DECV,0

;MOVWF PORTA ;DECV A PORTA

CALL DELAY5MS

BCF PORTB,7 ;DISPLAY DECROJO OFF

BSF PORTB,6 ;DISPLAY UNIROJO ON

BCF PORTB,5 ;DISPLAY DECVERDE OFF

BCF PORTB,4 ;DISPLAY UNIVERDE OFF

;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=

;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)

MOVF UNIR,0 ;UNIR A W

CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR UNIR

MOVWF PORTC ;UNIR SE MUESTRA POR EL PORTC

;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

;MOVF UNIR,0

;MOVWF PORTA ;UNIR A PORTA

CALL DELAY5MS

BSF PORTB,7 ;DISPLAY DECROJO ON

BCF PORTB,6 ;DISPLAY UNIROJO OFF

BCF PORTB,5 ;DISPLAY DECVERDE OFF

BCF PORTB,4 ;DISPLAY UNIVERDE OFF

;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=

;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)

MOVF DECR,0 ;DECR A W

CALL TABLA ; W VA A TABLA Y REGRESA CON VALOR DECR

MOVWF PORTC ;DECR SE MUESTRA POR EL PORTC

;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=

;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)

;MOVF DECR,0

;MOVWF PORTA ;DECR A PORTA

CALL DELAY5MS

RETURN

Page 12: Uso de las tablas en lenguaje ensamblador

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

;RUTINA DE BINARIO A BCD VERDE:

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

BIN_BCDV CLRF UNIV

CLRF DECV

CLRF COPIA

MOVF CONTAV,0

MOVWF COPIA

SUBEDV MOVLW .10

SUBWF COPIA,1

BTFSC STATUS,0

GOTO SUBEDECV

GOTO SUBEUV

SUBEDECV INCF DECV,1

GOTO SUBEDV

SUBEUV MOVLW .10

ADDWF COPIA,1

SUBEU2V MOVLW .1

SUBWF COPIA,1

BTFSS STATUS,0

RETURN

SUBEU3V INCF UNIV,1

GOTO SUBEU2V

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

;RUTINA DE BINARIO A BCD ROJO:

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

BIN_BCDR CLRF UNIR

CLRF DECR

CLRF COPIA

MOVF CONTAR,0

MOVWF COPIA

SUBEDR MOVLW .10

SUBWF COPIA,1

BTFSC STATUS,0

GOTO SUBEDECR

GOTO SUBEUR

SUBEDECR INCF DECR,1

GOTO SUBEDR

Page 13: Uso de las tablas en lenguaje ensamblador

SUBEUR MOVLW .10

ADDWF COPIA,1

SUBEU2R MOVLW .1

SUBWF COPIA,1

BTFSS STATUS,0

RETURN

SUBEU3R INCF UNIR,1

GOTO SUBEU2R

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

;**********************SUBRUTINA DE TABLA************************

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

;CONVIERTE DATO BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR

;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE

;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'

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

TABLA ADDWF PCL,1

RETLW B'11000000' ;VALOR 0

RETLW B'11111001' ;VALOR 1

RETLW B'10100100' ;VALOR 2

RETLW B'10110000' ;VALOR 3

RETLW B'10011001' ;VALOR 4

RETLW B'10010010' ;VALOR 5

RETLW B'10000011' ;VALOR 6

RETLW B'11111000' ;VALOR 7

RETLW B'10000000' ;VALOR 8

RETLW B'10011000' ;VALOR 9

;;;RUTINA 5MS GENERADA DEL PDEL;

DELAY5MS movlw .248 ; 1 set numero de repeticion

movwf PDel0 ; 1 |

PLoop0 clrwdt ; 1 clear watchdog

decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?

goto PLoop0 ; 2 no, loop

PDelL1 goto PDelL2 ; 2 ciclos delay

PDelL2 clrwdt ; 1 ciclo delay

return ; 2+2 Fin.

END

Page 14: Uso de las tablas en lenguaje ensamblador

Circuito en Proteus:

Ejemplo 3. Contador de 3 etapas.

Para este ejemplo se asume que cada etapa va a contar 6 eventos. Este número

puede ser modificado a gusto del usuario. Aquí se introduce el uso de las letras que es

una de las ventajas de no utilizar decodificadores, ya que estos limitan la visualización del

0 al 9.

En cada etapa, se muestra un mensaje de 2 letras y al lado el contador de los

eventos.

Se muestra una tabla en la que contiene lo que considero pueden ser la tabla más

completa de números, letras y algunos símbolos que pueden mostrarse en un display

convencional de 7 segmentos.

El diagrama de flujo es simple. A continuación:

RB0= +1

RB4= DISPLAY UNI

RB5= DISPLAY DEC

RB6= DISPLAY LETRA1

RB7= DISPLAY LETRA2

PORTC= SALIDA A LOS SEGMENTOS

Page 15: Uso de las tablas en lenguaje ensamblador

Programa en Lenguaje Ensamblador:

LIST P=16F877A

INCLUDE P16F877A.INC

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

;DECLARACIÓN DE REGISTROS=

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

UNI EQU 20H

DEC EQU 21H

LETRA1 EQU 22H

LETRA2 EQU 23H

CONTA EQU 24H

COPIA EQU 26H

PDel0 EQU 27H

PDel0A EQU 29H

PDel1 EQU 2AH

CONTADOR EQU 28H

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

Page 16: Uso de las tablas en lenguaje ensamblador

ORG 00H

GOTO INICIO

INICIO BSF STATUS,5

MOVLW B'00000110'

MOVWF ADCON1

CLRF TRISA

MOVLW B'00001111'

MOVWF TRISB

CLRF TRISC

BCF STATUS,5

CLRF UNI

CLRF DEC

CLRF CONTADOR

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

;MENSAJE DE INICIO CON TODAS LAS LETRAS

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

;ESTE MENSAJE MUESTRA TODOS LOS NÚMEROS Y LETRAS DE LA TABLA

ENTRADAMSJ CALL MOSTRAR2

MOVF CONTADOR,0

SUBLW .37

BTFSS STATUS,2

GOTO SUBELETRA

CLRF CONTADOR

GOTO ETAPA1

SUBELETRA INCF CONTADOR,1

CALL RET05S

GOTO ENTRADAMSJ

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

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

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

ETAPA1 MOVLW .26

MOVWF LETRA2

MOVLW .14

MOVWF LETRA1

EME CALL MOSTRAR

BTFSC PORTB,0 ;+1=0?

GOTO EME ;NO. SIGUE PREGUNTANDO POR SENSOR

ANTIREB1 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

Page 17: Uso de las tablas en lenguaje ensamblador

BTFSS PORTB,0 ;+1=1?

GOTO ANTIREB1

MOVF CONTA,0

SUBLW .6

BTFSS STATUS,2 ;Z=1? CONTA=24?

GOTO SUBE

GOTO ETAPA2

SUBE INCF CONTA,1 ;CONTA=CONTA+1

GOTO EME

ETAPA2 CLRF CONTA

MOVLW .35

MOVWF LETRA1

MOVLW .1

MOVWF LETRA2

EME2 CALL MOSTRAR

BTFSC PORTB,0 ;+1=0?

GOTO EME2 ;NO. SIGUE PREGUNTANDO POR SENSOR

ANTIREB2 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,0 ;+1=1?

GOTO ANTIREB2

MOVF CONTA,0

SUBLW .6

BTFSS STATUS,2 ;Z=1? CONTA=24?

GOTO SUBE2

GOTO ETAPA3

SUBE2 INCF CONTA,1 ;CONTA=CONTA+1

GOTO EME2

ETAPA3 CLRF CONTA

MOVLW .23

MOVWF LETRA1

MOVLW .20

MOVWF LETRA2

EME3 CALL MOSTRAR

BTFSC PORTB,0 ;+1=0?

GOTO EME3 ;NO. SIGUE PREGUNTANDO POR SENSOR

ANTIREB3 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS

BTFSS PORTB,0 ;+1=1?

GOTO ANTIREB3

Page 18: Uso de las tablas en lenguaje ensamblador

MOVF CONTA,0

SUBLW .6

BTFSS STATUS,2 ;Z=1? CONTA=24?

GOTO SUBE3

CLRF CONTA

GOTO ETAPA1

SUBE3 INCF CONTA,1 ;CONTA=CONTA+1

GOTO EME3

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

;****************RUTINA MOSTRAR******************

;****************INCLUYE (NÚMEROS)****************

;****************INCLUYE (LETRAS)*******************

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

MOSTRAR CALL BIN_BCD

BCF PORTB,7 ;DISPLAY LETRADEC OFF

BCF PORTB,6 ;DISPLAY LETRAUNI OFF

BCF PORTB,5 ;DISPLAY CONTADEC OFF

BSF PORTB,4 ;DISPLAY CONTAUNI ON

MOVF UNI,0

CALL TABLA

MOVWF PORTC

CALL DELAY5MS

BCF PORTB,7 ;DISPLAY LETRADEC OFF

BCF PORTB,6 ;DISPLAY LETRAUNI OFF

BSF PORTB,5 ;DISPLAY CONTADEC ON

BCF PORTB,4 ;DISPLAY CONTAUNI OFF

MOVF DEC,0

CALL TABLA

MOVWF PORTC

CALL DELAY5MS

BCF PORTB,7 ;DISPLAY LETRADEC OFF

BSF PORTB,6 ;DISPLAY LETRAUNI ON

BCF PORTB,5 ;DISPLAY CONTADEC OFF

BCF PORTB,4 ;DISPLAY CONTAUNI OFF

MOVF LETRA1,0

CALL TABLA

MOVWF PORTC

Page 19: Uso de las tablas en lenguaje ensamblador

CALL DELAY5MS

BSF PORTB,7 ;DISPLAY LETRADEC ON

BCF PORTB,6 ;DISPLAY LETRAUNI OFF

BCF PORTB,5 ;DISPLAY CONTADEC OFF

BCF PORTB,4 ;DISPLAY CONTAUNI OFF

MOVF LETRA2,0

CALL TABLA

MOVWF PORTC

CALL DELAY5MS

RETURN

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

;MUESTRA LETRAS Y SÍMBOLOS EN TODOS LOS DISPLAYS

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

MOSTRAR2 BSF PORTB,7 ;DISPLAY LETRADEC ON

BSF PORTB,6 ;DISPLAY LETRAUNI ON

BSF PORTB,5 ;DISPLAY CONTADEC ON

BSF PORTB,4 ;DISPLAY CONTAUNI ON

MOVF CONTADOR,0

CALL TABLA

MOVWF PORTC

RETURN

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

;RUTINA DE BINARIO A BCD CONTADOR:

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

BIN_BCD CLRF UNI

CLRF DEC

CLRF COPIA

MOVF CONTA,0

MOVWF COPIA

SUBED MOVLW .10

SUBWF COPIA,1

BTFSC STATUS,0

GOTO SUBEDEC

GOTO SUBEU

SUBEDEC INCF DEC,1

GOTO SUBED

SUBEU MOVLW .10

ADDWF COPIA,1

Page 20: Uso de las tablas en lenguaje ensamblador

SUBEU2 MOVLW .1

SUBWF COPIA,1

BTFSS STATUS,0

RETURN

SUBEU3 INCF UNI,1

GOTO SUBEU2

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

;********SUBRUTINA DE TABLA DE NUMEROS, LETRAS Y SIMBOLOS*********

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

;MUESTRA VARIAS LETRAS O SÍMBOLOS QUE SE PUEDEN MOSTRAR EN DISPLAY

;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE

;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'

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

TABLA ADDWF PCL,1 ;PUNTERO O ENCABEZADO DE LA TABLA

RETLW B'11000000' ;0. VALOR 0

RETLW B'11111001' ;1. VALOR 1

RETLW B'10100100' ;2. VALOR 2

RETLW B'10110000' ;3. VALOR 3

RETLW B'10011001' ;4. VALOR 4

RETLW B'10010010' ;5. VALOR 5

RETLW B'10000011' ;6. VALOR 6

RETLW B'11111000' ;7. VALOR 7

RETLW B'10000000' ;8. VALOR 8

RETLW B'10011000' ;9. VALOR 9

RETLW B'10001000' ;10. A

RETLW B'10000011' ;11. b

RETLW B'11000110' ;12. C

RETLW B'10100001' ;13. d

RETLW B'10000110' ;14. E

RETLW B'10001110' ;15. F

RETLW B'10010000' ;16. g

RETLW B'10001001' ;17. H

RETLW B'11001111' ;18. I

RETLW B'11100001' ;19. J

RETLW B'11000111' ;20. L

RETLW B'10101011' ;21. n

RETLW B'10100011' ;22. o

RETLW B'10001100' ;23. P

Page 21: Uso de las tablas en lenguaje ensamblador

RETLW B'10101111' ;24. r

RETLW B'10010010' ;25. S

RETLW B'11000001' ;26. U

RETLW B'10010001' ;27. Y

RETLW B'10101011' ;28. SIMBOLO1

RETLW B'10101010' ;29. SIMBOLO2

RETLW B'11001001' ;30. SIMBOLO3

RETLW B'11011100' ;31. SIMBOLO4

RETLW B'11110000' ;32. SIMBOLO5

RETLW B'10011100' ;33. SIMBOLO6

RETLW B'10110110' ;34. SIMBOLO NIVEL ALTO

RETLW B'10110111' ;35. SIMBOLO NIVEL MEDIO

RETLW B'11110111' ;36. SIMBOLO NIVEL BAJO

;LÍMITE DE TABLA2= 37 (DEL 0 AL 36)

;;;RUTINA 5MS GENERADA DEL PDEL;

DELAY5MS movlw .248 ; 1 set numero de repeticion

movwf PDel0 ; 1 |

PLoop0 clrwdt ; 1 clear watchdog

decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?

goto PLoop0 ; 2 no, loop

PDelL1 goto PDelL2 ; 2 ciclos delay

PDelL2 clrwdt ; 1 ciclo delay

return ; 2+2 Fin.

;;;RUTINA 0,5SEG GENERADA DEL PDEL

RET05S NOP

ret5 movlw .245 ; 1 set numero de repeticion (B)

movwf PDel0A ; 1 |

PLoop1X movlw .254 ; 1 set numero de repeticion (A)

movwf PDel1 ; 1 |

PLoop2X clrwdt ; 1 clear watchdog

decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)

goto PLoop2X ; 2 no, loop

decfsz PDel0A, 1 ; 1 + (1) es el tiempo 0 ? (B)

goto PLoop1X ; 2 no, loop

PDelL1X goto PDelL2X ; 2 ciclos delay

PDelL2X clrwdt ; 1 ciclo delay

Page 22: Uso de las tablas en lenguaje ensamblador

return

END ; FIN DEL PROGRAMA

Circuito en Proteus:

Page 23: Uso de las tablas en lenguaje ensamblador

Ejemplo 4. Semáforo 4 esquinas simple.

En este ejemplo se muestra el uso de dos tablas, una para mostrarse por el puerto A y otra

para mostrarse por el puerto B. Ambos puertos manipulan los 12 bombillos que poseería el

semáforo 4 esquinas.

El diagrama de flujo muestra los estados de tiempo largo, cuando el semáforo esta en rojo

o en verde y los estados de tiempo corto, cuando está en amarillo.

Este ejemplo es limitado a un semáforo sencillo de 4 esquinas, sin embargo puede

modificarse separando cada etapa con tiempos distintos a los que se muestran a

continuación.

Page 24: Uso de las tablas en lenguaje ensamblador

Diagrama de flujo

INICIO

ConfigurarPuerto A y B

Declarar registro:CONTA, CONTA2,PDel0, PDel1

¿Se pulsóINICIO?

CONTA= CONTA +1

NO

SI

SI

Inicializar registros:CONTA, CONTA2

Puerto A y B

Delay 30 seg

¿CONTA=7?

CONTA= 0

1

MOSTRAR

CONTA → W

W → PORTB

Return

TABLA1

TABLA1

W + PCL → PCL

Return

Retornamos con el valoren W extraido de la tabla

correspondiente alPuerto B

MOSTRAR

MOSTRAR

Delay 5 seg

1

CONTA= CONTA +1

1

NO

CONTA → W

W → PORTA

TABLA2 TABLA2

W + PCL → PCL

Return

Retornamos con el valoren W extraido de la tabla

correspondiente alPuerto A

Page 25: Uso de las tablas en lenguaje ensamblador

LIST P=16F84A

INCLUDE P16F84A.INC

CONTA EQU 20H ;Registro contador de estados del semáforo

CONTA2 EQU 21H ;Registro para las rutinas de tiempo de 30 y 5 segundos

PDel0 EQU 22H ;Registros para las rutinas de tiempo de 1 segundo

PDel1 EQU 23H

PDel2 EQU 24H

ORG 00H

GOTO INICIO

INICIO BSF STATUS,5

CLRF TRISB ;Puerto B como salida

MOVLW B'00010000' ;RA4= Entrada y el Resto como salidas

MOVWF TRISA

BCF STATUS,5

Delay 30 seg

SI

Inicializar registro:CONTA2

¿CONTA2=29?CONTA2= CONTA2 +1NO

Delay 1 seg

Return

Delay 5 seg

SI

Inicializar registro:CONTA2

¿CONTA2=4?CONTA2= CONTA2 +1NO

Delay 1 seg

Return

Delay 1 segundo

La sacamos del PDEL

Return

Page 26: Uso de las tablas en lenguaje ensamblador

CLRF CONTA ;INICIALIZAMOS LOS REGISTROS Y PUERTOS

CLRF CONTA2

CLRF PORTA

CLRF PORTB

NCICLO CALL MOSTRAR

CALL DELAY30S ;Se inicia la primera cuenta del 1er estado

INCF CONTA,1

CALL MOSTRAR ;Se llama a subrutina mostrar

CALL DELAY5S ;Se espera el estado amarillo

MOVLW 07H

SUBWF CONTA,0 ;Se pregunta si se llegó al final de los estados

;del semáforo

BTFSS STATUS,2

GOTO SUBE

CLRF CONTA

GOTO NCICLO

SUBE INCF CONTA,1

GOTO NCICLO

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

;RUTINA PARA MOSTRAR LOS DATOS EXTRAIDOS DE LA TABLA

;POR LOS PUERTOS A Y B

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

MOSTRAR MOVF CONTA,0

CALL TABLA1

MOVWF PORTB

MOVF CONTA,0

CALL TABLA2

MOVWF PORTA

RETURN

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

;RUTINA DE RETARDO DE 30 SEGUNDOS

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

DELAY30S CLRF CONTA2

OTRO CALL RET1S

MOVLW D'10'

SUBWF CONTA2,0

BTFSS STATUS,2

GOTO PREVIO

Page 27: Uso de las tablas en lenguaje ensamblador

RETURN

PREVIO INCF CONTA2,1

GOTO OTRO

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

;RUTINA DE RETARDO DE 5 SEGUNDOS

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

DELAY5S CLRF CONTA2

OTRO2 CALL RET1S

MOVLW D'4'

SUBWF CONTA2,0

BTFSS STATUS,2

GOTO PREVIO2

RETURN

PREVIO2 INCF CONTA2,1

GOTO OTRO2

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

;RUTINA DE TIEMPO DE 1 SEGUNDO GENERADA POR EL PDEL

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

RET1S movlw .14 ; 1 set numero de repeticion (C)

movwf PDel0 ; 1 |

PLoop0 movlw .72 ; 1 set numero de repeticion (B)

movwf PDel1 ; 1 |

PLoop1 movlw .247 ; 1 set numero de repeticion (A)

movwf PDel2 ; 1 |

PLoop2 clrwdt ; 1 clear watchdog

decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)

goto PLoop2 ; 2 no, loop

decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)

goto PLoop1 ; 2 no, loop

decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)

goto PLoop0 ; 2 no, loop

PDelL1 goto PDelL2 ; 2 ciclos delay

PDelL2 clrwdt ; 1 ciclo delay

return ; 2+2 Fin.

Page 28: Uso de las tablas en lenguaje ensamblador

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

;TABLA QUE CONTIENE EL ESTADO DE LOS

;BOMBILLOS CONTROLADOS POR EL PUERTO B

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

TABLA1 ADDWF PCL,1

RETLW B'10110011' ;4CH;

RETLW B'10110101' ;4AH;

RETLW B'10011110' ;61H;

RETLW B'10101110' ;51H;

RETLW B'11110110' ;09H;

RETLW B'01110110' ;89H;

RETLW B'10110110' ;49H;

RETLW B'10110110' ;49H;

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

;TABLA QUE CONTIENE EL ESTADO DE LOS

;BOMBILLOS CONTROLADOS POR EL PUERTO A

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

TABLA2 ADDWF PCL,1

RETLW B'00001101' ;02H;

RETLW B'00001101' ;02H;

RETLW B'00001101' ;02H;

RETLW B'00001101' ;02H;

RETLW B'00001100' ;03H;

RETLW B'00001101' ;02H;

RETLW B'00000111' ;08H;

RETLW B'00001011' ;04H;

END

Page 29: Uso de las tablas en lenguaje ensamblador

Circuito en Proteus: