Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: dussam en 21 de Noviembre de 2013, 23:41:52
Título: COMO ENCIENDO UN LED EN UN DETERMINADO NUMERO QUE APARECE EN UN CONTADOR
Publicado por: dussam en 21 de Noviembre de 2013, 23:41:52
tengo un programa en asm que es un contador del 0 al 15 q lo controlo con un pulso en RA0 y ademas debo encender un led cuand el contador este en el numero 7. el led esta conectado en RA1. solo tengo problemas con el led pues nose como hacer esa parte. alguna ayudita??? este es mi progrma: LIST P=16F84A #INCLUDE P16F84A.INC __CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
Título: Re: COMO ENCIENDO UN LED EN UN DETERMINADO NUMERO QUE APARECE EN UN CONTADOR
Publicado por: ZAR en 22 de Noviembre de 2013, 02:53:02
Saludos, bueno mirando tu programa realice algunos cambios, en primer lugar se puso al pin RA1 como salida ya lo modifique. Según entiendo el led solo se encenderá cuando el contador es 7 de manera que al ser mayor se apagara, por tanto se debe saber en qué momento se llega a este valor, al no contar con un comando para comparar valores (CONT=7) se recurre a operaciones aritméticas de manera que al restar 7-CONT=0 el resultado cero se indica por el flag Z del registro STATUS y de esa manera se conoce cuando una variable es igual a un valor fijo. Como se aprecia en el programa, luego compara con el valor de 8 para apagar el led según entendí en el problema que planteas. También como no se aclara que pasa con el contador cuando llega 15 se coloca nuevamente el contador a cero para tener un contador cíclico.
Por otro lado para el pulsador se asume que al ser presionado RA0 tendrá un estado alto y se realiza el incremento, El ciclo “ES0” asumo que es para verificar en qué momento se deja de presionar el pulsador, esto funcionara en simulación pero en la práctica seguro le dará problemas por los rebotes producidos en el pulsador, recomendaría que utilices retardos para tal fin, espero que te sirva. :)
Código: ASM
LIST P=16F84A
#INCLUDE P16F84A.INC
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
CONT equ0x0C
org 0x00
goto INICIO
org 0x05
INICIO
bsf STATUS,RP0
bcf TRISA,1
clrf TRISB
bcf STATUS,RP0
clrf CONT
clrf PORTB
ES1
btfss PORTA,0
goto ES1
incf CONT,F
movf CONT,W
movwf PORTB
movf CONT,W
sublw .7
btfsc STATUS,Z
bsf PORTA,1
movf CONT,W
sublw .8
btfsc STATUS,Z
bcf PORTA,1
movf CONT,W
sublw .16
btfss STATUS,Z
goto ES0
clrf CONT
clrf PORTB
ES0
btfsc PORTA,0
goto ES0
goto ES1
END
Título: Re: COMO ENCIENDO UN LED EN UN DETERMINADO NUMERO QUE APARECE EN UN CONTADOR
Publicado por: dussam en 28 de Noviembre de 2013, 18:17:06
muchisimas gracis y disculpe el retardo en responder ando en finales y pues no he tenido mux tiempo y m funciono la solucion!!! ahora and cn otro problema un pokito mas dificultoso de detectar, toy haciendo una cerradura electronica y ya la tengo armada y todo...el problema es el lcd...en la simulacion d proteus m aparece CONTROLLER RECEIVED DATA BUSY o algo x el stilo. x lo q anduve leyendo se debe a q no defini una libreria para el lcd? no stoy seguro. aki sta el codigo en asm es un pokito largo pero kizas mi error esta al principio. de antemano mux gracias!!!
;************************************** Elegimos PIC ******************************************************************** list p=16f876a include <p16f876a.inc> __CONFIG _XT_OSC&_CPD_ON&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_BODEN_OFF errorlevel -302 ;************** Asignación de nombres de Registros de Funciones especiales a direcciones ********************
;----------------------------------------------------------------- ; LEECOD: SUBRUTINA QUE LEE EL REGISTRO DE LA EEPROM ; INDICADO POR EL ACUMULADOR Y LO DEVUELVE EN ; ACUMULADOR
;---------------------------------------------------------- ; GETKEY: Subrutina que devuelve el valor pulsado en ; un teclado hexadecimal en código ascii en W ;COL1: 0 COL2: 1 COL3: 2 COL4: 3 ;ROW1: 4 ROW2: 5 ROW3: 6 ROW4: 7
SUELKEY CALL GETKEY SUBLW 0FH BTFSC STATUS,2 RETURN GOTO SUELKEY ;----------------------------------------------------------- ;--------------------------------------------------------------------- ; ESPEKEY: SUBRUTINA QUE ESPERA A QUE SE PULSE UNA TECLA ; DEVUELVE EL VALOR EN W Y TECLA
;-------------------------------------------------------------------------------------------- ; ESCMEN: SUBRUTINA QUE ESCRIBE UN MENSAJE EN EL LCD, ; PASAR INICIO DE TABLA EN ACUMULADOR
;------------------------------------------------------------------------------------------- ; WAITLCD: SUBRUTINA DE ESPERA AL LCD
WAITLCD BSF STATUS,5 MOVLW 0FFH MOVWF DATO BCF STATUS,5 BSF EN BCF RS BSF RW MOVLW 0FFH MOVWF DATO
WAITLC BTFSC DATO,7 GOTO WAITLC BCF EN BCF RW BCF DATO,7 BSF STATUS,5 CLRF DATO BCF STATUS,5 RETURN ;--------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------- ; INITLCD: SUBRUTINA DE INICIALIZACIÓN DEL LCD
INITLCD MOVLW 38H ;00111000 CALL COMANDO ;INTERFACE 8 BIT, 2 LINEAS MOVLW 0CH ;00001100 CALL COMANDO ;DISPLAY A ON, NO MUESTRA CURSOR, NO PARPADEO MOVLW 06H ;00000110 CALL COMANDO ;MUEVE CURSOR A LA DCHA DESPUES D ESCRIBIR, NO MUEVE VENTANA RETURN ;-------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------- ; CLEARL: SUBRUTINA QUE BORRA EL LCD Y LLEVA EL CURSOR AL LADO IZQUIERDO DEL ; DISPLAY
;-------------------------------------------------------------------------------------------- ; WRITEL: SUBRUTINA QUE ESCRIBE EN EL LCD EL CARACTER DEL ACUMULADOR
WRITEL BSF EN BSF RS BCF RW MOVWF DATO BCF EN CALL WAITLCD RETURN ;---------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------- ; COMANDO: SUBRUTINA QUE ENVIA UN COMANDO AL LCD
COMANDO BSF EN BCF RS BCF RW MOVWF DATO BCF EN CALL WAITLCD RETURN ;--------------------------------------------------------------------------------------------- ; SITUCU: SUBRUTINA QUE SITUA EL CURSOR EN LA DIRECCION INDICADA POR EL ACUMULADOR
SITUCU IORLW 80H CALL COMANDO RETURN ;---------------------------------------------------------------------------------------------- ;===================================================================== ;*********** DELAY *********** ;--------------------------------------------------------------------- ;SUBRUTINA DE RETARDO SEGÚN EL VALOR DEL ACUMULADOR ;MODIFICA LOS SIGUIENTES REGISTROS ; CUENTA1 ; CUENTA2 ; CUENTA3
REBO DECFSZ CUENTA1,F GOTO REBO RETURN ; Comentar estas líneas y grabar la EEPROM con una clave de 4 digitos ; Empezando desde la dirección 0x00 ORG 2100H DE 30H,30H,30H,30H