Decimal Digit | BCD 8 4 2 1 |
---|---|
0 | 0 0 0 0 |
1 | 0 0 0 1 |
2 | 0 0 1 0 |
3 | 0 0 1 1 |
4 | 0 1 0 0 |
5 | 0 1 0 1 |
6 | 0 1 1 0 |
7 | 0 1 1 1 |
8 | 1 0 0 0 |
9 | 1 0 0 1 |
Então resolvi criar um programa para fazer a leitura dessas chaves, dessa vez estou usando o PIC 18F4550, hora de variar um pouco :-)
/******************************************************************************
*
* VRO PROJETOS PLACA E-P18 (PIC18F4550)
*
******************************************************************************
* Dependencias: Veja a seção INCLUDES abaixo
* Microcontrolador: PIC18F4550
* Opção de Clock: HS 20MHz (externo) - CPU:48MHz (interno)
* Compilador: C18 v3.37 ou superior
* Empresa: VRO Projetos
* Plataforma: Placa E-P18 v3.6
* Autor: Vinicius Rodrigues de Oliveira(viniciusro@gmail.com)
* Versão: v1.0
*****************************************************************************/
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include <delays.h>
#include "displayLCD.h"
/** D E F I N E S ************************************************************/
//Entradas Digitais
#define B0 PORTBbits.RB0
#define B1 PORTBbits.RB1
#define B2 PORTBbits.RB2
#define B3 PORTBbits.RB3
#define MULT1 PORTCbits.RC2
#define MULT2 PORTDbits.RD0
#define MULT3 PORTDbits.RD1
#define BOTAO_1 PORTEbits.RE1
#define BOTAO_2 PORTEbits.RE2
/** V A R I A V E I S G L O B A I S ****************************************/
char chave = 0;
char chave1 = 0;
char chave2 = 0;
char CHE = 0;
char senha = 0;
char senha1 = 0;
/** P R O T O T I P O S P R I V A D O S ***********************************/
void ConfiguraSistema(void);
/** F U N C O E S ************************************************************/
/******************************************************************************
* Funcao: void main(void)
* Entrada: Nenhuma (void)
* Saída: Nenhuma (void)
* Descrição: Função principal do programa.
*****************************************************************************/
/* Tabela BCD: B0|B1|B2|B3
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
*/
void main(void)
{
// Configura as portas e periféricos do PIC.
ConfiguraSistema();
B0=0;
B1=0;
B2=0;
B3=0;
MULT1=0;
MULT2=0;
MULT3=0;
while(1) // Laço infinito que executa o funcionamento principal do projeto.
{
CHE++;
PosicaoCursorLCD(1,1);
EscreveFraseRomLCD("Multiplexando...");
PosicaoCursorLCD(2,1);
EscreveFraseRomLCD("CH1:");
PosicaoCursorLCD(2,5);
EscreveInteiroLCD(chave);
PosicaoCursorLCD(2,7);
EscreveFraseRomLCD("CH2:");
PosicaoCursorLCD(2,11);
EscreveInteiroLCD(chave1);
PosicaoCursorLCD(2,12);
EscreveFraseRomLCD("CH3:");
PosicaoCursorLCD(2,16);
EscreveInteiroLCD(chave2);
Delay10KTCYx(40);
if (CHE>3)
{
CHE=0;
}
if (CHE==0)
{
MULT1=1;
//Para Digito:0
if(B0==0 && B1==0 && B2==0 && B3==0)
{
chave=0;
Delay10KTCYx(10);
}
//Para Digito:1
if(B0==0 && B1==0 && B2==0 && B3==1)
{
chave=1;
Delay10KTCYx(10);
}
//Para Digito:2
if(B0==0 && B1==0 && B2==1 && B3==0)
{
chave=2;
Delay10KTCYx(10);
}
//Para Digito:3
if(B0==0 && B1==0 && B2==1 && B3==1)
{
chave=3;
Delay10KTCYx(10);
}
//Para Digito:4
if(B0==0 && B1==1 && B2==0 && B3==0)
{
chave=4;
Delay10KTCYx(10);
}
//Para Digito:5
if(B0==0 && B1==1 && B2==0 && B3==1)
{
chave=5;
Delay10KTCYx(10);
}
//Para Digito:6
if(B0==0 && B1==1 && B2==1 && B3==0)
{
chave=6;
Delay10KTCYx(10);
}
//Para Digito:7
if(B0==0 && B1==1 && B2==1 && B3==1)
{
chave=7;
Delay10KTCYx(10);
}
//Para Digito:8
if(B0==1 && B1==0 && B2==0 && B3==0)
{
chave=8;
Delay10KTCYx(10);
}
//Para Digito:9
if(B0==1 && B1==0 && B2==0 && B3==1)
{
chave=9;
Delay10KTCYx(10);
}
MULT1=0;
}
if (CHE==1)
{
MULT2=1;
//Para Digito:0
if(B0==0 && B1==0 && B2==0 && B3==0)
{
chave1=0;
Delay10KTCYx(10);
}
//Para Digito:1
if(B0==0 && B1==0 && B2==0 && B3==1)
{
chave1=1;
Delay10KTCYx(10);
}
//Para Digito:2
if(B0==0 && B1==0 && B2==1 && B3==0)
{
chave1=2;
Delay10KTCYx(10);
}
//Para Digito:3
if(B0==0 && B1==0 && B2==1 && B3==1)
{
chave1=3;
Delay10KTCYx(10);
}
//Para Digito:4
if(B0==0 && B1==1 && B2==0 && B3==0)
{
chave1=4;
Delay10KTCYx(10);
}
//Para Digito:5
if(B0==0 && B1==1 && B2==0 && B3==1)
{
chave1=5;
Delay10KTCYx(10);
}
//Para Digito:6
if(B0==0 && B1==1 && B2==1 && B3==0)
{
chave1=6;
Delay10KTCYx(10);
}
//Para Digito:7
if(B0==0 && B1==1 && B2==1 && B3==1)
{
chave1=7;
Delay10KTCYx(10);
}
//Para Digito:8
if(B0==1 && B1==0 && B2==0 && B3==0)
{
chave1=8;
Delay10KTCYx(10);
}
//Para Digito:9
if(B0==1 && B1==0 && B2==0 && B3==1)
{
chave1=9;
Delay10KTCYx(10);
}
MULT2=0;
}
if (CHE==2)
{
MULT3=1;
//Para Digito:0
if(B0==0 && B1==0 && B2==0 && B3==0)
{
chave2=0;
Delay10KTCYx(10);
}
//Para Digito:1
if(B0==0 && B1==0 && B2==0 && B3==1)
{
chave2=1;
Delay10KTCYx(10);
}
//Para Digito:2
if(B0==0 && B1==0 && B2==1 && B3==0)
{
chave2=2;
Delay10KTCYx(10);
}
//Para Digito:3
if(B0==0 && B1==0 && B2==1 && B3==1)
{
chave2=3;
Delay10KTCYx(10);
}
//Para Digito:4
if(B0==0 && B1==1 && B2==0 && B3==0)
{
chave2=4;
Delay10KTCYx(10);
}
//Para Digito:5
if(B0==0 && B1==1 && B2==0 && B3==1)
{
chave2=5;
Delay10KTCYx(10);
}
//Para Digito:6
if(B0==0 && B1==1 && B2==1 && B3==0)
{
chave2=6;
Delay10KTCYx(10);
}
//Para Digito:7
if(B0==0 && B1==1 && B2==1 && B3==1)
{
chave2=7;
Delay10KTCYx(10);
}
//Para Digito:8
if(B0==1 && B1==0 && B2==0 && B3==0)
{
chave2=8;
Delay10KTCYx(10);
}
//Para Digito:9
if(B0==1 && B1==0 && B2==0 && B3==1)
{
chave2=9;
Delay10KTCYx(10);
}
MULT3=0;
}
}//end while(1)
}//end main
/******************************************************************************
* Funcao: void ConfiguraSistema(void)
* Entrada: Nenhuma (void)
* Saída: Nenhuma (void)
* Descrição: ConfiguraSistema é a rotina de configuração principal do PIC.
* Seu objetivo é configurar as portas de I/O e os periféricos
* do microcontrolador para que os mesmos trabalhem da maneira
* desejada no projeto.
*****************************************************************************/
void ConfiguraSistema(void)
{
// Desabilita todas as analógicas
ADCON1 = ADCON1 | 0x0F;
// Configura o Diaplay LCD
ConfiguraLCD();
DesligaCursor();
// Configura saidas digitais
TRISCbits.TRISC2 = 0;
TRISDbits.TRISD0 = 0;
TRISDbits.TRISD1 = 0;
// Configura entradas digitais
TRISBbits.TRISB0 = 1; //Configura pino RB0 (Bit 1) como entrada digital
TRISBbits.TRISB1 = 1; //Configura pino RB1 (Bit 2) como entrada digital
TRISBbits.TRISB2 = 1; //Configura pino RB2 (Bit 3) como entrada digital
TRISBbits.TRISB3 = 1; //Configura pino RB3 (Bit 4) como entrada digital
TRISEbits.TRISE1 = 1; //Configura pino RE1 (botao 1) como entrada digital
TRISEbits.TRISE2 = 1; //Configura pino RE2 (botao 2) como entrada digital
}//end ConfiguraSistema
/** V E C T O R R E M A P P I N G ******************************************/
// Rotina necessária para o compilador C18 saber onde é o início do vetor de
// "reset".
// Copiar na íntegra esta parte do código dentro do arquivo "main.c" de TODO
// projeto usado com o Bootloader no PIC.
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
_asm goto _startup _endasm
}
/** FIM DO ARQUIVO main.c ***************************************************************/
E ai?! Acho mais difícil que o Arduino? Parece ser, mas não é assim, o PIC te da mais liberdade nas configuradões, você tem que fazer em todos programas.
O funcionamento é o seguinte uma variável fica incrementando a cada laço do programa,isso determina qual chave vai ser lida, é feita a varredura de todas chaves e utilizado a multiplexação para ler 4 chaves usando as mesmas portas, ativando uma de cada vez e guardando seu valor.Por exemplo, se CHE=0 então esta selecionada a chave 1, assim é feita a leitura digital de suas 4 saídas(BCD), de acordo com essa leitura temos o valor que esta na chave mecânica depois disso guardamos o valor em uma variável e passamos para outra chave e assim por diante.
A multiplexação é feita de uma forma que alimenta uma chave por vez, tornando possível utilizar apenas 4 portas para ler todas chaves simultaneamente, quando a chave 1 esta sendo lida as outras 3 chaves estão desligadas(isso vai ficar bem visível no video).
Nenhum comentário:
Postar um comentário