Code:
'*******************************************************************************
'Voltmètre12.bas
'
' R/C Expanded scale Voltmeter
' Pic 12F1840
' 12 Multiplexed Leds
' 2 Display modes :
' - Jumper ON is Actual voltage BAR Display
' - Jumper OFF is Minimun reached Voltage in BAR Mode, plus Actual Voltage in DOT Mode
' ( intended to show Voltage swing under load )
'*******************************************************************************
' Defines
'*******************************************************************************
DEFINE OSC 32
'DEFINE
' Config
'*******************************************************************************
#CONFIG
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_ON
__CONFIG _CONFIG2, _PLLEN_ON & _BORV_LO & _LVP_OFF
#ENDCONFIG
OPTION_REG = %10000001
WPUA = %00001000
OSCCON = %11110000 ' !!! SCS 1:0 = 00 pour PLL ON !!!
INTCON = 0
PIE1 = 0
T1CON = 0
T1GCON = 0
CM1CON0 = 7
ADCON0 = %00000001
ADCON1 = %11100011
FVRCON = %11010011
LATA = 0
TRISA = 255
'*******************************************************************************
' Aliases
Modeselect VAR PORTA.3
'*******************************************************************************
' Variables
Nvalue VAR WORD
Ivalue VAR WORD
Mvalue VAR BYTE
Dvalue VAR BYTE
Value VAR BYTE
I VAR BYTE
mode VAR BYTE
modeI VAR BYTE
CLEAR
Mvalue = 12
'*******************************************************************************
test:
FOR Value = 1 to 12
Mode = 0 : ModeI = 0
GOSUB Display
PAUSE 200
NEXT Value
LATA = 0
Dvalue = 0
BUTTON Modeselect,0,255,0,I,0,First ' Display actual Voltage
ModeI = 1 ' IF Jumper ON then Alternate mode
'*******************************************************************************
First: '
ADCON0.1 = 1 'Launch First Conversion
Wait0:
FOR I = 1 to 16
IF ADCON0.1 = 0 THEN
Nvalue = ADRESH*256 + ADRESL ' read ADC result
ELSE
GOTO Wait0
ENDIF
ADCON0.1 = 1 ' relaunch conversion
Ivalue = (Ivalue*9 + Nvalue )/10 ' First Value for Ivalue
' = True value for Mvalue !
NEXT I
'*******************************************************************************
Main:
WHILE 1
Wait1:
IF ADCON0.1 = 0 THEN
Nvalue = ADRESH*256 + ADRESL ' read ADC result
ELSE
GOTO Wait1
ENDIF
ADCON0.1 = 1 ' relaunch conversion
Ivalue = (Ivalue*9 + Nvalue )/10 ' Rolling average
GOSUB Convert
IF Dvalue < Mvalue THEN Mvalue = Dvalue ' Memorize Minimum
' Prepare value to be displayed
IF ModeI == 1 THEN
FOR I = 0 to Dvalue ' Bar Display Actual value
Value = I
GOSUB Display
NEXT I
ELSE
FOR I = 0 to Mvalue ' Bar Display Min Value
Value = I
GOSUB Display
NEXT I
Value = Dvalue ' Add Actual Value dot
GOSUB Display
ENDIF
WEND
END
'*******************************************************************************
Display:
LATA = 0 'Prevent Ghosting
LOOKUP Value,[%11111111,%11111001,%11111001,%11101101,%11101101,%11011101,%11011101,_
%11101011,%11101011,%11011011,%11011011,%11001111,%11001111], TRISA
LATA.1 = !!(value == 2)|| (value == 4) || (value == 6)
LATA.2 = !!(value == 1)|| (value == 8) || (value ==10)
LATA.4 = !!(value == 3)|| (value == 7) || (value ==12)
LATA.5 = !!(value == 5)|| (value == 9) || (value ==11)
PAUSE 1
RETURN
'*******************************************************************************
Convert: 'Convert ADC Counts to LED#
LOOKDOWN2 Ivalue, < [513,526,538,551,563,576,588,601,613,626,638,651,663], Dvalue
'*******************************************************************************
'Test purpose values set
'LOOKDOWN2 Ivalue, < [551,563,576,588,601,613,626,638,651,663,676,688,700], Dvalue
'*******************************************************************************
RETURN
END
END
scheme joined.
Bookmarks