Ir ao conteúdo
  • Cadastre-se

C digitar duas teclas no teclado matricial atmega 8


bigles21

Posts recomendados

Ola pessoal, não manjo muita de progrmação, mas estou fazendo um jogo e queria ajuda, quem puder ajudar agradeço.

tenho esse código abaixo, p que quero é o seguinte: quando eu digitar por exemplo a tecla 1, que no código corresponde o 0x01, que guarde esse numero, depois digito a segunda tecla, por exemplo a tecla 2 (0x02) e depois que digitei essas duas teclas, uso uma outra que sera o enter, tipo a tecla 6(0x06) e ai faz o que tá dentro do while, a parte que vai dentro do while que é acender os leds tranquilo, mas como faço pra guardar as duas teclas digitadas e finalizar com o enter, que no meu caso é a tecla 6? o teclado tá lendo certinho os numeros ja testei 1 a 1, o problema é que não sei como fazer pra guardar as duas teclas digitadas, agradeço se alguém puder me ajudar. na realidade, as primeiras 8 teclas serão Letras e o resto será numero de 1 a 5 e o 6 vai ser o enter, td bem, isso não muda nada porque o correspondente no progmen é o mesmo.

 

//==================================================================================== //
// LEITURA DE UM TECLADO 4x4 //
//==================================================================================== //
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
//Define macros
#define set_bit(adress,bit) (adress|=(1<<bit))
#define clr_bit(adress,bit) (adress&=~(1<<bit))
#define tst_bit(adress,bit) (adress&(1<<bit))
#define MAY_DELAY 5000
#define LIN0 PC0
#define COL0 PD0


//matriz com as informações para decodificação do teclado
const unsigned char teclado[4][4] PROGMEM = {{0x01, 0x02, 0x03, 0x0F},
{0x04, 0x05, 0x06, 0x0E},
{0x07, 0x08, 0x09, 0x0D},
{0x0A, 0x00, 0x0B, 0x0C}};
unsigned char nr;
//------------------------------------------------------------------------------------
//Sub-rotina para leitura do teclado
//------------------------------------------------------------------------------------
unsigned char ler_teclado()
{
    unsigned char n, j, tecla, linha;
    for(n=0;n<4;n++)
    {
        clr_bit(PORTB,n); //apaga o bit da coluna (varredura)
        _delay_ms(10); //atraso para uma varredura mais lenta
        linha = PINB>>4; //lê o valor das linhas
        
        for(j=0;j<4;j++) //testa as linhas
        {
            if(!tst_bit(linha,j)) //se foi pressionada alguma tecla, decodifica
            tecla = pgm_read_byte(&teclado[j][n]);
        }
        set_bit(PORTB,n); //seta o bit zerado anteriormente
    }
    return tecla; //retorna o valor pressionado
    //se nenhuma tecla for pressionada, tecla tem o ultimo valor lido
    //inicialização por conta do usuário
}
//------------------------------------------------------------------------------------
int main()

{
    DDRB = 0b00001111; //definições das entradas e saídas para o teclado
    
    DDRC = 0b11111111; //definições das entradas e saídas LINHAS LEDS 5
    DDRD = 0b11111111; //definições das entradas e saídas COLUNAS LEDS 8
    
    PORTB= 0xFF; //habilita os pull-ups da porta B
    PORTC= 0xFF; //habilita os pull-ups da porta C LINHAAAAAAAAAAAAA
    PORTD= 0x00; //habilita os pull-ups da porta B COLUNAAAAAAAAAAA
    
    while(1)
    {
        nr = ler_teclado(); //Lê constantemente o teclado
        
        //Sequencia do A

            
            if (nr==0X01)
                
            
            {
          
            clr_bit(PORTC,LIN0);
            set_bit(PORTD,COL0);
            _delay_ms(MAY_DELAY);
            clr_bit(PORTD,COL0);
    
            }
    }
}


 

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

@bigles21   essa variável  

 nr = ler_teclado(); //Lê constantemente o teclado

        

aí no código  no while

while(1)
{
  nr = ler_teclado(); /// Lê constantemente o teclado
  nb = ler_teclado(); /// Lê constantemente o teclado
                      /// Sequencia do A
  nr = nr * 10 + nb;  /// digitando 0 e enter e 1 e enter eh igual 1
                      /// digitar   1 e enter e 0 e enter eh igual 10
  if( nr == 0X01 )
  {
    clr_bit(PORTC,LIN0);
    set_bit(PORTD,COL0);
    _delay_ms(MAY_DELAY);
    clr_bit(PORTD,COL0);
  }
}

 

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

não deu certo, não acende nenhum led, to fazendo um teste só com um led, na real serão 40 leds, mas preciso fazer com que fucnione com 1 led pra testar, talvez ate faça varredura pros 40 leds, mas preciso testar só um, mas obrigado por tentar ajudar,

 

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
//Define macros
#define set_bit(adress,bit) (adress|=(1<<bit))
#define clr_bit(adress,bit) (adress&=~(1<<bit))
#define tst_bit(adress,bit) (adress&(1<<bit))
#define MAY_DELAY 5000
#define LIN0 PC0
#define COL0 PD0

#define LIN1 PC1
#define COL1 PD1

#define LIN2 PC2
#define COL2 PD2

#define LIN3 PC3
#define COL3 PD3

#define LIN4 PC4
#define COL4 PD4

#define LIN5 PC5
#define COL5 PD5

#define A  0x01
#define B  0x02
#define C  0x03
#define D  0x0F
#define E  0x04
#define F  0x05
#define G  0x06
#define H  0x0E

#define N1  0x07
#define N2  0x08


//matriz com as informações para decodificação do teclado
const unsigned char teclado[4][4] PROGMEM = {{0x01, 0x02, 0x03, 0x0F},
{0x04, 0x05, 0x06, 0x0E},
{0x07, 0x08, 0x09, 0x0D},
{0x0A, 0x00, 0x0B, 0x0C}};
unsigned char nr;
unsigned char nb;
//------------------------------------------------------------------------------------
//Sub-rotina para leitura do teclado
//------------------------------------------------------------------------------------
unsigned char ler_teclado()
{
	unsigned char n, j, tecla, linha;
	for(n=0;n<4;n++)
	{
		clr_bit(PORTB,n); //apaga o bit da coluna (varredura)
		_delay_ms(10); //atraso para uma varredura mais lenta
		linha = PINB>>4; //lê o valor das linhas
		
		for(j=0;j<4;j++) //testa as linhas
		{
			if(!tst_bit(linha,j)) //se foi pressionada alguma tecla, decodifica
			tecla = pgm_read_byte(&teclado[j][n]);
		}
		set_bit(PORTB,n); //seta o bit zerado anteriormente
	}
	return tecla; //retorna o valor pressionado
	//se nenhuma tecla for pressionada, tecla tem o ultimo valor lido
	//inicialização por conta do usuário
}
//------------------------------------------------------------------------------------
int main()

{
	DDRB = 0b00001111; //definições das entradas e saídas para o teclado
	
	DDRC = 0b11111111; //definições das entradas e saídas LINHAS LEDS 5
	DDRD = 0b11111111; //definições das entradas e saídas COLUNAS LEDS 8
	
	PORTB= 0xFF; //habilita os pull-ups da porta B
	PORTC= 0xFF; //habilita os pull-ups da porta C LINHAAAAAAAAAAAAA
	PORTD= 0x00; //habilita os pull-ups da porta B COLUNAAAAAAAAAAA
	
	while(1)
	{
		nr = ler_teclado(); //Lê constantemente o teclado
		
		//Sequencia do A
	nb = ler_teclado(); /// Lê constantemente o teclado
	/// Sequencia do A
	nr = nr * 10 + nb;  /// digitando 0 e enter e 1 e enter eh igual 1
	/// digitar   1 e enter e 0 e enter eh igual 10
	if( nr == 0X01 )
		{
		
		set_bit(PORTD,COL0);
		clr_bit(PORTC,LIN0);
		_delay_ms(MAY_DELAY);
		clr_bit(PORTD,COL0);
	}
		}
}

 

jogo.png

eu quero difitar a letra A, que corresponde o numero 1, depois o numero 7 que corresponde o numero 1 e por final da um enter que no meu caso é o numero 8, como mostra as letras ao lado do teclado.

o teste é o seguinte, digitando tecla 0x01(tecla 1 ou A, que é a mesma coisa) + tecla 0x07(que é a minha tecla 7) + enter que eh o 0x08 faz o que ta dentro do if

  • Amei 1
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...

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!