.: Parte II: Verificando el estado de los interruptores.
Lo que viene ahora es verificar el estado de los interruptores, no te asustes por lo extensa que es esta parte del código, no es nada complicado ya que se repite 16 veces para seleccionar uno de los 16 efectos disponibles según la combinación de las llaves, o interruptores.
switch MOVF porta,0 ; carga w con el puerto A
ANDLW 0x0F ; retiene los 4 bits de interes (las llaves)
MOVWF llaves ; y los guarda en llaves
XORLW 0x00 ; verifica si es el primer efecto
BTFSC estado,2 ; si es así
CALL efect1 ; lo llama y lo ejecuta
MOVF llaves,0 ; sino, carga llaves en w
XORLW 0x01 ; y verifica si es el segundo efecto
BTFSC estado,2 ; si es así
CALL efect2 ; lo llama y lo ejecuta
MOVF llaves,0 ; y así con los demás
XORLW 0x02 ; ya me aburrí
BTFSC estado,2 ; como verás el resto es lo mismo
CALL efect3
MOVF llaves,0
XORLW 0x03
BTFSC estado,2
CALL efect4
MOVF llaves,0
XORLW 0x04
BTFSC estado,2
CALL efect5
MOVF llaves,0
XORLW 0x05
BTFSC estado,2
CALL efect6
MOVF llaves,0
XORLW 0x06
BTFSC estado,2
CALL efect7
MOVF llaves,0
XORLW 0x07
BTFSC estado,2
CALL efect8
MOVF llaves,0
XORLW 0x08
BTFSC estado,2
CALL efect9
MOVF llaves,0
XORLW 0x09
BTFSC estado,2
CALL efect10
MOVF llaves,0
XORLW 0x0A
BTFSC estado,2
CALL efect11
MOVF llaves,0
XORLW 0x0B
BTFSC estado,2
CALL efect12
MOVF llaves,0
XORLW 0x0C
BTFSC estado,2
CALL efect13
MOVF llaves,0
XORLW 0x0D
BTFSC estado,2
CALL efect14
MOVF llaves,0
XORLW 0x0E
BTFSC estado,2
CALL efect15
MOVF llaves,0
XORLW 0x0F
BTFSC estado,2
CALL efect16
GOTO switch ; Comienza a revisar de nuevo
|
|
.: Descripción del código
Jaja...!!!, no voy a describir línea por línea hasta el final, y no me lo pidas por que no me vas a convencer... :o))
Lo que haré será describir esta sección que es la mas crucial, y el resto puedes detenerte a pensarlo, a verlo, y descubrirás que es lo mismo...
Aquí esta parte del código...
switch MOVF porta,0 ; carga w con el puerto A
ANDLW 0x0F ; retiene los 4 bits de interes (las llaves)
MOVWF llaves ; y los guarda en llaves
XORLW 0x00 ; verifica si es el primer efecto
BTFSC estado,2 ; si es así
CALL efect1 ; lo llama y lo ejecuta
MOVF llaves,0 ; sino, carga llaves en w
XORLW 0x01 ; y verifica si es el segundo efecto
BTFSC estado,2 ; si es así
CALL efect2 ; lo llama y lo ejecuta
MOVF llaves,0 ; y así con los demás
XORLW 0x02 ; ya me aburrí
BTFSC estado,2 ; como verás el resto es lo mismo
|
|
switch es la etiqueta que le corresponde a toda esta sección de código, y le puse ese nombre por que es justamente lo que se hace, revisar todos los switch's.
MOVF porta,0
Repasemos un poco, MOVF significa mover todo lo que hay en el registro F, el registro F en este caso es porta y para especificar que lo debe guardar en W le ponemos un 0, con esto pasamos el puertoA a W.
ANDLW 0x0F
Esto es, hacer L AND W y guardarlo en W, ahora bien, L es un literal (un valor) en este caso 0x0F y W es el que contiene el valor del puerto A, veamos un ejemplo supongamos que lo que hay en el puerto A es 00010001, eso significa que W=00010001 (gracias a la instrucción anterior) cuando hagas el AND con 0x0F (00001111 en binario) el resultado será el siguiente...
00001111 L 00010001 W ---------------------- 00000001 ANDLW
Ahora es W=00000001, entiendes por que hice uso de la instrucción AND, bueno así es que nos quedamos con los bit's de interés (los bits de interés son los interruptores), ok, sigamos
MOVWF llaves
Es como decir MOV todo lo que hay en W al registro F, F en este caso es llaves, y llaves es el nombre que le asignamos al registro 0x0C (en el encabezado... recuerdas...???), muy bien, ahora llaves contiene el estado de los interruptores (en limpio, es decir sin el timer). Si seguimos con el ejemplo anterior luego de la instrucción, nos quedará llaves=00000001, o sea que el primer interruptor está activado...
XORLW 0x00
hacer W XOR L, recuerda que W=00000001 y en este caso L=00000000 (0x00 en hexa) recuerda también que la operación XOR entre dos bits dará como resultado 0 si ambos bits contienen el mismo valor, ahora, el resultado de esta operación será..
00000001 W 00000000 L ---------------------- 00000001 XORLW
Es cuestión de segundos para que te des cuenta que lo que estamos haciendo es una comparación, si los valores son los mismos el resultado dará cero.
BTFSC estado,2
Esto es como decirle... mira ve y prueba el Bit B del registro F y saltéate una línea si es que es 0.
Ok, aclaremos un poco esto, B es el bit2 del registro STATUS y F ahora es el registro STATUS, te preguntarás que tiene que ver el registro STATUS con todo lo que estamos haciendo, te lo explicaré, el bit2 del registro STATUS es el tercer bit "Z" (conocido como bandera de CERO) y esa bandera se pone a uno siempre que una operación aritmética o lógica como la anterior (XORLW) de como resultado 0 (CERO), en cualquier otro caso se pondrá en cero.
Ahora vamos a repetirlo para que quede mas claro, Piensa que las dos instrucciones que acabamos de ver van de la mano
XORLW 0x00 ;XOR entre W y 00000000 (todas las llaves en cero)
BTFSC estado,2 ;prueba si Z=0 si es así se saltea una línea.
del ejemplo anterior la operación dio como resultado 00000001 por lo tanto la bandera no cambio sigue siendo Z=0 entonces me salteo una línea y voy a esa instrucción
MOVF llaves,0
Vuelvo a cargar W con el contenido del registro llaves, recuerda que llaves contiene el estado de los interruptores en limpio
Lo que haré ahora será comparar el estado de los interruptores con el segundo efecto ya que el anterior no era, así que haré un nuevo XOR, así...
XORLW 0x01 ;XOR entre W y 00000001 (sólo el primer interruptor en 1)
El tema es que ahora el resultado de esta operación será 00000000 ya que W tiene el mismo valor que el literal 0x01, por lo tanto la bandera Z se hace Z=1 y cuando pase a...
BTFSC estado,2 ;saltea una línea si Z=0
Pues no saltare nada ya que Z es 1 y pasaré a un...
CALL efect2
CALL es una llamada, y CALL efect2 es llamar a la etiqueta efect2, esa etiqueta contiene el segundo efecto de luces, ya que el primero no lo pude ejecutar por que no correspondía.
Una vez terminado de ejecutar efect2 volveré a verificar el estado de las llaves, es decir, volveré a...
MOVF llaves,0
Pero llaves sigue siendo 00000001, por lo tanto todas las otras operaciones me darán cualquier cosa y no 00000000, esto ocurrirá hasta que llegue a la instrucción...
GOTO switch
Un espectacular salto (GOTO) a la etiqueta switch (el inicio de toda esta sección de código), donde me encuentro con...
MOVF porta,0
y cargo W con todo lo que hay en el puerto A (que vendría a ser el nuevo estado de los interruptores). Luego haré
ANDLW 0x0F
Para sacarme de encima al timer, y luego un...
MOVF llaves,0
para cargar el registro llaves con el nuevo estado de los interruptores conectados al puerto A, y estoy listo para verificar de que efecto se trata, y cuando lo descubra haré una llamada al efectX que le corresponde y lo ejecutaré, y así sucesivamente.
Espero que hayas logrado comprender esta sección y sino analiza el código nuevamente hasta que lo entiendas, te confieso que no es tan complicado como parece.
Si está todo claro puedes pasar a la siguiente página...
Ahí te espero...
R-Luis...
<--Anterior
Introducción
Siguiente -->
Tabla de Referencias
|