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