Ir ao conteúdo
  • Cadastre-se

Ordenador de Números [Mikro C] + Proteus


Posts recomendados

Olá pessoal! Boa noite. 

Tudo bem com vocês?

 

Então pessoal, eu estava realizando um projeto no Mikro C com um amigo meu, e fizemos um ordenador de números, que na verdade ordena apenas uma sequência complexa que estabelecemos (6,5,1,7,4,3,2,0) de forma crescente (0,1,2,3,4,5,6,7). A lógica que trabalhamos foi de utilizar 2 "ponteiros" (P0 e P1), que "iriam andar de dois em dois" na sequência complexa inicial que estabelecemos e, cada vez que eles "andassem" uma unidade "iria ser perguntado": O valor que P0 está apontando é maior que o valor que P1 está apontando? Se sim, troca-se o valor no qual P0 está apontando para o valor que P1 estava apontando e vice-versa. Caso contrário, P0 e P1 andariam, ambos, uma unidade, para o próximo número. Realizando este processo 7 vezes, teríamos a sequência de forma crescente (testamos várias vezes na prática, utilizando um papel e tudo ocorreu perfeitamente, a sequência foi ordenada).

 

Sabemos que esta forma não é a mais eficaz para ordenar esta sequência, mas não podemos alterar de lógica neste momento.

 

Estamos praticamente com o programa finalizado, mas ao colocar no Proteus (utilizando um LCD para visualizar) não conseguimos de forma alguma ordenar a sequência. 

 

Alguém teria uma solução para este problema? Já verifiquei este código muitas e muitas vezes, mas não sei qual é problema.

 

Se alguem puder me ajudar, ficaria imensamente agradecido.  :)

//Ordenador -> Cava e Raul //variaveis globais//Lcd pinou settingssbit LCD_D7 at RD7_bit;sbit LCD_D6 at RD6_bit;sbit LCD_D5 at RD5_bit;sbit LCD_D4 at RD4_bit;sbit LCD_EN at RD3_bit;sbit LCD_RS at RD2_bit;// Pin directionsbit LCD_D7_Direction at TRiSD7_bit;sbit LCD_D6_Direction at TRiSD6_bit;sbit LCD_D5_Direction at TRiSD5_bit;sbit LCD_D4_Direction at TRiSD4_bit;sbit LCD_EN_Direction at TRiSD3_bit;sbit LCD_RS_Direction at TRiSD2_bit;unsigned char K; //ciclounsigned char G; //ciclo 2unsigned char p0 = 0, p1 = 1 ; //ponteirounsigned char V[8] = {6,5,1,7,4,3,2,0};unsigned char aux;//------------------------------------------------------------------------------void troca_posicao(void){    aux = V[p0];    V[p0] = V[p1];    V[p1] = aux;}//------------------------------------------------------------------------------void inicializa_LCD(void){    PORTD= 0x00;    TRISD= 0x00;    // "&PORTD" nao È mais passado como par‚metro    Lcd_Init(); // inicializa o LCD    Lcd_Cmd(_LCD_CLEAR);    Lcd_Cmd(_LCD_CURSOR_OFF);}//------------------------------------------------------------------------------void mostra_posicao(void){    for(G=0 ; G<8 ; G++) Lcd_Chr(1, 2*G+1, V[G]+48);    Lcd_Chr(2, 2*p0+1,'^');    Lcd_Chr(2, 2*(p0+1)+1,'^');    Delay_ms(1000);}//------------------------------------------------------------------------------void main(void){    inicializa_LCD();    mostra_posicao();    for (K = 0; K < 7; K++)  // for de ciclos    {        for (p0 = 0; p0 < 7; p0++)    // for para incrementar posiÁ„o            if (V[p0] > V[p0+1]) troca_posicao();        mostra_posicao();    }    while(1);}
Link para o comentário
Compartilhar em outros sites


Em:



void troca_posicao(void)
{
    aux = V[p0];
    V[p0] = V[p1];
    V[p1] = aux;
 
}


 

Você usa o P1, mas em:



    for (K = 0; K < 7; K++)  
    {
        for (p0 = 0; p0 < 7; p0++)  
            if (V[p0] > V[p0+1]) troca_posicao();
        mostra_posicao();
    }


 

Você não incrementa ele, tente algo do tipo:



    for (K = 0; K < 7; K++) {
        for (p0 = 0; p0 < 7; p0++) {
            if (V[p0] > V[p0+1])
                troca_posicao();
                p1++;                   // <<-- Incrementa o P1
        }
        p1 = 1;                         // <<-- Inicializa o P1 com 1 novamente
        mostra_posicao();
    }


 

DICA: Carregue o PROTEUS com o arquivo .cof e em vez do .hex, aperte o pause para debugar... Daí vá fazendo o passo a passo (Step Over, Step Into) e olhando o que acontece com as variáveis K, G, P0, P1 e V[8]. 

 

õ/

  • Curtir 1
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!