Ir ao conteúdo
  • Cadastre-se

PIC Programação PIC16f628A Linguagem Assembly


Posts recomendados

Bom dia Pessoal,

 

Tenho um código em assembly de um microcontrolador Pic16f628a, e gostaria de fazer uma alteração mas não estou conseguindo sou bem leigo a respeito de assembly não compreendo muito bem a linguagem, mas o que eu gostaria de fazer neste código é ao detectar o sensor que está no portb,6 ele já aciona a saída automaticamente eu gostaria de adicionar um delay ajustável pelo display após a detecção para o acionamento da saída alguém poderia me ajudar ? 

codigo.txt

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo tenta com outro mc do arduino ou em c. A chance de ser ajudado amenta exponencialmente. Até baixei o programa mas ... 62000 bytes de fonte pra analisar pra você ?? ... é meio muitinho não?

 

Pra quem não quiser baixar  olhe ele aí..

 

 


;***************************************************************************************************
;*                                                       *
;***************************************************************************************************
    list     p=16F628a    ;INFORMA O PIC UTILIZADO
    radix      dec         ;informa para o compilador onde nao tiver sistema
                 ;de numeracao indicado, entender como decimal
    include    <p16f628a.inc>  
    __config _cp_off & _wdt_off & _pwrte_on & _boden_on & _mclre_off & _xt_osc & _lvp_off

       org 0x2100
       de  0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0


      cblock 0x20        ; endereço inicial da memoria de usuário
   
        flag             ;20 sinalizadores do cdr
        flag1            ;21
        flag2            ;22
        flag3            ;23escrever digitos
        setpointu        ;24 setpoint da duração (unidade)
        setpointd        ;25 setpoint da duracão (dezena)
        setpointc        ;26 setpoint da duração (centena)
        setpointu1       ;27 setpoint do intervalo (unidade)
        setpointd1       ;28 setpoint do intervalo (dezena)
        setpointc1       ;29 setpoint do intervalo (centena)
        setpointu2       ;2a
        setpointd2       ;2b
        setpointc2       ;2c
        t1_cont          ;2d
        valor            ;2f armazena o dado ou comando a ser escrito no lcd
        x                ;30
        x1               ;31
        temp_sensor      ;32tempo para verificar se o sensor esta atuado ou desatuado
        tempo            ;33
        temp1            ;34
        temp2            ;35
        temp3            ;36 tempo em que o digito fica piscando no modo de progamaçao
        temp_totalizador ;37 tempo em que o totalizador vai ser mostrado
        temp_tela_principal ;38 tempo em que a tela principal vai ser mostrada
        temp_ejecao_manual  ;39tempo em que a ejecao vai ficar acionada
        temp10           ;3a
        temp8            ;3b
        temp9            ;3c
        unidade          ;3d unidade duração     
        dezena           ;3f dezenna duração        
        centena          ;40 centena duração
        unidade1         ;41 unidade1 intervalo
        dezena1          ;42 dezena1  intervalo
        centena1         ;43 centena1 intervalo
        unidade2         ;44 digitos do totalizador
        dezena2          ;45         "
        centena2         ;46         "
        milhar2          ;57        "
        milhar2_1        ;48         "
        milhar2_2        ;49         "
        milhar2_3        ;4a
        milhar2_4        ;4b
        eprom            ;4c
        sai_pr           ;4d sai da programação voltando para a tela principal
        pulso            ;4f-inicia a saida pulsante 1-inicia a saida pulsante
        numero_ejecoes_digito1;50
        numero_ejecoes_digito2;51
        soma             ;52
        progdig1         ;53
        progdigu1        ;54
        ligado           ;55
        temp10_1         ;56
        geral            ;57
        geral1           ;58
        geral3           ;59
        ganho            ;5a
        ganho1           ;5b
        ganho2           ;5c
        ganho3           ;5d
        inicio1          ;5etempo de espera para inicializar o equipamento
        saida_pulsante   ;5fhabilita saida pulsante       
        saida_pulsante1  ;60liga e desliga a saida da solenoide  no modo pulsante
        start            ;61inicia a saida em on(1) ou em off(0)
        out1             ;62inicia a contagem do tempo em on(1) ou em off(0)
        out2             ;63escreve no display a contagem do tempo off ou on
        somar_ganho      ;64verifica se o ganho esta em 0 ,estando em 0 desabilita o totalizador
        unidade3         ;65 digito do tempo pulsante
        dezena3          ;66 digito do tempo pulsante
        setpointu3       ;67     
        setpointd3       ;68
        setpointu3_1     ;69setpoint da saida pulsante (0,5 seg)
        setpointu3_11    ;6aregistrador auxiliar do setpoint
        flag4            ;6b
        numero_ejecoes_digito1_aux;6c
        numero_ejecoes_digito2_aux;6d
    
endc

cblock 0x70

        progdig          ;70 regidtrador de programação
        geral2           ;71
        w_temp           ;72 salva w em w_temp
        status_temp      ;73 salva status em status_temp
       
        w_temp1          ;23
        status_temp1     ;24
        w_temp2          ;25
        status_temp2     ;26
        w_temp3          ;27
        status_temp3     ;28

        endc

;               portb,  ; entrada
;               portb,5 ; nao utilizada
;               portb,6 ; 1-habilita 0-desabilita o lcd a escrever dados ou comando
;               portb,0 ; interrupçao externa (salva a contagem do totalizador)       
;               portb,1 ; entrada do senssor de nivel
#define  botao1 portb,4 ; botao de configuração
#define  botao2 porta,5 ; botao de programaçao
#define  botao3 portb,3 ; botao de ejeçao manual

#define  led   portb    ,7 ; rele
#define  pr    flag     ,0 ; sai da programação
#define  fim   flag     ,1 ; fim da contagem
#define  pr1   progdigu1,0 ; faz o disply piscar
#define  incms flag     ,2 ; escreve o numero 5 ou 0 no lcd
#define  tela_principal       flag,3 ;1-escreve no display a tela principal
#define  tot.                 flag,4 ; 0-não totaliza , 1 totaliza
#define  tot                  flag,5 ; sai da totalização
#define  pr_setpoint          flag,6 ; programa somente o setpoint
#define  tmr                  flag,7 ; timer habilitado
#define  tmr1                 flag1,0 ; timer desabilitado
#define  most_totalizador     flag1,1 ; 0-nao mostra a tela do totalizador 1-mostra a tela do totalizador
#define  t_m_r                flag1,2 ; timer desabilitado
#define  pis                  flag1,3 ; permite piscar digito
#define  stop                 flag1,4 ; vai para 1 quando o timer desligar e zera contagem
#define  saida_ligada         flag1,5 ; 1-indica saida acionada 0-saida desligada
#define  ej_manual            flag1,7 ; ejecao manual 1-habilita 0-desabilitada
#define  hab_ej_manual        flag2,1 ; 1-ejecao manual habilitado 0-desabilitado
#define  sensor               flag2,2 ; verifica se o sensor esta atuado 1-atuado
#define  gr                   flag2 ,3 ; 0-normal              1-gravar ao iniciar o sistema
#define  hab_most_totalizador flag2,4 ;1-habiltado 0-desabilitado
#define  alterador_tela       flag2,5 ;0-tela principal 1_tela do totalizador
#define  al_par               flag2 ,6 ; 0-nao atualiza        1-atualiza parametros
#define  al_out               flag2 ,7 ; 0-saida nao alterada  1-saida alterada
#define  d1                   flag3 ,0 ; digito do intervalo
#define  d2                   flag3 ,1 ; digito do intervalo
#define  d3                   flag3 ,2 ; digito do intervalo
#define  numero_ejecoes_habilitado flag4,0; 1-numero ejecoes habilitado 0-desabilitada
#define  numero_ejecoes_concluido  flag4,1; 1-contagem chegou ao final 0-não


     org    0x000       ; endereço inicial de processamento
     goto   inicio

     org    0x004       ; endereço inicial de interrupção

     movwf  w_temp      ; salva w em w_temp
     swapf  status,w
     movwf  status_temp ; salva status em status_temp

     btfsc  intcon,intf
     goto   int_externa

     btfsc  pir1,tmr1if
     goto   timer1

     btfss  intcon,t0if
     goto   sai_int

     movf  w_temp,w
     movwf w_temp1
     movf  status_temp,w
     movwf status_temp1
     
     bcf    intcon,t0if   ; limpa flag de sinalizaçao do timer0
    
     movlw  256-125       ; carrega o timer0 com valor 131
     movwf  tmr0
 
     btfss  numero_ejecoes_concluido
     bsf    portb,1    
    
dec_temp3                      ;faz digito piscar quando na tela de programação       
     decfsz temp3              ;contador de 240ms
     goto   continua0          ;continua o prograna
     movlw  30
     movwf  temp3
     movlw  b'11111111'
     xorwf  progdigu1,f
     btfss  numero_ejecoes_concluido
     goto  continua0
     btfss  portb,1
     goto   $+3
     bcf   portb,1
     goto  continua0
     bsf   portb,1      

continua0  

      btfsc  hab_ej_manual     ;1-ejecao manual acionada 0-desligada
      goto   dec_temp1

      decfsz temp_sensor
      goto   dec_temp1

      movlw  125
      movwf  temp_sensor
               
      btfss  portb,6       ; entrada do senssor de nivel 1-hab_timer1 0-des_timer1
      goto   desabilita_timer1
 
 
hab_timer1                ; habilita contagem do timer1
     btfsc  hab_ej_manual
     goto   dec_temp1
     btfss  tmr           ; verifica se timer1 ja esta habiltado 1-habilitar 0-habilitado
     goto   dec_temp1     ;faz digito piscar quando na tela de programação  
     movlw  125
     movwf  temp_sensor
     movf   start,w
     movwf  out1
     movwf  out2
     bsf    saida_pulsante1,0
     bcf    tmr           ; reset bit tmr(confirma timer1 habilitado)
     bsf    tmr1          ; set bit tmr1 ( permite desabilitar timer1)  
     bsf    t_m_r         ; set bit t_m_r timer1 habiliado
     bsf    ligado,0      ; set bit tmr1_lig (faz a palvra on ficar piscando)
     btfss  start,0
     goto   $+7
     bsf    led
     btfsc  numero_ejecoes_habilitado
     call  contagem_numero_ejecoes
     bcf    ej_manual
     bsf    saida_ligada  ;saida ligada
     bsf    tot.          ; set bit tot.(para permiter totalizar)
     bsf    sensor        ;sensor atuado
     movlw  220
     movwf  tmr1l         ; carrega a parte baixa do timer1 com valor 220
     movlw  11
     movwf  tmr1h         ; carrega a parte alta do timer1 com valor 11
     movlw  2
     movwf  t1_cont       ; carrega t1_cont con valor 2
     bsf    t1con,tmr1on  ; habilitao registrador do timer1
     goto   dec_temp1     ; faz digito piscar quando na tela de programação  

desabilita_timer1
     btfsc  portb,6      ; entrada do senssor de nivel 1-hab_timer1 0-des_timer1
     goto   dec_temp1
     btfss  tmr1         ; verifica se timer1 ja esta desabilitado 1-desabilitar 0-desabilitado      
     goto   dec_temp1    ; faz digito piscar quando na tela de programação  
     bcf    t1con,tmr1on ; desbilita regestrador do timer1
     movlw  125
     movwf  temp_sensor
     movf   start,w
     movwf  out1
     movwf  out2
     bsf    saida_pulsante1,0
     bsf    ej_manual
     bsf    stop
     bcf    pis
     bcf    led          ; desliga saida
     bsf    tmr          ; set bit tmr (permite habilitar timer1)
     bcf    t_m_r        ; reset bit t_m_r timer1 desabilitado     
     bcf    tmr1         ; reset bit tmr1 (confirma timer1 desabilitado)
     bcf    saida_ligada ;saida desligada
     bcf    sensor       ; sensor desatuado
     bcf    numero_ejecoes_concluido
     clrf   temp8
     clrf   temp9
     clrf   temp10_1
     clrf   unidade      ; limpa digito
     clrf   unidade1
     clrf   dezena
     clrf   dezena1
     clrf   centena
     clrf   centena1
     movf numero_ejecoes_digito1,w
     movwf numero_ejecoes_digito1_aux
     movf numero_ejecoes_digito2,w
     movwf numero_ejecoes_digito2_aux

dec_temp1                    
     decfsz temp1             ;contador do timer0 (125)
     goto   sai_int           ;sai da interrupçao

     movlw  125
     movwf  temp1

     btfss  hab_ej_manual     ;1-ejecao manual acionada 0-desligada
     goto   continua0_1

     btfss  botao3
     goto   sai_int
     decfsz temp_ejecao_manual
     goto   sai_int
     bcf    saida_ligada  
     bsf    tela_principal
     bcf    hab_ej_manual
     movlw  125
     movwf  temp_sensor
     btfss  sensor
     goto   $+12
     btfsc  numero_ejecoes_habilitado
     goto   $+10
     bsf    ligado,0
     bsf    saida_pulsante1,0
     movlw  220
     movwf  tmr1l         ; carrega a parte baixa do timer1 com valor 220
     movlw  11
     movwf  tmr1h         ; carrega a parte alta do timer1 com valor 11
     movlw  2
     movwf  t1_cont       ; carrega t1_cont con valor 2
     bsf    t1con,tmr1on
     bcf    led
     goto   sai_int
     
continua0_1
     btfss  hab_most_totalizador ;1-permite mostrar totalizador 0-nao permite
     goto   dec_temp2
     btfsc  alterador_tela       ;0-tela principal 1-tela do totalizador
     goto   dec_tempo_totalizador;conta o tempo em que a tela do totalizador é mostrada no display
     decfsz temp_tela_principal  ;conta o tempo em que a tela principal é mostrada no display
     goto   dec_temp2
     movlw  10
     movwf  temp_tela_principal
     bsf    most_totalizador     ;mostrar totalizador
     bsf    alterador_tela       ;tela alterada
     goto   dec_temp2  
         
dec_tempo_totalizador
     decfsz temp_totalizador     ;conta o tempo em que o totalizador vai ser mostrado no display
     goto   dec_temp2
     movlw  3
     movwf  temp_totalizador
     bsf    tela_principal
     bcf    alterador_tela
              
dec_temp2  
     decfsz temp2             ;contador de 10seg
     goto   sai_int

     movlw  10
     movwf  temp2
    
     bcf    pr                ;0 o bit pr para sair da tela de programação

sai_int
     btfsc  tot.
     call   totalizador  
    
     swapf  status_temp1,w
     movwf  status
     swapf  w_temp1,f
     swapf  w_temp1,w
     
     retfie

int_externa
        
        movf  w_temp,w
        movwf w_temp3
        movf  status_temp,w
        movwf status_temp3

      
        bcf    portb,1          ;desabilita backligth
        bcf    portb,7          ;desabilita rele

        bcf    intcon,intf
        bcf    t1con,tmr1on
        bcf    intcon,t0ie
        bcf    intcon,inte  

        movlw  9
        movwf  geral2
        movf  unidade2,w
        movwf progdig
        call  esc_e2prom

        incf  geral2,f
        movf  dezena2,w
        movwf progdig
        call  esc_e2prom

        incf  geral2,f
        movf  centena2,w
        movwf progdig
        call  esc_e2prom

        incf  geral2,f
        movf  milhar2,w
        movwf progdig
        call  esc_e2prom                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          call   esc_e2prom
     
        incf   geral2,f
        movf   milhar2_1,w
        movwf  progdig
        call   esc_e2prom
       
        incf   geral2,f
        movf   milhar2_2,w
        movwf  progdig
        call   esc_e2prom

        incf   geral2,f
        movf   milhar2_3,w
        movwf  progdig
        call   esc_e2prom
       
        incf   geral2,f
        movf   milhar2_4,w
        movwf  progdig
        call   esc_e2prom

        bsf    t1con,tmr1on
        bsf    intcon,t0ie
        bsf    intcon,inte  

sai_int2
        swapf  status_temp3,w
        movwf  status
        swapf  w_temp3,f
        swapf  w_temp3,w
        retfie
     
timer1
        
        movf  w_temp,w
        movwf w_temp2
        movf  status_temp,w
        movwf status_temp2
        
        bcf   pir1,tmr1if
        bsf   pis
        
        movlw  220
        addwf  tmr1l

        movlw  11
        movwf  tmr1h
        
        movlw  b'11111111'
        xorwf  ligado,f
       
dec_t1cont
        decfsz t1_cont,f
        goto   sai_int1

        movlw  2
        movwf  t1_cont

        btfss  out1,0
        goto   intervalo

        clrf   centena
        clrf   dezena
        clrf   unidade
        bsf    out2,0    

inc_unidade1
        bsf    d1
        incf   unidade1
        movlw  10
        xorwf  unidade1,w
        btfsc  status,z
        goto   digdezena1
        goto   sai_int1
       
digdezena1
        bsf    d1
        clrf   unidade1
        bsf    d2
        incf   dezena1
        movlw  10
        xorwf  dezena1,w
        btfsc  status,z
        goto   digcentena1
        goto   sai_int1
       
digcentena1   
        bsf    d2
        clrf   dezena1
        bsf    d3
        incf   centena1
        movlw  10
        xorwf  centena1,w
        btfsc  status,z
        goto   sai_int1
        goto   sai_int1

sai_int1
        call   comparar1    
        btfss  out1,0
        goto   sai_int1_1

        btfss  pulso,0
        goto   sair_interrupicao

        incf   temp8,f
        movlw  2
        xorwf  temp8,w
        btfsc  status,z
        goto   inc_temp9
        goto   comp_saida         ;compara saida pulsante se for igual a saida muda de estado
       
inc_temp9
        clrf   temp8
        incf   temp9,f

comp_saida
        movf   temp9,w
        xorwf  temp10,w           ; set_point da dezena
        btfss  status,z
        goto   sair_interrupicao
        movf   temp8,w
        xorwf  setpointu3_1,w     ; set_point da unidade
        btfss  status,z
        goto   sair_interrupicao
       
        clrf  temp9
        clrf  temp8
       
        movlw  b'11111111'
        xorwf  saida_pulsante1,f

        btfss  saida_pulsante1,0
        goto   desligar_saida

        bsf    led
        goto   $+2

desligar_saida
        bcf    led

sair_interrupicao   
        swapf  status_temp2,w
        movwf  status
        swapf  w_temp2,f
        swapf  w_temp2,w
        retfie

totalizador
        btfss  tot.
        return
     
        bcf    tot.

somar_digito1
        movf   ganho,w
        btfsc  status,z
        goto   somar_digito2
        addwf  unidade2,f
        movlw  10
        subwf  unidade2,w
        btfsc  status,c
        goto   sub_digito1
        goto   somar_digito2

sub_digito1
        movlw  10
        subwf  unidade2,f
        incf   dezena2

somar_digito2
        movf   ganho1,w
        btfsc  status,z
        goto   $+2
        addwf  dezena2,f
        movlw  10
        subwf  dezena2,w
        btfsc  status,c
        goto   sub_digito2
        goto   somar_digito3

sub_digito2
       movlw   10
       subwf   dezena2,f
       incf    centena2

somar_digito3
       movf   ganho2,w
       btfsc  status,z
       goto   $+2
       addwf  centena2,f
       movlw  10
       subwf  centena2,w
       btfsc  status,c
       goto   sub_digito3
       goto   somar_digito4

sub_digito3
       movlw   10
       subwf   centena2,f
       incf    milhar2

somar_digito4
       movf   ganho3,w
       btfsc  status,z
       goto   $+2
       addwf  milhar2,f
       movlw  10
       subwf  milhar2,w
       btfsc  status,c
       goto   sub_digito4
       return

sub_digito4
       movlw   10
       subwf   milhar2,f
       incf    milhar2_1
       movlw   10
       xorwf   milhar2_1,w
       btfsc   status,z
       goto    somar_digito6
       return
       
somar_digito6
       clrf    milhar2_1
       incf    milhar2_2
       movlw   10
       xorwf   milhar2_2,w
       btfsc   status,z
       goto    somar_digito7
       return

somar_digito7
       clrf    milhar2_2
       incf    milhar2_3
       movlw   10
       xorwf   milhar2_3,w
       btfsc   status,z
       goto    somar_digito8
       return
 
somar_digito8
       clrf    milhar2_3
       incf    milhar2_4
       movlw   10
       xorwf   milhar2_4,w
       btfsc   status,z
       clrf    milhar2_4
       return

comparar1
        movf   setpointc,w
        subwf  centena1,w        ; set_point da dezena
        btfss  status,c
        return
        movf   setpointd,w
        subwf  dezena1,w        ; set_point da dezena
        btfss  status,c
        return
        movf   setpointu,w
        subwf  unidade1,w        ; set_point da unidade
        btfss  status,c
        return
        bsf   ej_manual
        bcf   out1,0
        btfss botao3
        return
        bcf   saida_ligada
        bcf   led
        btfss numero_ejecoes_habilitado
        return
        btfss start,0
        call  contagem_numero_ejecoes
        return
       
intervalo
        clrf   centena1
        clrf   dezena1
        clrf   unidade1
        bcf    out2,0
        bsf    d1
        incf   unidade
        movlw  10
        xorwf  unidade,w
        btfsc  status,z
        goto   digdezena
        goto   sai_int1_1
       
digdezena
        bsf    d1
        clrf   unidade
        bsf    d2
        incf   dezena
        movlw  10
        xorwf  dezena,w
        btfsc  status,z
        goto   digcentena
        goto   sai_int1_1
       
digcentena
        bsf    d2  
        clrf   dezena
        bsf    d3
        incf   centena
        movlw  10
        xorwf  centena,w
        btfsc  status,z
        goto   sai_int1_1
        goto   sai_int1_1

sai_int1_1
        call   comparar
        swapf  status_temp2,w
        movwf  status
        swapf  w_temp2,f
        swapf  w_temp2,w
        retfie

comparar
        movf   setpointc1,w
        subwf  centena  ,w        ; set_point da dezena
        btfss  status,c
        return
        movf   setpointd1,w
        subwf  dezena,w        ; set_point da dezena
        btfss  status,c
        return
        movf   setpointu1,w
        subwf  unidade,w        ; set_point da unidade
        btfss  status,c
        return
        bcf   ej_manual
        bsf   saida_ligada
        bsf   led
        bsf   ligado,0
        bsf   tot.
        bsf   out1,0
        bsf   saida_pulsante1,0
        clrf  temp8
        clrf  temp9
        movlw 125
        movwf temp_sensor
        btfss numero_ejecoes_habilitado
        return
        btfss start,0
        return
        call  contagem_numero_ejecoes
        return

limpar1
        clrf  unidade2
        clrf  dezena2
        clrf  centena2
        clrf  milhar2
        clrf  milhar2_1
        clrf  milhar2_2
        clrf  milhar2_3
        clrf  milhar2_4
        return

principal
        bcf   tela_principal
        bcf   alterador_tela
        bcf   most_totalizador
        movlw 10
        movwf temp_tela_principal
        movlw 4
        movwf temp_totalizador

        movlw 0x01
        call  cmlcd

        movlw 0x82
        call  cmlcd
        movlw 'O'
        call  wrlcd
        movlw 'N'
        call  wrlcd
        movlw ' '
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  setpointc,w
        addlw 0x30
        call  wrlcd
        movf  setpointd,w
        addlw 0x30
        call  wrlcd
        movf  setpointu,w
        addlw 0x30
        call  wrlcd
        movlw ' '
        call  wrlcd
        movlw  'S'
        call  wrlcd
        movlw  ' '
        call   wrlcd
        movf   centena1,w
        addlw  0x30
        call   wrlcd
        movf   dezena1,w
        addlw  0x30
        call   wrlcd
        movf   unidade1,w
        addlw  0x30
        call   wrlcd
        
        movlw  0xC2
        call   cmlcd

        movlw  'O'
        call   wrlcd
        movlw  'F'
        call   wrlcd
        movlw  'F'
        call   wrlcd
        movlw  '='
        call   wrlcd
        movf   setpointc1,w
        addlw  0x30
        call   wrlcd
        movf   setpointd1,w
        addlw  0x30
        call   wrlcd
        movf   setpointu1,w
        addlw  0x30
        call   wrlcd
        movlw  ' '
        call   wrlcd
        movlw  'S'
        call   wrlcd
        movlw  ' '
        call   wrlcd
        movf   centena,w
        addlw   0x30
        call   wrlcd
        movf   dezena,w
        addlw  0x30
        call   wrlcd
        movf   unidade,w
        addlw  0x30
        call   wrlcd
        return
 
mostrar_totalizador
        movlw 4
        movwf temp_totalizador
        bcf   most_totalizador
        movlw 0x01
        call  cmlcd
        movlw 0x82
        call  cmlcd
        movlw 'T'
        call  wrlcd
        movlw 'O'
        call  wrlcd
        movlw 'T'
        call  wrlcd
        movlw 'A'
        call  wrlcd
        movlw 'L'
        call  wrlcd
        movlw 'I'
        call  wrlcd
        movlw 'Z'
        call  wrlcd
        movlw 'A'
        call  wrlcd
        movlw 'D'
        call  wrlcd
        movlw 'O'
        call  wrlcd
        movlw 'R'
        call  wrlcd
        movlw 0xC2
        call  cmlcd
        movf   milhar2_4,w
        addlw  0x30
        call   wrlcd
        movf   milhar2_3,w
        addlw  0x30
        call   wrlcd
        movlw  '.'
        call   wrlcd
        movf   milhar2_2,w
        addlw  0x30
        call   wrlcd
        movf   milhar2_1,w
        addlw  0x30
        call   wrlcd
        movf   milhar2,w
        addlw  0x30
        call   wrlcd
        movlw  '.'
        call   wrlcd
        movf   centena2,w
        addlw  0x30
        call   wrlcd
        movf   dezena2,w
        addlw  0x30
        call   wrlcd
        movf   unidade2,w
        addlw  0x30
        call   wrlcd
        movlw  ' '
        call   wrlcd
        movlw  'M'
        call   wrlcd
        movlw  'L'
        call   wrlcd
     
        return
 
ejecao_manual
        bsf    led
        bsf    hab_ej_manual
        bcf    t1con,tmr1on
        movlw  2
        movwf  temp_ejecao_manual
        btfsc  saida_ligada
        goto   $+2
        bsf    tot.          ; set bit tot.(para permiter totalizar)
        movlw 0x01           ; limpa lcd
        call  cmlcd          ; limpa lcd

        movlw  0x85
        call  cmlcd

        movlw 'E'
        call  wrlcd
        movlw 'J'
        call  wrlcd
        movlw 'E'
        call  wrlcd
        movlw 'C'
        call  wrlcd
        movlw 'A'
        call  wrlcd
        movlw 'O'
        call  wrlcd   
                

        movlw 0xC5
        call  cmlcd
        movlw 'M'           
        call  wrlcd          ; comando para escrever no lcd          
        movlw 'A'         
        call  wrlcd         
        movlw 'N'
        call  wrlcd
        movlw 'U'
        call  wrlcd
        movlw 'A'
        call  wrlcd
        movlw 'L'
        call  wrlcd

        btfsc hab_ej_manual
        goto  $-1
        return

;************************* INICIALIZAÇÃO DO LCD ************************

inilcd:
    movlw    30
    call    ms
    movlw    0x28    ;LCD 16x2 4 bits de dados
    call    cmlcd    
    movlw    0x0C    ;display com cursor piscante
    call    cmlcd
    movlw   0x14
    call    cmlcd
    movlw    0x01    ;limpa todo display
    call     cmlcd
    return

;************************ ESCRITA DE COMANDO NO LCD ***********************

cmlcd:
    movwf    valor    ;salva o valor a ser escrito em byte auxiliar
    swapf    valor    ;troca nible,para mandar o mais significativo primeiro
    movf    valor,w
    movwf    porta    ;coloca o valor na porta a
    bcf    porta,4    ;seleciona escrita no lcd
    nop
    bsf    portb,2    ;habilita chip
    movlw    1
    call    ms
    bcf    portb,2    ;desabilita chip
    movlw    3
    call    ms
    swapf    valor    ;destroca o nibble
    movf    valor,w
    movwf    porta
    bcf    porta,4
    nop
    bsf    portb,2
    movlw    1
    call    ms
    bcf    portb,2
    movlw    3
    call    ms  
    return

;*********************** ESCRITA DE CARACTERES NO LCD ************************
 
wrlcd:
    movwf    valor    ;Armazena o caracter
    swapf    valor    ;troca nible para mandar o mais significativo primeiro
    movf    valor,w
    movwf    porta
    bsf    porta,4    ;habilita escrita de dados
    bsf    portb,2    ;habilita chip
    movlw    1
    call    ms
    bcf    portb,2    ; desabilita chip
    movlw    1
    call    ms
    swapf    valor    ;destroca o nible colocando o valor menos significativo
    movf    valor,w
    movwf    porta
    bsf    porta,4    ;habilita escrita de dados
    bsf    portb,2    ;habilita chip
    movlw    1
    call    ms
    bcf    portb,2    ; desabilita chip
    movlw    1
    call    ms
    return

;****************************************************************************
;*          Rotina obrigatoria de reset do LCD ao ligar o sistema          *
;****************************************************************************

lcdreset:
    movlw    30    ;tempo de delay antes de resetar lcd
    call    ms    
    
    movlw    b'00000011'    ;coloca dados na porta A=00011, onde
    movwf    porta        ;ra0=b4, ra1=b5, ra2=b6, ra3=b7, ra4=RS e rb0=habilita

    bsf    portb,2    ;reseta lcd, habilitando por 5ms-hi e 1 ms-low rb0
    movlw    5
    call    ms
    bcf    portb,2
    movlw    1
    call    ms

    bsf    portb,2    ;mais 1 ms em alto e 1 ms em baixo
    movlw    1
    call    ms
    bcf    portb,2
    movlw    1
    call    ms

    bsf    portb,2    ;mais 1 ms em alto e 1 ms em baixo
    movlw    1
    call    ms
    bcf    portb,2
    movlw    1
    call    ms

    movlw    b'00000010'    ;reseta display. porta = 00010
    movwf    porta
    bsf    portb,2    ;mais 1 ms em alto e 1 ms em baixo em rb0
    movlw    1
    call    ms
    bcf    portb,2
    movlw    1
    call    ms
    return    

;************************* delay de milissegundos *************************


ms:
        movwf    tempo        ; Carrega o tempo com valor determinado
                ; antes do call ms
ms1:                    
    movlw    249        ;carrega x com o valor 249 (decimal)
    movwf    x
ms2:                ;Ate aqui incluindo o call gastaram-se 6 us.
    nop            ;+ 1 us
    decfsz    x        ;+ 1 us
    goto    ms2        ;+ 2 us, totalizando 4 us. 6 us + (4 us x 249)
                ; = 1002 us
                
    decfsz    tempo        ;decrement                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 em 1 e testa se chegou a zero    
    goto    ms1        ;vai a ms1 se tempo nao chegou a zero
    return            ; retorna da sub-rotina apos 100 ms

le_e2prom

        banksel eecon1
        movwf   eeadr
        bsf     eecon1,rd     ; prepara leitura
        movf    eedata,w      ; coloca dado em w
        banksel porta
        return  

filtro                        ; filtro das chaves
        movlw 250
        call  ms
        return

load_timer0  
        movlw 10
        movwf temp2
        bsf   pr
        return

programar2
        movf geral,w
        call  cmlcd
        btfss pr1
        goto  apaga
        movf  progdig,w
        movwf progdig
        btfsc incms
        goto  $+4
        addlw 0x30
        call  wrlcd
        return

        movf  progdig,w
        btfss status,z
        goto  $+4
        movlw '0'
        call  wrlcd
        return
        movlw '5'
        call  wrlcd
        return       
        
apaga
        movlw ' '
        call  wrlcd
        return
        
incrementar
        bsf   al_par       ;parametro alterado
        incf  progdig
        movf  progdig,w
        subwf geral1,w
        btfss status,c
        goto  limpar
        
limpo
        movf  geral,w
        call  cmlcd
        movf  progdig,w
       
        movwf progdig1
        btfsc incms
        goto  $+3
        addlw 0x30
        call  wrlcd
        call  load_timer0
        call  filtro
        return

limpar
       clrf   progdig
       goto   limpo
       
esc_e2prom

        bcf     intcon,gie
        banksel eedata
        movf    geral2,w
        movwf   eeadr
        movf    progdig,w
        movwf   eedata
        bsf     eecon1,wren
        movlw   0x55
        movwf   eecon2
        movlw   0xAA
        movwf   eecon2
        bsf     eecon1,wr        
    
escrevendo
    
        btfsc eecon1,wr
        goto  escrevendo
        bcf   eecon1,wren
    
        banksel porta
        bsf     intcon,gie
        return

esc_dado                          ; escrever dado armazenado na memoria de programa
        
    movf  geral,w
        call  cmlcd
        movf  progdig,w
        btfsc incms
        goto  $+4
        addlw 0x30
        call  wrlcd
        return
        call  digito1_tempo
        return

digito1_tempo
        movf  progdig,w
        btfss status,z
        goto  $+4
        movlw '0'
        call  wrlcd
        return
        movlw '5'
        call  wrlcd
        return


le_inicio1
        movlw 0
        call  le_e2prom
        movwf ganho
        movwf soma

        movlw 7
        call  le_e2prom
        movwf ganho1
        addwf soma
      
        movlw 8
        call  le_e2prom
        movwf ganho2
        addwf soma

        movlw 22
        call  le_e2prom
        movwf ganho3
        addwf soma

        btfss status,z
        goto  n_ormal

        bcf   hab_most_totalizador  ;desahabilita a mostrar o totalizador
        return

n_ormal
        bsf   hab_most_totalizador  ;habilita a mostrar o totalizador
        return
           
le_inicio3
        clrf   unidade
        clrf   dezena
        clrf   centena
        clrf   unidade1
        clrf   dezena1
        clrf   centena1
        
        movlw  220
        movwf  tmr1l         ; carrega a parte baixa do timer1 com valor 220
        movlw  11
        movwf  tmr1h         ; carrega a parte alta do timer1 com valor 11
        movlw  2
        movwf  t1_cont       ; carrega t1_cont con valor 2

        movlw 21
        call le_e2prom
        movwf start
        movwf out1
        movwf out2

        movlw 1
        call  le_e2prom
        movwf setpointu
        movwf soma
           
        movlw 2
        call  le_e2prom
        movwf setpointd          ; setpoint da dezena Endereço2
        addwf soma
          
        movlw 3
        call  le_e2prom
        movwf setpointc
        addwf soma

        btfsc status,z
        incf  setpointu
                     
        movlw 4  
        call  le_e2prom
        movwf setpointu1
        movwf soma
      
        movlw 5  
        call  le_e2prom
        movwf setpointd1          ; setpoint da dezena Endereço2
        addwf soma      

        movlw 6  
        call  le_e2prom
        movwf setpointc1
        addwf soma

        btfsc status,z
        incf  setpointu1

        movlw 19
        call  le_e2prom
        movwf pulso

        clrf  temp8
        clrf  temp9
        clrf  temp10_1
                
        movlw 20
        call  le_e2prom
        movwf setpointu3
        movwf soma
        movwf temp10_1

        movlw 23
        call  le_e2prom
        movwf setpointd3
        movwf dezena3
        addwf soma

        movlw 24
        call  le_e2prom
        movwf setpointu3_1
        addwf soma
     
        movf  soma,w
        btfsc status,z
        goto  adicionar1
        goto  $+3

adicionar1
        movlw 1
        movwf setpointu3_1

dec8bin
        movlw 1
        subwf dezena3,f
        btfss status,c
        goto  $+4
        movlw 10
        addwf temp10_1
        goto  dec8bin

        movf  temp10_1,w
        movwf temp10

        movlw 25
        call  le_e2prom
        movwf numero_ejecoes_digito1
        movwf numero_ejecoes_digito1_aux
        movwf soma

        movlw 26
        call  le_e2prom
        movwf numero_ejecoes_digito2
        movwf numero_ejecoes_digito2_aux
        addwf soma,f
    
        movf  soma,w
        btfsc status,z
        goto  $+3
        bsf  numero_ejecoes_habilitado
        return
        bcf  numero_ejecoes_habilitado
        return

le_inicio2
         
        movlw  9
        call  le_e2prom
        movwf unidade2

        movlw  10
        call  le_e2prom
        movwf dezena2

        movlw  11
        call  le_e2prom
        movwf centena2

        movlw  12
        call  le_e2prom
        movwf milhar2
       
        movlw  13
        call  le_e2prom
        movwf milhar2_1   

        movlw 14
        call  le_e2prom
        movwf milhar2_2      

        movlw  15
        call  le_e2prom
        movwf milhar2_3

        movlw  16
        call  le_e2prom
        movwf milhar2_4

        return

contagem_numero_ejecoes
    
       movf numero_ejecoes_digito1_aux,w
       btfss status,z
       goto  decrementar_contagem_numero_ejecoes
       movf numero_ejecoes_digito2_aux,w
       btfss status,z
       goto  decrementar_contagem_numero_ejecoes
     
       movf numero_ejecoes_digito1,w
       movwf numero_ejecoes_digito1_aux
       movf numero_ejecoes_digito2,w
       movwf numero_ejecoes_digito2_aux
       bcf  t1con,tmr1on
       bcf  led
       bsf  stop
       bsf  ej_manual
       bcf  tot.
       bcf  saida_ligada
       bsf  numero_ejecoes_concluido
       return

decrementar_contagem_numero_ejecoes
       
       decf numero_ejecoes_digito1_aux,f
       movlw 0xff
       xorwf numero_ejecoes_digito1_aux,w
       btfss status,z
       return

       movlw .9
       movwf numero_ejecoes_digito1_aux
       movf numero_ejecoes_digito2_aux,w
       btfss status,z
       goto $+2
       return
       decf numero_ejecoes_digito2_aux,f
       return


       

inicio:
     banksel trisa           ; vai para o banco 1
    movlw    b'00100000'
    movwf    trisa        ;faz port A como saida
    movlw    b'01111001'
    movwf    trisb        ;Rb0 a Rb3 como saida e Rb4 a Rb7 como entrada
    movlw    b'10000101'
    movwf    option_reg    ;acerta o registro option
        movlw   b'01010000'
        movwf   intcon
        movlw   b'00000001'
        movwf   pie1
        bsf     pcon,oscf
      
        banksel porta           ;volta para o banco 0
   
        clrf   flag2  
        clrf   flag4
        clrf   portb
        clrf   ccp1con
        movlw  b'00110000'
        movwf  t1con
        movlw  b'00000111'      ;desliga os comparadores
        movwf  cmcon
        movlw  16
        movwf  inicio1
        bsf    portb,1
        bcf    portb,7
        call   le_inicio2
        call   le_inicio1
        clrf   geral3
        clrf   flag3
        clrf   eprom
        bcf    rcsta,spen       ;desliga a usart
        bcf    pis              ;permite piscar digito
        bcf    stop
        bsf    tmr
        bcf    tmr1
        bsf    ej_manual
        bcf    hab_ej_manual
        bcf    saida_ligada     ;saida desligada
        bcf    sensor           ;sensordesatuado
        bcf    tot.             ;nao totaliza
        movlw  125
        movwf  temp1
        movwf  temp_sensor

principal0
        call    lcdreset        ; inicio obrigatorio para o display
         call    inilcd      ;inicia display de cristal liquido
     
        movlw 0x84
        call  cmlcd

        movlw '*'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'T'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'E'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'S'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'T'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'E'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'L'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'C'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'D'
        call  wrlcd
        movlw 150
        call  ms

        movlw 0xC4
        call  cmlcd
      
        movlw 'F'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'U'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'N'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'C'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'A'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'O'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'L'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'C'
        call  wrlcd
        movlw 150
        call  ms

        movlw 'D'
        call  wrlcd
        movlw 150
        call  ms
 
        call  filtro
        decfsz inicio1
        goto   $-2

        call   le_inicio3

inicializar2
        bcf    pr_setpoint
        bcf    incms
        bcf    al_par
                  
        clrf   porta
        call   principal

        bsf    intcon,gie
        bsf    intcon,t0ie
        movlw  256-125
        movwf  tmr0
        btfss  botao2
        goto   $-1
        call   filtro

principal1_1
        btfss ej_manual
        goto  $+3
        btfss botao3
        call  ejecao_manual
        btfss tela_principal
        goto  $+2
        call  principal
        btfss most_totalizador
        goto  $+2
        call  mostrar_totalizador
        btfss botao1
        goto  bt1
        btfss botao2
        goto  pr_somente_setpoint     ;programa somente o setpoint
        btfsc alterador_tela
        goto  principal1_1  
        btfss t1con,tmr1on
        goto  timer1_desabilitado
        goto  timer1_habilitado

timer1_desabilitado

        btfsc stop                     ;timer parado
        goto  esc_on_off               ;1 escrever on e off no lcd
        goto  principal1_1

timer1_habilitado

        btfss  pis                     ; piscar digito
        goto   verificar_inc_digito
        bcf    pis
 
        btfss  out1,0
        goto   off

        movlw  0xC2
        call   cmlcd
        movlw  'O'
        call   wrlcd
        movlw  'F'
        call   wrlcd
        movlw  'F'
        call   wrlcd
      
        btfss  ligado,0
        goto   apagaron                 ; apagar on
        movlw  0x82
        call   cmlcd
        movlw  'O'
        call   wrlcd
        movlw  'N'
        call   wrlcd
        goto   verificar_inc_digito

apagaron
        movlw  0x82
        call   cmlcd
        movlw  ' '
        call   wrlcd
        movlw  ' '
        call   wrlcd
        goto   verificar_inc_digito

off
        movlw  0x82
        call   cmlcd
        movlw  'O'
        call   wrlcd
        movlw  'N'
        call   wrlcd

        btfss  ligado,0
        goto   apagaroff                    ; apagar on
        movlw  0xC2
        call   cmlcd
        movlw  'O'
        call   wrlcd
        movlw  'F'
        call   wrlcd
        movlw  'F'
        call   wrlcd
        goto   verificar_inc_digito

apagaroff
        movlw  0xC2
        call   cmlcd
        movlw  ' '
        call   wrlcd
        movlw  ' '
        call   wrlcd
        movlw  ' '
        call   wrlcd
        goto   verificar_inc_digito

esc_on_off
        call  principal
        bsf   ligado,0
        bcf   stop  
       
verificar_inc_digito
        btfsc  d1
        goto   escrever    
        goto   principal1_1

escrever
                
       btfss   out2,0               ; tempo em on
       goto    escrever_off         ; tempo em off

       movlw   0XCC
       call    cmlcd

       movlw  '0'
       call   wrlcd
       movlw  '0'
       call   wrlcd
       movlw  '0'
       call   wrlcd
 
       bcf     d1  
     
     
       movlw   0x8E
       call    cmlcd
       movf    unidade1,w
       addlw    0x30
       call    wrlcd

       btfss   d2
       goto    principal1_1
       bcf     d2     
       movlw   0x8D
       call    cmlcd
       movf    dezena1,w
       addlw   0x30
       call    wrlcd

       btfss   d3
       goto    principal1_1
       bcf     d3     
       movlw   0x8C
       call    cmlcd
       movf    centena1,w
       addlw   0x30
       call    wrlcd
       goto    principal1_1

escrever_off                    ; tempo em off
    
       movlw   0x8C
       call    cmlcd
       
       movlw   '0'
       call    wrlcd
       movlw   '0'
       call    wrlcd
       movlw   '0'
       call    wrlcd
         
tempo_off
       bcf     d1
   
       movlw   0xCE
       call    cmlcd
       movf    unidade,w
       addlw    0x30
       call    wrlcd

       btfss   d2
       goto    principal1_1
       bcf     d2    
     
   
       movlw   0xCD
       call    cmlcd
       movf    dezena,w
       addlw    0x30
       call    wrlcd

       btfss   d3
       goto    principal1_1
       bcf     d3     
      
      
       movlw   0xCC
       call    cmlcd
       movf    centena,w
       addlw   0x30
       call    wrlcd
       goto  principal1_1
        

pr_somente_setpoint
        bsf  pr_setpoint
        goto config

bt1
        btfsc botao2
        goto  principal1_1
        
config
        bsf   pr
        bcf   gr
        bcf   al_par
      
        movlw 30
        movwf temp3
        call  load_timer0

        movlw 0x01
        call  cmlcd
 
        btfss pr_setpoint
        goto  config1

        movlw 0x80
        call  cmlcd
        movlw '>'
        call  wrlcd
        movlw 'S'
        call  wrlcd
        movlw 'P'
        call  wrlcd
        movlw '-'
        call  wrlcd
        movlw 'O'
        call  wrlcd
        movlw 'N'
        call  wrlcd
        movlw ' '
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  setpointc,w
        addlw  0x30
        call  wrlcd
        movf  setpointd,w
        addlw 0x30
        call  wrlcd
        movf  setpointu,w
        addlw 0x30
        call  wrlcd

        movlw 0xC0
        call  cmlcd
        
        movlw ' '
        call  wrlcd
        movlw 'S'
        call  wrlcd
        movlw 'P'
        call  wrlcd
        movlw '-'
        call  wrlcd
        movlw 'O'
        call  wrlcd
        movlw 'F'
        call  wrlcd
        movlw 'F'
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  setpointc1,w
        addlw 0x30
        call  wrlcd
        movf  setpointd1,w
        addlw 0x30
        call  wrlcd
        movf  setpointu1,w
        addlw 0x30
        call  wrlcd
        goto  programar

config1
        
        movlw '>'
        call  wrlcd
        movlw 'O'
        call  wrlcd
        movlw 'U'
        call  wrlcd
        movlw 'T'
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  start,w
        addlw 0x30
        call  wrlcd
        movlw ' '
        call  wrlcd
        movlw ' '
        call  wrlcd
            
        movlw 'F'
        call  wrlcd
        movlw 'U'
        call  wrlcd
        movlw 'N'
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  pulso,w
        addlw 0x30
        call  wrlcd
        movlw ' '
        call  wrlcd

        movlw 0xC0
        call  cmlcd

        movlw ' '
        call  wrlcd
        movlw 'T'
        call  wrlcd
        movlw 'M'
        call  wrlcd
        movlw 'P'
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  setpointd3,w
        addlw 0x30
        call  wrlcd
        movf  setpointu3,w
        addlw 0x30
        call  wrlcd
        movlw '.'
        call  wrlcd
        movf  setpointu3_1,w     ;registrador auxiliar do setpointu3_1
        btfss status,z
        goto  $+4
        movlw '0'
        call  wrlcd
        goto  programar_start
        movlw '5'
        call  wrlcd
        movlw ' '
        call  wrlcd
        movlw ' '
        call  wrlcd
        movlw 'E'
        call  wrlcd
        movlw 'J'
        call  wrlcd
        movlw '='
        call  wrlcd
        movf numero_ejecoes_digito2,w
        addlw 0x30
        call  wrlcd
        movf numero_ejecoes_digito1,w
        addlw 0x30
        call  wrlcd
        goto  programar_start        
        
programar
        btfss botao1
        goto  $-1
        btfss botao2
        goto  $-1
        call  filtro
     
programar_0
        btfss pr
        goto  voltar
        btfss botao1
        goto  programardur
        btfss botao3
        goto  programaru
        goto  programar_0

programaru
        call  load_timer0
        movf  setpointu ,w
        movwf progdig
        movlw 0x8A
        movwf geral
        movlw 9
        movwf geral1
        movlw 1
        movwf geral2
        call  filtro

programaru_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programard
        call  programar2
        goto  programaru_1

programard
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  setpointd ,w
        movwf progdig
        movlw 0x89
        movwf geral
        movlw 2
        movwf geral2
        call  filtro
        
programard_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programarc
        call  programar2
        goto  programard_1

programarc
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  setpointc ,w
        movwf progdig
        movlw 0x88
        movwf geral
        movlw 3
        movwf geral2
        call  filtro
       
programarc_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programardur1
        call  programar2
        goto  programarc_1

programardur1
        call  esc_e2prom
        call  esc_dado
        btfss botao3
        goto  $-1
       
programardur
        call  load_timer0
        movlw 0x80
        call  cmlcd
        movlw ' '
        call  wrlcd
        movlw 0xC0
        call  cmlcd
        movlw '>'
        call  wrlcd
        call  filtro

programar1
        btfss pr
        goto  voltar
        btfss botao1
        goto  voltar
        btfss botao3
        goto  programaru1
        goto  programar1
        
programaru1
        movf  setpointu1,w
        movwf progdig
        movlw 0xCA
        movwf geral
        movlw 9
        movwf geral1
        movlw 4
        movwf geral2
        call  filtro

programaru1_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programard1
        call  programar2
        goto  programaru1_1


programard1
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  setpointd1,w
        movwf progdig
        movlw 0xC9
        movwf geral
        movlw 5
        movwf geral2
        call  filtro
        
programard1_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programarc1
        call  programar2
        goto  programard1_1

programarc1
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  setpointc1,w
        movwf progdig
        movlw 0xC8
        movwf geral
        movlw 6
        movwf geral2
        call  filtro

programarc1_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programarc1_11
        call  programar2
        goto  programarc1_1

programarc1_11
        call  esc_e2prom
        call  esc_dado
        goto  voltar

programar_start
        btfss botao2
        goto  $-1
        btfss botao1
        goto  $-1
        call  filtro

programar_start2
        btfss pr
        goto  voltar
        btfss botao1
        goto  programar_saida00
        btfss botao3
        goto  programar_start3
        goto  programar_start2
       
programar_start3
        movf  start,w
        movwf progdig
        movlw 0x85
        movwf geral
        movlw 1
        movwf geral1
        movlw 21
        movwf geral2
        call  filtro

programar_start4
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  esc_eprom_start
        call  programar2
        goto  programar_start4

esc_eprom_start
        call  esc_e2prom
        call  esc_dado
        btfss botao3
        goto  $-1

programar_saida00       
        call  load_timer0
        movlw 0x80
        call  cmlcd
        movlw ' '
        call  wrlcd
        movlw 0x87
        call  cmlcd
        movlw '>'
        call  wrlcd
        call  filtro

programar_saida0
        btfss pr
        goto  voltar
        btfss botao1
        goto  programar_tempo
        btfss botao3
        goto  programar_saida1
        goto  programar_saida0

programar_saida1                       ;define se a saida pulsante começa em 1 ou 0
        call  load_timer0
        movf  pulso ,w
        movwf progdig
        movlw 0x8C
        movwf geral
        movlw 1
        movwf geral1
        movlw 19
        movwf geral2
        call  filtro

programar_saida2
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  esc_eprom_saida
        call  programar2
        goto  programar_saida2

esc_eprom_saida
        call  esc_e2prom
        call  esc_dado
        movlw 19
        call  le_e2prom
        movwf soma
        movf  soma,w
        btfsc status,z
        goto  programar_saida

programar_tempo
        call  load_timer0
        movlw 0x87
        call  cmlcd
        movlw ' '
        call  wrlcd
        movlw 0xC0
        call  cmlcd
        movlw '>'
        call  wrlcd
        call  filtro

programar_tempo1             
        btfss pr
        goto  voltar
        btfss botao1
        goto  programar_numero_ejecoes       
        btfss botao3
        goto  programar_tempo2
        goto  programar_tempo1

programar_tempo2                   ;ajusta o tempo em que a saida vai ficar pulsando quando                           ;estiver no tempo on
        bsf   incms
        call  load_timer0
        movf  setpointu3_1,w        
        movwf progdig
        movlw 0xC8
        movwf geral
        movlw 1
        movwf geral1
        movlw 24
        movwf geral2
        call  filtro
        
programar_tempo3
        btfss pr
        goto  voltar
        btfss botao1
        goto  incrementar_tempo
        btfss botao3
        goto  esc_eprom_tempo      ; escreve na eprom o tempo em que a saida vai ficar ligando e
        call  programar2           ; desligando
        goto  programar_tempo3
        
incrementar_tempo
        call  incrementar
        movf  geral,w
        call  cmlcd
        call  digito1_tempo
        goto  programar_tempo3

esc_eprom_tempo
        call  esc_e2prom
        call  esc_dado
        btfss botao3
        goto  $-1
        bcf   incms

programar_tempo2_1                   ;ajusta o tempo em que a saida vai ficar pulsando quando
                                     ;estiver no tempo on
        call  load_timer0
        movf  setpointu3,w        
        movwf progdig
        movlw 0xC6
        movwf geral
        movlw 9
        movwf geral1
        movlw 20
        movwf geral2
        call  filtro
        
programar_tempo3_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  esc_eprom_tempo_1      ; escreve na eprom o tempo em que a saida vai ficar ligando e
        call  programar2           ; desligando
        goto  programar_tempo3_1
        
esc_eprom_tempo_1
        call  esc_e2prom
        call  esc_dado
        btfss botao3
        goto  $-1

programar_tempo2_11                 ;ajusta o tempo em que a saida vai ficar pulsando quando
                                   ;estiver no tempo on (digito da dezena)
        call  load_timer0
        movf  setpointd3,w        
        movwf progdig
        movlw 0xC5
        movwf geral
        movlw 23
        movwf geral2
        call  filtro
        
programar_tempo3_11
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  esc_eprom_tempo_11      ; escreve na eprom o tempo em que a saida vai ficar ligando e
        call  programar2           ; desligando
        goto  programar_tempo3_11
        
esc_eprom_tempo_11
        call  esc_e2prom
        call  esc_dado
        btfss botao3
        goto  $-1

programar_numero_ejecoes
        call  load_timer0
        movlw 0xC0
        call  cmlcd
        movlw ' '
        call  wrlcd
        movlw 0xCA
        call  cmlcd
        movlw '>'
        call  wrlcd
        call  filtro

programando_numero_ejecoes             
        btfss pr
        goto  voltar
        btfss botao1
        goto  programar_saida      
        btfss botao3
        goto  programar_numero_ejecoes_digito1
        goto  programando_numero_ejecoes

programar_numero_ejecoes_digito1                    
        call  load_timer0
        movf  numero_ejecoes_digito1 ,w
        movwf progdig
        movlw 0xCF
        movwf geral
        movlw 9
        movwf geral1
        movlw 25
        movwf geral2
        call  filtro

alterar_valor_numero_ejecoes_digito1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programar_numero_ejecoes_digito2
        call  programar2
        goto  alterar_valor_numero_ejecoes_digito1

programar_numero_ejecoes_digito2
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  numero_ejecoes_digito2 ,w
        movwf progdig
        movlw 0xCE
        movwf geral
        movlw 26
        movwf geral2
        call  filtro
        
programando_numero_ejecoes_digito2
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  $+3
        call  programar2
        goto  programando_numero_ejecoes_digito2

        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        call  filtro
        
programar_saida
        call  load_timer0
        movlw 0x01
        call  cmlcd
        
        movlw 0x80
        call  cmlcd
     
        movlw '>'
        call  wrlcd
        movlw 'F'
        call  wrlcd
        movlw 'T'
        call  wrlcd
        movlw '='
        call  wrlcd
        movf  ganho3,w
        addlw 0x30
        call  wrlcd
        movf  ganho2,w
        addlw 0x30
        call  wrlcd
        movf  ganho1,w
        addlw 0x30
        call  wrlcd
        movf  ganho,w
        addlw 0x30
        call  wrlcd
 
        movlw  0xC0
        call  cmlcd
        movlw ' '
        call  wrlcd
        movlw 'C'
        call  wrlcd
        movlw 'L'
        call  wrlcd
        movlw '.'
        call  wrlcd
        movlw 'T'
        call  wrlcd
       

gap    
        btfss botao2
        goto  $-1
        btfss botao3
        goto  $-1
        call  filtro

programar_2                    ; programar ganho
        btfss pr
        goto  voltar
        btfss botao1
        goto  z_tot            ; zerar totalizador
        btfss botao3
        goto  programarg
        goto  programar_2

programarg
        call  load_timer0
        movf  ganho ,w
        movwf progdig
        movlw 0x87
        movwf geral
        movlw 9
        movwf geral1
        movlw 0
        movwf geral2
        call  filtro
        
programarg_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programarg1
        call  programar2
        goto  programarg_1

programarg1
        bsf   al_par
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  ganho1,w
        movwf progdig
        movlw 0x86
        movwf geral
        movlw 7
        movwf geral2
        call  filtro

programarg1_2
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programarg2              ;ganho
        call  programar2
        goto  programarg1_2

programarg2
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  ganho2,w
        movwf progdig
        movlw 0x85
        movwf geral
        movlw 8
        movwf geral2
        call  filtro

programarg2_2
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  programarg3          
        call  programar2
        goto  programarg2_2

programarg3
        call  esc_e2prom
        call  esc_dado
        call  load_timer0
        movf  ganho3,w
        movwf progdig
        movlw 0x84
        movwf geral
        movlw 22
        movwf geral2
        call  filtro

programarg3_1
        btfss pr
        goto  voltar
        btfss botao1
        call  incrementar
        btfss botao3
        goto  esc_eprom_ganho3          
        call  programar2
        goto  programarg3_1

esc_eprom_ganho3
        call  esc_e2prom
        call  esc_dado
        call  le_inicio1
        call  filtro
        btfss botao3
        goto  $-1
        
z_tot
        btfss hab_most_totalizador
        goto  voltar
        call  load_timer0
        movlw 0x80
        call  cmlcd
        movlw ' '
        call  wrlcd
        movlw 0xC0
        call  cmlcd
        movlw '>'
        call  wrlcd
        call  filtro

ret       
        btfss  pr
        goto   voltar
        btfss  botao1
        goto   voltar
        btfss  botao3
        goto   zerartot
        goto   ret


zerartot
        call load_timer0
        call  mostrar_totalizador
        btfss botao3
        goto  $-1
        call  filtro

zerartot1
        btfss pr
        goto  voltar
        btfss botao1
        goto  voltar
        btfss botao3
        goto  limpar_totalizador
        goto  zerartot1

limpar_totalizador       
        clrf  unidade2
        clrf  dezena2
        clrf  centena2
        clrf  milhar2
        clrf  milhar2_1
        clrf  milhar2_2
        clrf  milhar2_3
        clrf  milhar2_4

        movlw 2
        movwf temp2
        call  mostrar_totalizador

espera
        btfss   pr
        goto   $+2
        goto   espera
              
voltar
        bcf  intcon,gie
        btfss botao3
        goto  $-1
        btfsc al_par
        goto  setpoint_alterado
        goto  inicializar2

setpoint_alterado
        call le_inicio3
        btfss t1con,tmr1on
        goto  inicializar2
        btfss out1,0
        goto  $+11
        btfss ej_manual
        goto  $+3
        bsf   tot.          ; set bit tot.(para permiter totalizar)
        call  totalizador
        bcf   ej_manual
        bsf   saida_ligada
        bsf   led
        bsf   ligado,0
        bsf   saida_pulsante1,0
        goto  inicializar2

        bsf   ej_manual
        bcf   out1,0
        bcf   saida_ligada
        bcf   led
        bsf   ligado,0
        goto  inicializar2

voltar2       
     
        goto  inicializar2
        

        end
 

 


         

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...