Ir ao conteúdo
  • Cadastre-se
Victor  222222

teclado matricial com o pic 18f4520 no mplab

Recommended Posts

preciso fazer um teclado matricial cuja o LED1  pisque o numero de vezes que o numero do teclado for acionado (ex se aperta o numero 4 o led deve aperta 4 vezes e assim por diante)

devo usar o time 1 e não delay mais sempre que vou compilar ele aparece erro alguém ai pode me ajudar.egue meu código abaixo:

#include<adc.h>
#include <p18f4520.h>                        //Biblioteca do PIC18F4550
#include <stdlib.h>                            //Biblioteca geral C
#include <stdio.h>                            //Biblioteca geral entradas e saídas
#include <timers.h>                            //Adiciona a biblioteca de função de TIMER
#include <delays.h>

#pragma config OSC = HS                        //Oscilador a cristal 20MHz
#pragma config PWRT = ON                    //Power-UP timer enable
#pragma config WDT = OFF                    //Watchdog Timer disable
#pragma config PBADEN = OFF                    //RB0: RB4 I/O Digital
#pragma config LVP = OFF                    //ICSP. Low Power Programming Disable
#pragma config BOREN = SBORDIS                //Brown-out Reset (BOREN) Habilitado somente no hardware
#pragma config BORV = 1                        //tensão do BOR é 4,33v
#pragma config LPT1OSC = ON                    //TIMER1 programado para operar no modo low-power

char lcd[17];

#define S1 PORTBbits.RB0
#define S2 PORTCbits.RC0  
#define LED1 PORTDbits.RD1

#define col_1 PORTBbits.RB1
#define col_2 PORTBbits.RB2
#define col_3 PORTBbits.RB3
#define row_A PORTBbits.RB4
#define row_B PORTBbits.RB5
#define row_C PORTBbits.RB6
#define row_D PORTBbits.RB7
 
 void pulser (unsigned char number);              // Funçao para pulsar led1                                                            
unsigned char control = 0x01;

void ISR_alta_prioridade(void);             //Protótipo da função de interrupção

#pragma code int_alta = 0x08                //Vetor de interrupçao de alta prioridade
void int_alta(void)
{
    _asm goto ISR_alta_prioridade _endasm    //Desvia o programa para a função ISR_alta_prioridade
}
#pragma code
#pragma interrupt ISR_alta_prioridade
void ISR_alta_prioridade(void){
    
    //Note que o TMRL1 não é alterado o que permite que ele continue incremetando
    WriteTimer0(0X6C); // Carrega o valor de 40535 para dentro do registro TMR1H
    if(INTCONbits.TMR0IF){
        INTCONbits.TMR0IF=0;    //T0IE_bit = 0x01;
    }
    WriteTimer0(0X6C);
    if(col_1 && control ==1){             //coluna em nivel alto? control igual a 1?
       control = 0x02;                    //sim
       col_1 = 0x00;                      //apenas a coluna 2 em nivel baixo
       col_2 = 0x01;
       col_3 = 0x01; 
       if(!row_A){
        pulse(1); 
       }  
       if(!row_B){
        pulse(4);
     } 
       if(!row_C){
        pulse(7);
    }
       if(!row_D){
        pulse (11);
      }
    }
      if (col_2&& control ==2){          //coluna 2 em nivel alto? control igual a 2 ? 
          control = 0x03;                  //sim... 
        col_1 = 0x01;
        col_2 = 0x00;                   //apenas a coluna 2 em nivel baixo
        col_3 = 0x01;
     }   
        if(col_3 && control==3){       //coluna 3 em nivel alto? control igual a 1?
        control = 0x01;                //sim...
        col_1 = 0x01;
        col_2 = 0x01;
        col_3 = 0x00;                  //apenas coluna 3 em nivel baix0
     }    
}       
 
void pulse( unsigned char number){              //desenvolver a funçao
  unsigned char i;                             //variavel de interaçao
  for(i=0;i<number;i++){
      LED1 = 0x01;
      Delay10KTCYx(255);
      LED1 = 0x00;
      Delay10KTCYx(255); 
  }
}  
void main(void){
    CMCON = 0x07;

    OpenTimer0(    TIMER_INT_ON
                &T0_8BIT
                &T0_SOURCE_INT
                &T0_PS_1_128);

    INTCONbits.GIE = 1;
    INTCONbits.PEIE=1;
    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;
    
    TRISA = 0x3;               //Entrada em RA0 e RA1
    TRISB = 0xF0;              //Mais significativo entrada
    TRISC = 0x00;              
    TRISD = 0x00;
    ADCON1 = 0x0F;
    PORTB = 0xFF;             //mais significativo nivel alto
   while(1){
       
  
             
    }

}

e ajudar ,segue meu codigo abaixo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×