Ir ao conteúdo
  • Cadastre-se

bigles21

Membro Júnior
  • Posts

    15
  • Cadastrado em

  • Última visita

posts postados por bigles21

  1. 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
  2. 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
  3. @Isadora Ferraz Já tenho a variavel Distancia sim, mas como funcionaria essa tua sugestão? porque sao muitas leituras, de 7 a 2 metros, mais ou menos, entao por exemplo, se a distancia tá em 10cm e passou pra 11 ou 12 ou até de 5 em 5cm. tipo tá em 10cm, depois 10 em 15cm seta um led... kkk isso até me deu uma possível solução... Talvez e possa usar "case"

     

    switch (Distancia)
    {
       case Distancia tal:
         set_bit(PORTD, PB2);
       break;
    
       case constante2:
         Instruções;
       break;
    
       default
         Instruções;
    }


     

  4. Se alguém puder me ajudar;

    to com um atmega8 lendo um sensor ultrasonico e acendendo leds de acordo com a distancia, até ai ok, mas eu queria que acendesse um led quando a distancia estiver aumentando e outro quando estiver se aproximando. Obrigado aí pessoal!

    ISR(TIMER1_CAPT_vect)
    {
            cpl_bit(TCCR1B,ICES1);    //troca a borda de captura do sinal
            if(!tst_bit(TCCR1B,ICES1))//lê o valor de contagem do T/C1 na borda de subida do sinal
            Inicio_Sinal = ICR1;  //salva a primeira contagem para determinar a largura do pul
        
        
            else
            Distancia = (ICR1 - Inicio_Sinal)/58;
        }
    
        int main()
        {
        DDRB = 0b11111110;
        DDRD = 0b11101111;
        
        PORTB =0b00000000;
        PORTD =0b00000000;
        
        TCCR1B =  (1<<ICES1) | (1<<CS11);     //T/C1 com prescaler = 8, captura na borda de subida
        TIMSK = 1<<TICIE1;    //habilita a interrupção por captura
        sei();                //habilita a chave de interrupções globais            //habilita interrupções globais
        
        while(1)
    
        {
            set_bit(PORTB,DISPARO);
            _delay_us(10);
            clr_bit(PORTB,DISPARO);

     

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!