Ir ao conteúdo
  • Cadastre-se

PIC Teclado Matriz


Posts recomendados

Opa pessoal, recentemente estou trabalhando e um projetinho, para isso eu desenvolvi uma biblioteca para um teclado 4x4, o funcionamento do mesmo para um digito funciona que e uma beleza, entre tanto, eu nao consegui elaborar um código que eu aplique mais de um digito como por exemplo o valor 563. Se alguém puder ajudar ficaria grato xD.

Segue o código abaixo.

 


//))))))))))))))))))))))))))))))))))))))))))

//))))))))))))))))))))))))))))))))))))))))))
//LCD module connections                  //
sbit LCD_RS at RD2_bit;                   //
sbit LCD_EN at RD3_bit;                   //
sbit LCD_D4 at RD4_bit;                   //
sbit LCD_D5 at RD5_bit;                   //
sbit LCD_D6 at RD6_bit;                   //
sbit LCD_D7 at RD7_bit;                   //
                                          //
sbit LCD_RS_Direction at TRISD2_bit;      //
sbit LCD_EN_Direction at TRISD3_bit;      //
sbit LCD_D4_Direction at TRISD4_bit;      //
sbit LCD_D5_Direction at TRISD5_bit;      //
sbit LCD_D6_Direction at TRISD6_bit;      //
sbit LCD_D7_Direction at TRISD7_bit;      //
// End LCD module connections             //
//))))))))))))))))))))))))))))))))))))))))))


//))))))))))))))))))))))))))))))))))))))))))
//TECLADO IO`s CONFIG                     //
//Definição para colunas  do teclado      //
#define Y1 RB0_bit                        //
#define Y2 RB1_bit                        //
#define Y3 RB2_bit                        //
#define Y4 RB3_bit                        //
                                          //
//Definições para linha do teclado        //
#define X1 RB4_bit                        //
#define X2 RB5_bit                        //
#define X3 RB6_bit                        //
#define X4 RB7_bit                        //
//END CONFIG IO`s                         //
//))))))))))))))))))))))))))))))))))))))))))

//))))))))))))))))))))))))))))))))))))))))))
//Variaveis globais                       //
char txt1[] = "REAL TIMER CLOCK";//LCD    //
char txt2[7];//LCD                        //
unsigned char digito;//TECLADO            //
unsigned char cen;//TECLADO               //
unsigned char dez;//TECLADO               //
unsigned char soma;                       //
//END                                     //
//))))))))))))))))))))))))))))))))))))))))))

//))))))))))))))))))))))))))))))))))))))))))
//PROTYPE                                 //
void teclado();                           //
//END                                     //
//))))))))))))))))))))))))))))))))))))))))))

//))))))))))))))))))))))))))))))))))))))))))
//VETOR INTERRUPT                         //
void digitos() iv 0x0008 ics ICS_AUTO     //
{                                         //
                                          //
                                          //
                                          //
}                                         //
//END                                     //
//))))))))))))))))))))))))))))))))))))))))))

                                          
//))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//PROGRAMA PRINCIPAL

void main()//START MAIN
{
 //PIC START
 
 //INTCON: INTERRUPT CONTROL REGISTER
 GIE_bit = 1;//DESABILITA TODAS INTRRUPCOES MASCARADAS
 GIEH_bit = 1;// HABILITA TODAS INTTERRUPCOES DE ALTA PRIORIDADE
 PEIE_bit = 1;//Enables all unmasked peripheral interrupts
 GIEL_bit = 0;//Disables all low-priority peripheral interrupts

 //TECLADO FUNC
 teclado();//TECLADO START
 
 //LCD FUNC
 Lcd_Init(); // LCD START
 Lcd_Cmd(_LCD_CLEAR);// Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF);// Cursor off
 Lcd_Out(1,1,txt1);//ESCREVE NO LCD PRIMEIRA LINHA
 
 //I2C FUNC
 I2C1_Init(100000);//Start I2C communication
 
 
 //CONFIGURATION DIGITAL OR ANALOGIC PORTS
 PCFG0_bit = 1;                     //ALL PORTS DIGITAL
 PCFG1_bit = 1;                     //ALL PORTS DIGITAL
 PCFG2_bit = 1;                     //ALL PORTS DIGITAL
 PCFG3_bit = 1;                     //ALL PORTS DIGITAL

 //CONFIG INPUT OR OUTPUT, OBS Nao habilitar todos PORTE como entrada ja que um do mesmo e o reset
 TRISE0_bit = 1;
 TRISE1_bit = 1;
 TRISE2_bit = 1;
 TRISD0_bit = 0;

while(1)//ROTINA PRINCIPAL
{
    teclado();


    
    IntToStr(digito,txt2);// CONVERTE VARIAVEL PARA STRING, PARA O LCD
    Lcd_Out(2,1,txt2);//ESCREVE NO LCD SEGUNDA LINHA
    
}// END ROTINA PRINCIPAL
 


}//END MAIN

//))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))


//))))))))))))))))))))))))))))))))))))))))))
//TRATAMENTO DE FUNCOES                   //
                                          //
//))))))))))))))))))))))))))))))))))))))))))
//TECLADO                                 //
void teclado()                             //
{                                         //
        //START                           //
        int valor[10];                    //
        TRISB = 0b11110000;               //
                                          //
        //DIGITO 15                       //
        Y1 = 1;                           //
        delay_us(1);                      //
        if(X1 == 1 && Y1 == 1)            //
        {                                 //
            digito = 15;                  //
        }                                 //
        Y1 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 14                       //
        Y2 = 1;                           //
        delay_us(1);                      //
        if(X1 == 1 && Y2 == 1)            //
        {                                 //
            digito = 14;                  //
        }                                 //
        Y2 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 13                       //
         Y3 = 1;                          //
        delay_us(1);                      //
        if(X1 == 1 && Y3 == 1)            //
        {                                 //
            digito = 13;                  //
        }                                 //
        Y3 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 12                       //
        Y4 = 1;                           //
        delay_us(1);                      //
        if(X1 == 1 && Y4 == 1)            //
        {                                 //
            digito = 12;                  //
        }                                 //
        Y4 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 11                       //
        Y1 = 1;                           //
        delay_us(1);                      //
        if(X2 == 1 && Y1 == 1)            //
        {                                 //
            digito = 11;                  //
        }                                 //
        Y1 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 10                       //
        Y2 = 1;                           //
        delay_us(1);                      //
        if(X2 == 1 && Y2 == 1)            //
        {                                 //
            digito = 10;                  //
        }                                 //
        Y2 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 9                        //
        Y3 = 1;                           //
        delay_us(1);                      //
        if(X2 == 1 && Y3 == 1)            //
        {                                 //
            digito = 9;                   //
            cen = 900;                    //
            dez = 90;                     //
        }                                 //
        Y3 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 8                        //
        Y4 = 1;                           //
        delay_us(1);                      //
        if(X2 == 1 && Y4 == 1)            //
        {                                 //
            digito = 8;                   //
            cen = 800;                    //
            dez = 80;                     //
        }                                 //
        Y4 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 7                        //
        Y1 = 1;                           //
        delay_us(1);                      //
        if(X3 == 1 && Y1 == 1)            //
        {                                 //
            digito = 7;                   //
            cen = 700;                    //
            dez = 70;                     //
        }                                 //
        Y1 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 6                        //
        Y2 = 1;                           //
        delay_us(1);                      //
        if(X3 == 1 && Y2 == 1)            //
        {                                 //
            digito = 6;                   //
            cen = 600;                    //
            dez = 60;                     //
                                          //
        }                                 //
        Y2 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 5                        //
        Y3 = 1;                           //
        delay_us(1);                      //
        if(X3 == 1 && Y3 == 1)            //
        {                                 //
            digito = 5;                   //
            cen = 500;                    //
            dez = 50;                     //
        }                                 //
        Y3 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 4                        //
        Y4 = 1;                           //
        delay_us(1);                      //
        if(X3 == 1 && Y4 == 1)            //
        {                                 //
            digito = 4;                   //
            cen = 400;                    //
            dez = 40;                     //
        }                                 //
        Y4 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 3                        //
        Y1 = 1;                           //
        delay_us(1);                      //
        if(X4 == 1 && Y1 == 1)            //
        {                                 //
            digito = 3;                   //
            cen = 300;                    //
            dez = 30;                     //
        }                                 //
        Y1 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 2                        //
        Y2 = 1;                           //
        delay_us(1);                      //
        if(X4 == 1 && Y2 == 1)            //
        {                                 //
            digito = 2;                   //
            cen = 200;                    //
            dez = 10;                     //
        }                                 //
        Y2 = 0;                           //
        delay_us(1);                      //
                                          //
        //DIGITO 1                        //
        Y3 = 1;                           //
        delay_us(1);                      //
        if(X4 == 1 && Y3 == 1)            //
        {                                 //
            digito = 1;                   //
            cen = 100;                    //
            dez = 10;                     //
        }                                 //
        Y3 = 0;                           //
        delay_us(1);                      //
                                          //
         //DIGITO 0                       //
        Y4 = 1;                           //
        delay_us(1);                      //
        if(X4 == 1 && Y4 == 1)            //
        {                                 //
            digito = 0;                   //
        }                                 //
        Y4 = 0;                           //
        delay_us(1);                      //
}//END                                    //
                                          //
//END_FUNC                                //
//))))))))))))))))))))))))))))))))))))))))))

Sem título.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Não analisei o programa mas a opção de mostrar 456 no display é algo como a cada pressionada desloque a posição de impressão no display. Algo como (chute)
 

//...
unsigned char i=1;
//...
Lcd_Out(2,i++,txt2);//ESCREVE NO LCD SEGUNDA LINHA

Consulte o help da sua função lcd_out pra ver a função dos argumentos

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 08/09/2017 às 09:08, Isadora Ferraz disse:

Não analisei o programa mas a opção de mostrar 456 no display é algo como a cada pressionada desloque a posição de impressão no display. Algo como (chute)
 


//...
unsigned char i=1;
//...
Lcd_Out(2,i++,txt2);//ESCREVE NO LCD SEGUNDA LINHA

Consulte o help da sua função lcd_out pra ver a função dos argumentos

Muito obrigado ajudou muito, achei duas soluções para o problema, a primeira foi da maneira que você falou, vai atribuindo valores e pula para segunda coluna, sendo assim depois desse processo basta ler o LCD através do microcontrolador, habilitando o modo leitura do LCD. O segundo método, nao precisa ter um LCD para atribuir os dígitos sequencialmente, basta  usar um laço while e atribuir cada digito em uma posição do vetor e depois juntar ambas partes veja:

 

while(RE1_bit == 0)
     {
     char txt1[] = "PRIMEIRO DIGITO";
     Lcd_Out(1,1,txt1);//ESCREVE NO LCD PRIMEIRA LINHA
     teclado();
     soma[0] = digito*10;
     }
     
     delay_ms(500);
     Lcd_Cmd(_LCD_CLEAR);// Clear display
     delay_ms(500);
     
     while(RE1_bit == 0)
     {
     char txt1[] = "SEGUNDO DIGITO";
     Lcd_Out(1,1,txt1);//ESCREVE NO LCD PRIMEIRA LINHA
     teclado();
     soma[1] = digito;
     }
     delay_ms(500);
     valor = soma[0] + soma[1];
     delay_ms(500);

     }

Link para o comentário
Compartilhar em outros sites

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