list p=16f684 ; list directive to define processor
#include <P16F684.inc> ; processor specific variable definitions
errorlevel -302 ; Turn off banking message
; known tested (good) code
__CONFIG _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF
CBLOCK 0x020
endc
#define _1VOLT 0x33
#define _2VOLT 0x66
#define _2_5VOLT 0x7F
#define _3VOLT 0x99
#define _4VOLT 0xCC
#define _5VOLT 0xff
ORG 0x000 ; processor reset vector
goto init ; go to beginning of program
ORG 0x004 ; interrupt vector location
init:
bsf STATUS,RP0 ; select Register Page 1
movlw 0xFF
movwf TRISA ; Make PortA all input
clrf TRISC ; Make PortC all output
movlw 0x10 ; A2D Clock Fosc/8
movwf ADCON1
bcf STATUS,RP0 ; back to Register Page 0
bcf STATUS,RP0 ; address Register Page 2
bsf STATUS,RP1
movlw 0xFF ; we want all Port A pins Analog
movwf ANSEL
bcf STATUS,RP0 ; address Register Page 0
bcf STATUS,RP1
clrf ADCON0
movlw 0x01
movwf ADCON0 ; configure A2D for Channel 0
MainLoop:
call adcdelay ;delay to charge cap
bsf ADCON0,GO ; start conversion
btfss ADCON0,GO ; this bit will change to zero when the conversion is complete
goto $-1
movf ADRESH,w ; Copy the display to the LEDs
movlw _1VOLT
subwf ADRESH, w
BNC LessThan1V ; Branch if less than 1V
movf ADRESH,w ; Copy the display to the LEDs
movlw _2VOLT
subwf ADRESH, w
BNC LessThan2V ; Branch if Between 1V and 2V
movf ADRESH,w ; Copy the display to the LEDs
movlw _2_5VOLT
subwf ADRESH, w
BNC LessThan2_5V ; Branch if Between 2V and 2.5V
movf ADRESH,w ; Copy the display to the LEDs
movlw _3VOLT
subwf ADRESH, w
BNC LessThan3V ; Branch if Between 2.5V and 3V
movf ADRESH,w ; Copy the display to the LEDs
movlw _4VOLT
subwf ADRESH, w
BNC LessThan4V ; Branch if Between 3V and 4V
movf ADRESH,w ; Copy the display to the LEDs
movlw _5VOLT
subwf ADRESH, w
BNC LessThan5V ; Branch if Between 3V and 4V
goto MainLoop
LessThan1V:
bsf PORTC,0
return
LessThan2V
bsf PORTC,1 ; lights led thats in volt range
return
LessThan2_5V
bsf PORTC,2
return
LessThan3V
bsf PORTC,3
return
LessThan4V
bsf PORTC,4
return
LessThan5V
clrf PORTC
return
adcdelay:
nop ;1 cycle
return ;4 cycles (including call)
end