Hola amigos espero que me puedan ayudar , el codigo siguiente es para el pic16f877a y funciona como conversor analogico digital, cuando meto usa señal de audio por RA0 por el puerto B se encienden leds, ejemplo cuando meto una señal debil solo se enciende un led , cuando la señal es fuerte se encienden todos los leds, el problema que tengo que los leds se encienden en barra, se encienden todos los leds , yo quiero que solo se encienda uno, me explico cuando meta una señal fuerte que se encienda el ultimo led solamente no todos como antes, cuando meto una señal media que solo se prenda el led del medio espero haberme explicado, gracias de antemano por la ayuda.
;Conversion Analogica/Digital de voltaje de Canal 0 (POTENCIOMETRO en RA0/AN0).
;El resultado se muestra en PORTB (parte baja) y PORTC (parte alta)
;------------------------------------------------------------------------------------------
LIST P=16F877A ; tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC&_BODEN_OFF&_LVP_OFF
ERRORLEVEL -302 ;elimina BANK WARNING
ERRORLEVEL -207 ;elimina LABEL AFTER COLUMN 1
PDe10 EQU 0x70
ORG 0x00 ;inicio del codigo
GOTO INICIO
;-----------------------------------------------------------------------------
; ************************* MACROS ***********************************
;-----------------------------------------------------------------------------
BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------------
; ************************* Rutina retardo de 20us***********************
;---------------------------------------------------------------------------
Delay20us
movlw .3 ;1 set numero de repeticion
movwf PDe10 ;1
PLoop0 clrwdt ;1 clear watchdog
decfsz PDe10,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
;---------------------------------------------------------------------------
; ************************* PROGRAMA PRINCIPAL***********************
;---------------------------------------------------------------------------
INICIO
;Se inicializa los puertos
BANCO_0
CLRF PORTA ;inicializa PORTA
CLRF PORTB ;inicializa PORTB
CLRF PORTC ;inicializa PORTC
BANCO_1
MOVLW B'00000000' ;
MOVWF TRISB ;PORTB salida
MOVLW B'00000000' ;
MOVWF TRISC ;PORTC RC0-RC1 salidas
MOVLW B'11111111' ;
MOVWF TRISA ;PORTA entrada
;Se inicializa Modulo de conversion A/D
BANCO_0
MOVLW B'11000001' ;ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON
MOVWF ADCON0 ;ADCS1-ADCS0.11 (OSCILADOR INTERNO RC) . ADON:1 (A/D HABILITADO)
;CHS2 a CHS0:000(canal 0: AN0)
BANCO_1
MOVLW B'10001110' ;ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0
MOVWF ADCON1 ;ADFM:1 (just. derecha) . PCFG3 a PCFG0:1110 (AN0 analogica)
; Lectura del Canal analogico ANo
MAIN
BANCO_0
CALL Delay20us ;Retardo para tiempo de adquisicion
BSF ADCON0, GO ;Inicia la conversion
WAIT BTFSC ADCON0, GO
GOTO WAIT ;Espera fin de conversion
MOVF ADRESL,W
MOVWF PORTC ;ADRESH a PORTC
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTB ;ADRESL a PORTB
GOTO MAIN
END ;Fin del programa
;Conversion Analogica/Digital de voltaje de Canal 0 (POTENCIOMETRO en RA0/AN0).
;El resultado se muestra en PORTB (parte baja) y PORTC (parte alta)
;------------------------------------------------------------------------------------------
LIST P=16F877A ; tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC&_BODEN_OFF&_LVP_OFF
ERRORLEVEL -302 ;elimina BANK WARNING
ERRORLEVEL -207 ;elimina LABEL AFTER COLUMN 1
PDe10 EQU 0x70
ORG 0x00 ;inicio del codigo
GOTO INICIO
;-----------------------------------------------------------------------------
; ************************* MACROS ***********************************
;-----------------------------------------------------------------------------
BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------------
; ************************* Rutina retardo de 20us***********************
;---------------------------------------------------------------------------
Delay20us
movlw .3 ;1 set numero de repeticion
movwf PDe10 ;1
PLoop0 clrwdt ;1 clear watchdog
decfsz PDe10,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
;---------------------------------------------------------------------------
; ************************* PROGRAMA PRINCIPAL***********************
;---------------------------------------------------------------------------
INICIO
;Se inicializa los puertos
BANCO_0
CLRF PORTA ;inicializa PORTA
CLRF PORTB ;inicializa PORTB
CLRF PORTC ;inicializa PORTC
BANCO_1
MOVLW B'00000000' ;
MOVWF TRISB ;PORTB salida
MOVLW B'00000000' ;
MOVWF TRISC ;PORTC RC0-RC1 salidas
MOVLW B'11111111' ;
MOVWF TRISA ;PORTA entrada
;Se inicializa Modulo de conversion A/D
BANCO_0
MOVLW B'11000001' ;ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON
MOVWF ADCON0 ;ADCS1-ADCS0.11 (OSCILADOR INTERNO RC) . ADON:1 (A/D HABILITADO)
;CHS2 a CHS0:000(canal 0: AN0)
BANCO_1
MOVLW B'10001110' ;ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0
MOVWF ADCON1 ;ADFM:1 (just. derecha) . PCFG3 a PCFG0:1110 (AN0 analogica)
; Lectura del Canal analogico ANo
MAIN
BANCO_0
CALL Delay20us ;Retardo para tiempo de adquisicion
BSF ADCON0, GO ;Inicia la conversion
WAIT BTFSC ADCON0, GO
GOTO WAIT ;Espera fin de conversion
MOVF ADRESL,W
MOVWF PORTC ;ADRESH a PORTC
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTB ;ADRESL a PORTB
GOTO MAIN
END ;Fin del programa