TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Oscarinv en 28 de Julio de 2009, 21:51:47
-
;*Este programa Enciende un LED conectado a RA5 cuando se presiona un botón
;*conectado a RA0 y lo apaga cuando se presiona presiona nuevamente el
;*mismo botón y a sí sucesivamente.
;**************************************************************************
include “p16f877.inc”
org 0x0000 ;Inicia en el vector de reset
;Inicialización del puerto A:
CLRF STATUS ;Selecciona Banco 0
CLRF PORTA ;Inicializa latches de datos de PORTA
BSF STATUS,RP0 ;Selecciona Banco 1
MOVLW 0x06 ;Configura todas las patitas de A
MOVWF ADCON1 ;como digitales
MOVLW 0x1F ;configura todas las patitas de A como salidas
MOVWF TRISA ;y RA5 como salida
BCF STATUS,RP0 ;regresa al banco 0
checa BTFSS PORTA,0 ;checa si RA0=1
GOTO checa ;si RA=0 checa de nuevo
CALL d20ms ;si RA0=1 espera 20 miliseg. A que pase el rebote
chec1 BTFSS PORTA,0 ;checa nuevamente si RA0=1
GOTO checa ;si RA1=0 falsa alarma, vuelve a checar
MOVLWF PORTA,0x20 ;si RA1=1 señal válida; carga máscara en W
XORWF PORTA,1 ;conmuta estado del LED
GOTO checa ;repite
end
El código es de un pdf que encontre en internet, lo que no entiendo es como funciona esta parte (¿Esta mal escrito?, por que MOVLWF no es una instrucción):
MOVLWF PORTA,0x20 ;si RA1=1 señal válida; carga máscara en W
XORWF PORTA,1 ;conmuta estado del LED
¿O alguien me puede explicar como se prendería/apagaría un led utilizando un solo botón? Espero que alguien me pueda ayudar, de antemano gracias.
-
En caso de que tu boton tenga resistencia de pull-down y al presionarlo entregué un 1 lógico.
revisa BTFSS PORTA,0 ; Boton presionado?
goto revisa ;regresa a revisar si se presiono el boton
;CALL retardo_ms ;llama subrutina retardo
revisa2 BTFSS PORTA,0 ; Aseguramos que se haya presionado
goto revisa ; regresa a preguntar
MOVLW b'00100000' ;cargamos valor 0x20H para realizar mascara
XORWF PORTA,F
goto revisa
XOR
AB Y
00 0
01 1
10 1
11 0
Al inicio RA5=0 y al hacer la XOR 0x20 es asi
XOR 00100000
PORTA 00000000
------------------
PORTA 00100000
XOR 00100000
PORTA 00100000
------------------
PORTA 00000000
Saludos!
-
Saludos
Yo haria lo siguiente
empieza
clrf contador
btfss porta,0
goto $-1
call retardo ; rutina de milisegundos
btfsc porta,0
goto $-1
incf contador,1 ; incremento contador en 1
movf contador,0 ; paso a w
xorlw d'1'
btfss status,2 ; hago una comparacion para saber si apago o prendo
goto apaga
bsf porta,5
goto $-c
apaga
bcf porta,5
goto empieza
end
La verdad es más largo pero me ha funcionado siempre muy bien la verdad enmascarar siempre me saca la rabia :D :D.
Un saludo desde Pereira - Colombia