Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!