1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida teclado C

Discussão em 'Programação' iniciada por dune99, 12 de Abril de 2008. (Respostas: 8; Visualizações: 1439)

  1. dune99

    dune99 Power Member

    Boa tarde.

    A minha duvida é a seguinte:
    Em C como posso fazer o controlo das tecladas do teclado de modo a que no meu programa saiba quando uma dada tecla é premida e depois é solta;

    Por exemplo: emitir um dado som apenas enquanto a tecla é premida e o som terminar qundo a tecla é solta.

    Muito obrigado
     
  2. metralha761

    metralha761 1st Folding then Sex

    Eu tb ando a procura de algo em q quando se pressiona uma tecla, não aceite mais caracteres.

    Algo do estilo, quando chega a linha do scanf, o utilizador ao pressionar uma tecla é o equivalente a pressionar tecla e enter, ou por outras palavras um scanf aceitar so 1 caracter.

    Depois disso, é usares 2 caracteres especiais o backspace (apagar), bell (som bip) e um caracter a sobrepor no printf. Acho q so existiria uns milissegundos a expor a tecla, penso q seria algo imperceptivel.

    Penso q esta seria uma das soluções :)
     
  3. O getchar() não serve?
     
    Última edição: 12 de Abril de 2008
  4. metralha761

    metralha761 1st Folding then Sex

    O problema do getchar() é q é preciso meter o enter.

    Mas após algumas pesquisas consegui algo mt bom :)
    Código:
    #include <stdio.h>
    #include <unistd.h>
    #include <termios.h>
    
    int main()
    {
      char x = ' ';
    
      printf("Press any key to continue...\n");
      x = getch();
    
      printf("The key you entered is: %c decimal>%d \n", x, x);
    
      return 0;
    }
    
    int getch(void)
    {
      int ch;
      struct termios oldt;
      struct termios newt;
      tcgetattr(STDIN_FILENO, &oldt); /*store old settings */
      newt = oldt; /* copy old settings to new settings */
      newt.c_lflag &= ~(ICANON | ECHO); /* make one change to old settings in new settings */
      tcsetattr(STDIN_FILENO, TCSANOW, &newt); /*apply the new settings immediatly */
      ch = getchar(); /* standard getchar call */
      tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /*reapply the old settings */
      return ch; /*return received char */
    }
    Em linux funcionou na perfeição, ainda nao testei em windows.
    Ja agora, o codigo ASCII para o bell é \a ou \007 ou \x7 basta colocar no output (printf por exemplo).
    Eu nao coloquei o bell no meu print, mas se repararem ele esta a returnar o character e o seu valor decimal, a razao é simples, ele aceita qq tecla, return backspace etc há q filtrar o conteudo, mas isso penso q seja relativamente simples, inclusive podem personalizar a função getch().

    ATENÇÃO: a função getch() pode existir dentro de algumas librerarias não standard, como conio.h, se virem erros de dupla declaração ja sabem :)
     
    Última edição: 13 de Abril de 2008
  5. Neptune

    Neptune 1st Folding then Sex

    Tive que fazer um projecto para uma cadeira que envolvia isso (era um piano digital) e posso dizer-vos que o melhor a fazerem é utilizarem a função getch() (não é necessário premir enter para o scancode ser lido) existente no módulo conio.h e a função kbhit(), embora eu ache que o ideal é trabalhar directamente com os portos de I/O do teclado 0x60 (data) e 0x64 (control/status) porque, pelo menos no meu caso, era impossível implementar um piano com as especificações que me foram dadas de outra forma.
     
    Última edição: 13 de Abril de 2008
  6. metralha761

    metralha761 1st Folding then Sex

    Atenção numa coisa.

    A biblioteca conio.h é para windows, segundo consegui pesquisar.

    Existem problemas no sentido de fazer leitura da tecla premida sem usar o enter, mts soluções estão dependentes da plataforma.

    Pelo menos ja existe uma solução para windows, usando a conio.h e outra pa linux, apresentada por mim.


    PS: Sobre a biblioteca conio.h tentei pesquisar a biblioteca para o ubuntu e o q encontrei foi q nao ha para linux é especifica para windows.
     
  7. Neptune

    Neptune 1st Folding then Sex

    Sim, em Linux não tens conio.h, mas podes utilizar algumas implementações que por aí andam que fazem exactamente o mesmo.

    Eu não tive esse problema porque o trabalho era para ser feito em Windows.

    De qualquer forma, não precisas disso pra nada se trabalhares directamente com os portos 0x60 e 0x64 do teclado. Basta usares a io.h e ioperm.h (no caso do Linux).
     
    Última edição: 13 de Abril de 2008
  8. dune99

    dune99 Power Member

    Ninguem me pode dar uma dica?

    Obrigado
     
  9. metralha761

    metralha761 1st Folding then Sex


    Tenta com esta dica do Neptune
     

Partilhar esta Página