Ir ao conteúdo
  • Cadastre-se

Problema com codigo de decremento no ccs


Posts recomendados

Boa tarde pessoal, sou iniciante em programação e peço a ajuda de vocês, estou montando um placar eletrônico com um pic 16f628a e display de 7 segmentos, a multiplexação eu entendi e funcionou corretamente, porém nesse placar deve conter teclas para incrementar e decrementar, a parte de incrementar também fiz e funcionou corretamente, porém quando quero decrementar tipo de 10 para 9, da erro, não funciona corretamente, o codigo é esse

 

#include <16f628a.h>
#fuses MCLR,XT
#use delay (clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06
int i,k,j=0;
int display[10] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67,};


void main(){
set_tris_b(0b0000000); // configura port b completo como saida.
PORTB = 0b00000000;
for(;;){
 if(!input(pin_a2)){
     for(j=0;j<11;J){
                if(!input(pin_a2))j++;
                             if(j>9){j=0;K++;}
                             if(!input(pin_A3))J--;
                            // if(j<1){j=9;k--;}
     for(i=0;i<40;i++){
     output_high(PIN_A1);
     output_low(PIN_A0);
     PORTB = display[j]; 
     delay_ms(3);
 
     output_high(PIN_A0);
     output_low(PIN_A1);
     
     PORTB = display[k]; 
     delay_ms(3);
                   }
       
     }   
     
     }
}    
}


 

se alguém puder dar alguma dica e tal, muito obglayout.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

defina melhor isso

3 horas atrás, Genivaldodacosta disse:

da erro, não funciona corretamente

 

Um bom momento pra você se inteirar na função de interrupt por timer. Com ela, você pode "plotar" o display com mais "elegância". Além de deixar o mc mais tranquilo e alguns etc

Link para o comentário
Compartilhar em outros sites

8 horas atrás, ViniciusKruz disse:

Tenta mudar isto:


 if(j>9){j=0;K++;}
    if(!input(pin_A3))J--;
    // if(j<1){j=9;k--;}

Para Isto:

 


if(j>9){j=0;K=j;}
if(!input(pin_A3))J--;
if(j<1){j=9;k=j;}

 

obg Vinicius, porém já tinha tentado, teoricamente deveria dar certo (pois se j<1, então j==0; se decrementa deveria ir para 9, mas quando esta no (1) e aperta decremento, ele vai para 9, sem passar pelo (0), deixando de formar o 10,20,30 e ai vai, mas obg pela dica!

Link para o comentário
Compartilhar em outros sites

5 horas atrás, ViniciusKruz disse:

Faz assim, muda sua variável j para signed int e então altera para j<0.

 

O tipo de dados "int" significa que a variável vai de 0 a 254, se você alterar ela para "signed int" ela vai de -128 a 127. 

 

Para usar j<0 precisa estar como signed int.

muito obg Vinicius, fiz as mudanças que pediu e funcionou, contudo tive que acrescentar mais algumas linhas para evitar alguns erro, o código ficou assim:

#include <16f628a.h>
#fuses MCLR,XT
#use delay (clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06

signed int i, k, j=0;
int display[10] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67 };
 


void main(){
set_tris_b(0b0000000); // configura port b completo como saida.
PORTB = 0b00000000;
for(;;){

 if(!input(pin_a2)){

     for(j=0;j<11;J){
         if(!input(pin_a2))j++;
            if(j>9){j=0;K++;}
                            
  if(j>9){j=0;}//K=j;}
     if(!input(pin_A3))J--;
        if(j<0){j=9;k--;}
  if(j==0){
     if(input(pin_a3));break;}
         
     for(i=0;i<40;i++){
     output_high(PIN_A1);
     output_low(PIN_A0);
     PORTB = display[j]; 
     delay_ms(3);
   

     output_high(PIN_A0);
     output_low(PIN_A1);
     
     PORTB = display[k]; 
     delay_ms(3);

     }
       
     }   
     
     }
}    
}
 

5 horas atrás, ViniciusKruz disse:

Faz assim, muda sua variável j para signed int e então altera para j<0.

 

O tipo de dados "int" significa que a variável vai de 0 a 254, se você alterar ela para "signed int" ela vai de -128 a 127. 

 

Para usar j<0 precisa estar como signed int.

muito obg Vinicius, fiz as mudanças que pediu e funcionou, contudo tive que acrescentar mais algumas linhas para evitar alguns erro, o código ficou assim:

#include <16f628a.h>
#fuses MCLR,XT
#use delay (clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06

signed int i, k, j=0;
int display[10] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67 };
 


void main(){
set_tris_b(0b0000000); // configura port b completo como saida.
PORTB = 0b00000000;
for(;;){

 if(!input(pin_a2)){

     for(j=0;j<11;J){
         if(!input(pin_a2))j++;
            if(j>9){j=0;K++;}
                            
  if(j>9){j=0;}//K=j;}
     if(!input(pin_A3))J--;
        if(j<0){j=9;k--;}
  if(j==0){
     if(input(pin_a3));break;}
         
     for(i=0;i<40;i++){
     output_high(PIN_A1);
     output_low(PIN_A0);
     PORTB = display[j]; 
     delay_ms(3);
   

     output_high(PIN_A0);
     output_low(PIN_A1);
     
     PORTB = display[k]; 
     delay_ms(3);

     }
       
     }   
     
     }
}    
}
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Genivaldodacosta

Obrigado pelo feedback.

Mesmo que tenha funcionado (o que já é bom rs) faça como a Isadora sugeriu, coloca o sistema pra fazer a varredura por interrupção, depois com calma estuda o assunto ok! Da forma como está, a varredura fica comprometida caso alguma função fique esperando resposta ou por algum motivo ficar demorando.

 

Abraço e sucesso com o projeto.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!