VU meter com 628A + display 16x2

E aí pessoal do fórum, blz. Recentemente estou desenvolvendo um projetinho com o 16F628A e estou encontrando dificuldades. É o seguinte: preciso fazer um medidor de intensidade de áudio (bargraph, ou VU) utilizando um display 16x2. a linha de cima é L (esquerdo) e a linha de baixo é R (direito). Até aí, blz. Coloquei um potenciômetro na entrada para variar entre 0 e 5V. Como o 628 não tem AD interno, estou usando um conversor Delta Sigma, baseado na AN700 da Microchip. Criei um caractere na CGRAM do display para fazer “acender” a quantidade certa de acordo com a intensidade do sinal de entrada. O problema é que não estou conseguindo fazer funcionar, ele acende uma determinada quantidade de caracteres, e fica só nisso. Parece que a entrada do conversor não funciona mais. Já fiz um voltímetro usando o mesmo processo, com rotinas de multiplicação e divisão, e funcionou perfeito, apresentando o resultado no display.
Se alguém do fórum puder dar uma mãozinha, agradeço. Aí vai uma parte do código em assembler. Já tentei usar sem as rotinas de divisão e multiplicação, mas o resultado foi o mesmo. Desculpem, mas a rotina é meio grande, mas coloquei o máximo de informação possível.
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * CONSTANTES INTERNAS *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; A DEFINIÇÃO DE CONSTANTES FACILITA A PROGRAMAÇÃO E A MANUTENÇÃO.
C1 EQU .18 ;CONSTANTES USADAS PARA POSTERIOR COMPARAÇÃO COM C2 EQU .36 ;CONVERSOR AD, PARA FORMAÇÃO DO BARGRAPH.
C3 EQU .54 .
C4 EQU .72
C5 EQU .90
C6 EQU .108
C7 EQU .126
C8 EQU .144
C9 EQU .162
C10 EQU .180
C11 EQU .198
C12 EQU .216
C13 EQU .234
C14 EQU .250
;****************************************************************************
; ROTINA PARA ESCRITA DE UM CARACTERE NA CGRAM DO DISPLAY
; ESTE CARACTERE SERÁ O CURSOR DO V.U.
;****************************************************************************
CARACTERE_1
MOVLW 0X40 ;APONTA PARA O PRIMEIRO ENDEREÇO DA CGRAM
CALL SEND_CMD
MOVLW 0X1E
CALL SEND_CHAR ;ENVIA OS BYTES NA SEQUÊNCIA, PARA FORMAR
MOVLW 0X1E ;O CARACTERE
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
RETURN
;******************************************************************
; ROTINA DE INICIALIZAÇÃO DO CONVERSOR SIGMA DELTA
;******************************************************************
InitDeltaSigA2D
bsf STATUS,RP0
movlw 0xEC
movwf VRCON
bcf PORTA,3 ; set comparator pin to output
bcf STATUS,RP0
movlw 0x06 ; set up for 2 analog comparators with common reference
movwf CMCON
return
;
; Delta Sigma A2D
; The code below contains a lot of nops and goto next instruction. These
; are necessary to ensure that each pass through the loop takes the same
; amount of time, no matter the path through the code.
;
DeltaSigA2D
clrf COUNTER
clrf RESULT
movlw 0x03 ; set up for 2 analog comparators with common reference
movwf CMCON
loop
btfsc CMCON,C1OUT ; Is comparator high or low?
goto complow ; Go the low route
comphigh
nop ; necessary to keep timing even
bcf PORTA,3 ; PortA.3 = 0
incfsz RESULT,f ; bump counter
goto eat2cycles ;
goto endloop ;
complow
bsf PORTA,3 ; Comparator is low
nop ; necessary to keep timing even
goto eat2cycles ; same here
eat2cycles
goto endloop ; eat 2 more cycles
endloop
incfsz COUNTER,f ; Count this lap through the loop.
goto eat5cycles ;
incf COUNTER,f ;
movf COUNTER,w ;
andlw 0xFF ; Are we done? (We're done when bit2 of
btfsc STATUS,Z ; the high order byte overflows to 1).
goto loop ;
goto exit
eat5cycles
goto $+1 ; more wasted time to keep the loops even
nop ;
goto loop ;
exit
movlw 0x06 ; set up for 2 analog comparators with common reference
movwf CMCON
return
;**************************************************************
; ROTINA DE ESCRITA DE COMANDO NO DISPLAY
;**************************************************************
SEND_CMD
MOVWF CHAR ;GUARDA O COMANDO OU CARACTERE EM CHAR
MOVLW .10
CALL DELAY_MS ;PERDE 10MS PARA ESTABILIZAÇÃO
BCF RS
BSF E ;ENVIA PULSO DE ENABLE AO DISPLAY
MOVF CHAR,W
MOVWF DISPLAY
BCF E
RETURN
;**************************************************************
; ROTINA DE ESCRITA DE CARACTERE NO DISPLAY
;**************************************************************
SEND_CHAR
MOVWF CHAR
MOVLW .10
CALL DELAY_MS
BSF RS
BSF E
MOVF CHAR,W
MOVWF DISPLAY
BCF E
RETURN
;**************************************************************
;* inicio do programa
;**************************************************************
INICIO
CLRF PORTA
CLRF PORTB
BANK1 ; SELECIONA O BANCO 1 DE MEMÓRIA
MOVLW B'00110111' ; AJUSTA OS BITS DO PORTA
MOVWF TRISA
MOVLW 0x00 ; AJUSTA OS BITS DO PORTB COMO SAÍDA
MOVWF TRISB
MOVLW B'10000000' ; PRESCALER 1:0 NO TMR0
MOVWF OPTION_REG ; PULL'UPS DESABILITADOS
; DEMAIS CONFIGURAÇÕES SÃO IRRELEVANTES
MOVLW 0X00
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ; VOLTA AO BANCO 0 (PADRÃO DE RESET)
BCF E ;ACERTA OS PINOS DE CONTROLE DO DISPLAY
BCF RS
;*******************************************************************
; Inicializa o display
; caracter 5x7, 2 linhas, cursor ligado, mensagem fixa
;*******************************************************************
;
DISPLAY_INIT
MOVLW .30 ; ESCREVE COMANDO 0X30 TRES VEZES
CALL DELAY_MS ; PARA INICIALIZAÇÃO
MOVLW 0x30
CALL SEND_CMD
MOVLW 0x30
CALL SEND_CMD
MOVLW 0X30
CALL SEND_CMD
MOVLW B'00111000' ; INTERFACE DE 8 VIAS
CALL SEND_CMD
MOVLW B'00000001' ; LIMPA DISPLAY
CALL SEND_CMD
MOVLW B'00001100' ; LIGAR DISPLAY SEM CURSOR
CALL SEND_CMD
MOVLW B'00000110' ; COMANDO PARA INCREMENTO AUTOMÁTICO À DIREITA
CALL SEND_CMD
CALL CARACTERE_1
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA DE ESCRITA DA TELA PRINCIPAL *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - "L"
; LINHA 2 - "R"
TELA_PRINCIPAL
MOVLW 0X01
CALL SEND_CMD ;LIMPA DISPLAY
MOVLW 0X80 ; COMANDO PARA POSICIONAR O CURSOR
CALL SEND_CMD ; LINHA 0 / COLUNA 0
MOVLW 'L' ;ESCREVE NA LINHA 0 COLUNA 0
CALL SEND_CHAR
MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL SEND_CMD ; LINHA 1 / COLUNA 0
MOVLW 'R'
CALL SEND_CHAR
;*******************************************************************************
; LOOP PRINCIPAL - MAIN
;*******************************************************************************
MAIN
CALL InitDeltaSigA2D
CALL DeltaSigA2D
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA PRINCIPAL *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; A ROTINA PRINCIPAL FICA COMPARANDO AS CONSTANTES DE C1 A C14 COM O RESULTADO DA CONVERSÃO E PULANDO PARA O PONTO CERTO DE ACORDO COM O VALOR.
PRINCIPAL
MOVLW C1
SUBWF RESULT,W ; SUBTRAI O VALOR DA CONVERSÃO DE C1
BTFSS STATUS,C ; TESTA CARRY, RESULTADO NEGATIVO?
GOTO VU_1
MOVLW C2
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_2
MOVLW C3
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_3
MOVLW C4
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_4
MOVLW C5
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_5
MOVLW C6
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_6
MOVLW C7
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_7
MOVLW C8
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_8
MOVLW C9
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_9
MOVLW C10
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_10
MOVLW C11
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_11
GOTO FIM
VU_1
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_2
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_3
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_4
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_5
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_6
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_7
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_8
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_9
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_10
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_11
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * FIM DO PROGRAMA *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
FIM
END ; FIM DO PROGRAMA
Se alguém do fórum puder dar uma mãozinha, agradeço. Aí vai uma parte do código em assembler. Já tentei usar sem as rotinas de divisão e multiplicação, mas o resultado foi o mesmo. Desculpem, mas a rotina é meio grande, mas coloquei o máximo de informação possível.
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * CONSTANTES INTERNAS *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; A DEFINIÇÃO DE CONSTANTES FACILITA A PROGRAMAÇÃO E A MANUTENÇÃO.
C1 EQU .18 ;CONSTANTES USADAS PARA POSTERIOR COMPARAÇÃO COM C2 EQU .36 ;CONVERSOR AD, PARA FORMAÇÃO DO BARGRAPH.
C3 EQU .54 .
C4 EQU .72
C5 EQU .90
C6 EQU .108
C7 EQU .126
C8 EQU .144
C9 EQU .162
C10 EQU .180
C11 EQU .198
C12 EQU .216
C13 EQU .234
C14 EQU .250
;****************************************************************************
; ROTINA PARA ESCRITA DE UM CARACTERE NA CGRAM DO DISPLAY
; ESTE CARACTERE SERÁ O CURSOR DO V.U.
;****************************************************************************
CARACTERE_1
MOVLW 0X40 ;APONTA PARA O PRIMEIRO ENDEREÇO DA CGRAM
CALL SEND_CMD
MOVLW 0X1E
CALL SEND_CHAR ;ENVIA OS BYTES NA SEQUÊNCIA, PARA FORMAR
MOVLW 0X1E ;O CARACTERE
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
RETURN
;******************************************************************
; ROTINA DE INICIALIZAÇÃO DO CONVERSOR SIGMA DELTA
;******************************************************************
InitDeltaSigA2D
bsf STATUS,RP0
movlw 0xEC
movwf VRCON
bcf PORTA,3 ; set comparator pin to output
bcf STATUS,RP0
movlw 0x06 ; set up for 2 analog comparators with common reference
movwf CMCON
return
;
; Delta Sigma A2D
; The code below contains a lot of nops and goto next instruction. These
; are necessary to ensure that each pass through the loop takes the same
; amount of time, no matter the path through the code.
;
DeltaSigA2D
clrf COUNTER
clrf RESULT
movlw 0x03 ; set up for 2 analog comparators with common reference
movwf CMCON
loop
btfsc CMCON,C1OUT ; Is comparator high or low?
goto complow ; Go the low route
comphigh
nop ; necessary to keep timing even
bcf PORTA,3 ; PortA.3 = 0
incfsz RESULT,f ; bump counter
goto eat2cycles ;
goto endloop ;
complow
bsf PORTA,3 ; Comparator is low
nop ; necessary to keep timing even
goto eat2cycles ; same here
eat2cycles
goto endloop ; eat 2 more cycles
endloop
incfsz COUNTER,f ; Count this lap through the loop.
goto eat5cycles ;
incf COUNTER,f ;
movf COUNTER,w ;
andlw 0xFF ; Are we done? (We're done when bit2 of
btfsc STATUS,Z ; the high order byte overflows to 1).
goto loop ;
goto exit
eat5cycles
goto $+1 ; more wasted time to keep the loops even
nop ;
goto loop ;
exit
movlw 0x06 ; set up for 2 analog comparators with common reference
movwf CMCON
return
;**************************************************************
; ROTINA DE ESCRITA DE COMANDO NO DISPLAY
;**************************************************************
SEND_CMD
MOVWF CHAR ;GUARDA O COMANDO OU CARACTERE EM CHAR
MOVLW .10
CALL DELAY_MS ;PERDE 10MS PARA ESTABILIZAÇÃO
BCF RS
BSF E ;ENVIA PULSO DE ENABLE AO DISPLAY
MOVF CHAR,W
MOVWF DISPLAY
BCF E
RETURN
;**************************************************************
; ROTINA DE ESCRITA DE CARACTERE NO DISPLAY
;**************************************************************
SEND_CHAR
MOVWF CHAR
MOVLW .10
CALL DELAY_MS
BSF RS
BSF E
MOVF CHAR,W
MOVWF DISPLAY
BCF E
RETURN
;**************************************************************
;* inicio do programa
;**************************************************************
INICIO
CLRF PORTA
CLRF PORTB
BANK1 ; SELECIONA O BANCO 1 DE MEMÓRIA
MOVLW B'00110111' ; AJUSTA OS BITS DO PORTA
MOVWF TRISA
MOVLW 0x00 ; AJUSTA OS BITS DO PORTB COMO SAÍDA
MOVWF TRISB
MOVLW B'10000000' ; PRESCALER 1:0 NO TMR0
MOVWF OPTION_REG ; PULL'UPS DESABILITADOS
; DEMAIS CONFIGURAÇÕES SÃO IRRELEVANTES
MOVLW 0X00
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ; VOLTA AO BANCO 0 (PADRÃO DE RESET)
BCF E ;ACERTA OS PINOS DE CONTROLE DO DISPLAY
BCF RS
;*******************************************************************
; Inicializa o display
; caracter 5x7, 2 linhas, cursor ligado, mensagem fixa
;*******************************************************************
;
DISPLAY_INIT
MOVLW .30 ; ESCREVE COMANDO 0X30 TRES VEZES
CALL DELAY_MS ; PARA INICIALIZAÇÃO
MOVLW 0x30
CALL SEND_CMD
MOVLW 0x30
CALL SEND_CMD
MOVLW 0X30
CALL SEND_CMD
MOVLW B'00111000' ; INTERFACE DE 8 VIAS
CALL SEND_CMD
MOVLW B'00000001' ; LIMPA DISPLAY
CALL SEND_CMD
MOVLW B'00001100' ; LIGAR DISPLAY SEM CURSOR
CALL SEND_CMD
MOVLW B'00000110' ; COMANDO PARA INCREMENTO AUTOMÁTICO À DIREITA
CALL SEND_CMD
CALL CARACTERE_1
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA DE ESCRITA DA TELA PRINCIPAL *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - "L"
; LINHA 2 - "R"
TELA_PRINCIPAL
MOVLW 0X01
CALL SEND_CMD ;LIMPA DISPLAY
MOVLW 0X80 ; COMANDO PARA POSICIONAR O CURSOR
CALL SEND_CMD ; LINHA 0 / COLUNA 0
MOVLW 'L' ;ESCREVE NA LINHA 0 COLUNA 0
CALL SEND_CHAR
MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL SEND_CMD ; LINHA 1 / COLUNA 0
MOVLW 'R'
CALL SEND_CHAR
;*******************************************************************************
; LOOP PRINCIPAL - MAIN
;*******************************************************************************
MAIN
CALL InitDeltaSigA2D
CALL DeltaSigA2D
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA PRINCIPAL *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; A ROTINA PRINCIPAL FICA COMPARANDO AS CONSTANTES DE C1 A C14 COM O RESULTADO DA CONVERSÃO E PULANDO PARA O PONTO CERTO DE ACORDO COM O VALOR.
PRINCIPAL
MOVLW C1
SUBWF RESULT,W ; SUBTRAI O VALOR DA CONVERSÃO DE C1
BTFSS STATUS,C ; TESTA CARRY, RESULTADO NEGATIVO?
GOTO VU_1
MOVLW C2
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_2
MOVLW C3
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_3
MOVLW C4
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_4
MOVLW C5
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_5
MOVLW C6
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_6
MOVLW C7
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_7
MOVLW C8
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_8
MOVLW C9
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_9
MOVLW C10
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_10
MOVLW C11
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_11
GOTO FIM
VU_1
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_2
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_3
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_4
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_5
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_6
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_7
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_8
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_9
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_10
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
VU_11
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * FIM DO PROGRAMA *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
FIM
END ; FIM DO PROGRAMA