Ayuda con codigo

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
 
ADRESH TIENE 00 ADRESL TIENE 00000000
AL ESTAR TODOS ACTIVOS ES PORQUE LA SENAL DE ENTRADA ES LA MAXIMA O SEA 5VDC

LO QUE TIENES QUE HACER ES BUSCAR SI EL BIT 1 DEL ADRESH ESTA EN 1 LO QUE SERIA LA MITAD DE LA CONVERSION SI ESTO ES CORECTRO MANDAS A PRENDER UN LED DEL CENTRO.

SI TODOS LOS BITS TANTO DEL ADRESH Y ADRESL ESTAN EN ALTO DEBES PRENDER ULTIMO LED

Y SI LOS BITS ESTAN EN CERO DEBES PRENDER ELPRIMERO.

TODO ESTO LO PUEDES HACER CON XOR BTFSS , CARRY, STATUS.

VREF ES 0VDC


SALUDOS
 
Atrás
Arriba