Ir ao conteúdo

Posts recomendados

Postado

Bom dia, estou tentando fazer uma chave seletora digital de 9 posições utilizando relés para chavear a posição que for selecionada, poderiam me dar dicas para fazer essa programação no mplab.

A chave vai funcionar assim: com 3 botões touch, um para incrementar, outro para decrementar e um como enter, selecionando a posição desejada, dou o comando de enter e o relé referente á essa posição vai acionar algum componente ou operação em uma máquina. 

<>

#include<P18F4550.h>
#include<delays.h>

// Configurações
#pragma config   PLLDIV = 5           // PLL para 20MHz
#pragma config   CPUDIV = OSC1_PLL2   // PLL desligado
#pragma config   FOSC = HS            // Fosc = 20MHz      Tcy = 200ns
#pragma config   WDT = OFF            // Watchdog desativado
#pragma config   PBADEN = OFF         // Pinos do PORTB começam como
//digitais
#pragma config   LVP = OFF            // Desabilita gravação em baixa
//tensão
#pragma config   DEBUG = ON           // Habilita debug

// Definições de hardware
#define INC      PORTBbits.RB0        // Botão incrementa
#define DEC      PORTBbits.RB1        // Botão decrementa
#define TRV      PORTBbits.RB2        // Chave libera trava "um pulso
                                      // por toque"

#define DISP2    PORTEbits.RE0        // DISP2
#define DISP1    PORTEbits.RE2        // DISP1

#define DISPLAY PORTD      // Segmentos do display ligados em PORTD

void main(void){
int i = 0, valor;
unsigned char dezena, unidade, aux0=0, aux1=0, aux=0;
unsigned char tempo = 70;

   // tabela de dígitos do display - matriz de segmentos  
   char table[]    = {0b11110011,    // P
};

   char table2[]   = {0b00000110,    // 1
                      0b01011011,    // 2
                      0b01001111,    // 3
                      0b01100110,    // 4
                      0b01101101,    // 5
                      0b01111101,    // 6
                      0b00000111,    // 7
                      0b01111111,    // 8
                      0b01101111,    // 9
                      
};

// *** Inicialização

ADCON1 = 0x0F;           // Procurar no datasheet

DDRD = 0x00;             // Configura port D como saída
DDREbits.RE0 = 0;        // Configura RE0 como saída (DISP2)
DDREbits.RE2 = 0;        // Configura RE2 como saída (DISP1)

DDRBbits.RB0 = 1;        // Configura RB0 como entrada (INC)
DDRBbits.RB1 = 1;        // Configura RB0 como entrada (DEC)
DDRBbits.RB2 = 1;        // Configura RB0 como entrada (TRV)

DISP1 = 0;               // DISP1 desligado
DISP2 = 1;               // DISP2 desligado

INTCON2bits.RBPU = 0;    // Ativa pull-ups do portB

for(;;){
  if(!INC && !aux0){          // Incrementa i
      if(i <  i++;
      if(TRV) aux0=1;          // Para incremento de "um em um"
   }
   if(INC) aux0=0;
   if(!DEC && !aux1){          // Decrementa i
      if(i > 0) i--;
      if(TRV) aux1=1;          // Para decremento de "um em um"
   }
   if(DEC) aux1=0;

   valor = i;            // Transferindo i para a variável valor

   // Separando o valor em dígitos
   dezena = valor / 10;       // Separa inteiro da dezena
   unidade = valor % 10;      // Recupera resto da dezena
                              // que é a unidade

   DISPLAY = table[dezena];   // Transfere para o display (PORT D)
   DISP1 = 0;                 // DISP1 desligado
   DISP2 = 1;                 // DISP2 ligado
   Delay1KTCYx(tempo);        // Tempo que o display fica aceso
   DISP2 = 0;                 // DISP2 desligado

   DISPLAY = table2[unidade];  // Transfere para o display (PORT D)
   DISP1 = 1;                 // DISP1 ligado
   DISP2 = 0;                 // DISP2 desligado
   Delay1KTCYx(tempo);        // Tempo que o display fica aceso
   DISP1 = 0;                 // DISP1 desligado
  }
}

 

  • Membro VIP
Postado

A opção de usar um port pra cada display é uma opção à acioná-los dentro do loop. Outra - a mais correta - é aciona-los numa interrupção. Assim você pode colocar mais displays e dá liberdade ao loop.

Depois deste "desabafo", vejamos...

Vou orientar pra 8 relés. Digamos que usa o portb pra eles. Basta fazer

#define reles PORTB

reles=1<<unidade;

Pro 9º em diante vou deixar você ter o prazer de descobrir por si. Caso não consiga, prove que tentou e .. já sabe...

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!