Ir ao conteúdo
  • Cadastre-se
Genivaldodacosta

Problema com codigo de decremento no ccs

Recommended Posts

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

Editado por dif
Inserir o código com o botão code

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Editado por ViniciusKruz

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×