Ir ao conteúdo
  • Cadastre-se

bigles21

Membro Júnior
  • Posts

    15
  • Cadastrado em

  • Última visita

Reputação

7
  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); } } } 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
  2. não deu certo, o led que acenderia digitando a tecla 1 e 2 ja fica aceso quando eu simulo. nr_1 vai no #define?
  3. Ola decair, vou tentar isso, obrigado Devair
  4. ola, eu já tive esse problema, até hj não consegui mais gravar nada nele, nem formatar, pode ser defeito mesmo, ou voce acabou ativando a proteção de gravação, alguns pen drivers tem uma chave pequena pra bloquear
  5. Ola, as vezes cabo de má qualidade dá problema, tenta usar um cabo original.
  6. 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); } } }
  7. @aphawk Ha sim, ensino... Mas a desaparecer ou ganhar dinheiro? kkk Dinheiro tá difícil;;; To fazendo aqui C pra ver que q dá...
  8. @aphawk Sim, o código no geral é meu, .hoje a noite vou tentar, obrigado! adicionado 1 minuto depois @Isadora Ferraz Dominar o mundo não é meu sonho de consumo, e sim, desaparecer dele
  9. @aphawk O problema está no nível de programação de cada um, não sou expert, por isso vim pedir ajuda.. Mas obrigado pela sua ajuda, vou ver se consigo com as suas dicas e a Izadora, valeu
  10. @aphawk Até pensei, mas se eu fizer um monte de if definindo uma margem de Distancia X pra acender o LED1 (Distancia aumentando) ou LED2 (Distancia diminuindo) o sistema não entenderá se a distancia está subindo ou descendo...
  11. @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; }
  12. 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...