symmetric power supply pic 16f877a
best regard
I come to you for help to improve my programming code for a symmetrical digital power supply.
well the code one part is in Spanish and the other is in English.

In the simulation with Proteus negative voltage and positive voltage are displayed, but the voltages flicker and do not complain fixed, and I want these values to remain fixed.

I also want to change pic 16f877a for pic 16f886
I have also seen on the microchip page that the pic 16f877a will no longer be manufactured, in the electronic stores I could not find it, they are out of stock.
I enclose the code, and link of the video and you will see the voltage flashing.
I hope and help me improve my code, thanks

Joseph


include "fp2032.bas" ' Include file for 14-bit core with RAM at $20 (32-bit)

DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_ SAMPLEUS 50

'************************************************* *******************
' Definición de puertos y variables
'************************************************* *******************
LED VAR PORTB.6 'Define el led en el pin 6 del puerto B
TXD VAR PORTC.6 'Define el pin de transmision serial en el pin 6 del puerto C
B1 VAR WORD
B2 VAR WORD
VALOR1 VAR BYTE
VALOR2 VAR BYTE
fpplaces var byte ' Used to define number of decimal places in fpdisplay,fpdisplayr
ahold var word ' Required by fpdisplay
bhold var word ' Required by fpdisplay

'************************************************* *******************
' Inicio del programa principal
'************************************************* *******************
INICIO:
TRISC.6 = 0 'Configura puerto RC6 como salida
TRISC.7 = 1 'Configura puerto RC7 como entrada
TRISA = 255 'Configura puerto A como entrada
ADCON1 = %11000010 'Justifica el resultado hacia la izquierda
TRISB.6 = 0 'Configura puerto RB6 como salida

LCDOUT $FE,2," FUENTE SIMETRICA "
LCDOUT $FE,$C0," JOSE LUIS COMAS LL "
LCDOUT $FE,$94,"VOLT.NEGATIVO:-"
LCDOUT $FE,$D4,"VOLT.POSITIVO:+"
COMENZAR:
ADCIN 1, B1 'Lee el voltaje negativo en el canal 1 del ADC
ADCIN 2, B2 'Lee el voltaje positivo en el canal 2 del ADC

'Envia los valores del ADC a la terminal
SEROUT2 TXD,188,["$", "$", DEC4 B1,"$", "$",DEC4 B2,10,13]

aint = B1 'Transfiere el valor del ADC del voltaje negativo
gosub itofa 'Conviertelo a punto flotante
bint = 2000 'Carga el valor 2000 (5*400)
gosub itofb 'Conviertelo en punto flotante
gosub fpmul 'ADCres * 2000
bint = 52224 'Carga el valor de la cuenta maxima del ADC * 51
gosub itofb 'Conviertelo en punto flotante
GOSUB fpdiv '(ADCres * 2000)/52224
LCDOUT $FE,$A3," " 'Limpia el espacio donde se coloca el voltaje negativo
LCDOUT $FE,$A3
fpplaces = 2 : Gosub fpdisplayr ' Call display routine

aint = B2 'Transfiere el valor del ADC del voltaje positivo
gosub itofa 'Conviertelo a punto flotante
bint = 35 'Carga el valor 35 (5*7)
gosub itofb 'Conviertelo en punto flotante
gosub fpmul 'ADCres * 35
bint = 1024 'Carga el valor de la cuenta maxima del ADC
gosub itofb 'Conviertelo en punto flotante
GOSUB fpdiv '(ADCres * 35)/1024
LCDOUT $FE,$E3," " 'Limpia el espacio donde se coloca el voltaje positivo
LCDOUT $FE,$E3
fpplaces = 2 : Gosub fpdisplayr ' Call display routine
HIGH LED
GOTO COMENZAR

' The fpdisplayr routine checks for number of places, then adds the appropriate
' value to achieve rounding. To save RAM space, the values are hard coded
' in floating point format.

fpdisplayr: If fpplaces=0 Then ' Set floating point barg to 0.5
bexp = $7E
bargb0 = $00
bargb1 = $00
bargb2 = $01
Endif
If fpplaces=1 Then ' Set floating point barg to 0.05
bexp = $7A
bargb0 = $4C
bargb1 = $CC
bargb2 = $CD
Endif
If fpplaces=2 Then ' Set floating point barg to 0.005
bexp = $77
bargb0 = $23
bargb1 = $D7
bargb2 = $0B
Endif
If fpplaces=3 Then ' Set floating point barg to 0.0005
bexp = $74
bargb0 = $03
bargb1 = $12
bargb2 = $6F
Endif
If fpplaces=4 Then ' Set floating point barg to 0.00005
bexp = $70
bargb0 = $51
bargb1 = $B7
bargb2 = $17
Endif

Gosub fpadd ' add barg to aarg



' The fpdisplay routine outputs the signed value of aarg in decimal floating point format. It
' can display a positive value of 65535, and decimals to 4 places. The number of decimal
' places should be stored in fpplaces before calling the routine. The routine reads the
' floating point value of aarg. This value should NOT be converted to an integer before
' calling fpdisplay. The integer conversion will be perfomed as part of this routine, and
' aint will be returned to the calling program just as from the itofa routine.

fpdisplay: bexp = aexp ' Store the FP value of aarg to the barg variables
bargb0 = aargb0
bargb1 = aargb1
bargb2 = aargb2

Gosub ftoia ' Convert aarg to integer
ahold = aint ' Save this value for the final display

Gosub itofa ' Convert integer back to float

Swap aexp,bexp ' Swap the FP values of aarg and barg before subtraction
Swap aargb0,bargb0
Swap aargb1,bargb1
Swap aargb2,bargb2

Gosub fpsub ' Subtract the integer portion from the full number


bint = 10 ' Make bint = 10 E fpplaces
If fpplaces=2 Then
bint = 100
Endif
If fpplaces=3 Then
bint = 1000
Endif
If fpplaces=4 Then
bint = 10000
Endif

bhold = bint ' Save the integer value of bint for zeros loop

Gosub itofb ' Convert bint to integer prior to FP multiply
Gosub fpmul ' Multiply the decimal portion x 10 E fpplaces

Gosub ftoia ' Convert result to aint integer


Lcdout dec ahold ' Display integer portion

If fpplaces > 0 Then
Lcdout "." ' Display decimal point

zeros: bhold = bhold / 10 ' Set bhold to be next place to right
If (aint < bhold) AND (bhold > 1) Then ' Check for leading zero in decimal
Lcdout "0" ' Display leading zero
Goto zeros ' loop to check for another zero
Endif

Lcdout dec aint ' Display the rest of the decimal portion

Endif

aint = ahold ' Restore the original value of aint

Return


https://drive.google.com/file/d/19zVIgpcGwliJ5BENU3GAp1xTRELDTNa4/view
link of video