Autor Tema: Teclado USB  (Leído 1951 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
Teclado USB
« en: 26 de Diciembre de 2009, 18:36:11 »
Hola amigos del foro:

Estoy haciendo una comunicacion USB HID con un pic 18f4550 y un teclado matricial apoyandome en el ejemplo de RedPic. Hata ahora ya logre establecer comunicacion con la pc y el micro. El programa tiene como finalidad que la pc detecte las teclas del teclado matricial al oprimirlas esta es la programacion que llevo hasta ahora:


#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)

#use fast_io(B)

#DEFINE USB_HID_DEVICE  TRUE

#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8

#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8

#include <pic18_usb.h>
#include <usb_kbd_HID.h>               //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                                 //handles usb setup tokens and get descriptor reports
#include <ctype.h>

/////////////////////////////////////////////////////////////////////////////
//
// Defines y Zarandajas
//
/////////////////////////////////////////////////////////////////////////////

#define LED1    PIN_E0
#define LED2    PIN_E1
#define LED3    PIN_E2

#define LED_ON  output_high
#define LED_OFF output_low



/////////////////////////////////////////////////////////////////////////////
//
// RAM
//
/////////////////////////////////////////////////////////////////////////////

#byte PUERTOB    = 0xF81
#bit  BEEP    = 0xF83.3

byte LSB=0b11111110;
byte tecla1;
char tecla;
int8 enumerated;
int8 rx_msg[USB_EP1_RX_SIZE];
int8 tx_msg[8]={2,0,0,0,0,0,0,0};
int1 hay_dato=0;


/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// Muestra la información de depuración en serie para
// la enumeración y los estados de conexión. Las luces LED2 y LED3 indican
// la enumeración y el estado de la conexión.
//
/////////////////////////////////////////////////////////////////////////////

void usb_debug_task(void)
{

   enumerated=usb_enumerated();//Devuelve 1 si el dispositivo fue enumerado correctamente

   if(enumerated){
      LED_ON(LED1);
      LED_OFF(LED3);
   }
   else
   {
      LED_ON(LED3);
      LED_OFF(LED1);
   }
}

/////////////////////////////////////////////////////////////////////////////
//
// usb_keyboard_task()
//
// Envía un paquete de datos del teclado. El protocolo se especifica en el
// descriptor de informe HID (véase usb_desc_kbmouse.h), y es:
//     tx_msg[0]   = Informe HID ID (2)
//     tx_msg[1]   = modificador (un mapa de 8 bits de cambio, Tecla, se oprime una tecla ALT)
//     tx_msg[2]   = const 0
//     tx_msg[3:7] = se presiono una serie de teclas. a = 4, B = 5, etc
//                   si msg [2:7] = (0) entonces no se mantienen presionadas las teclas
//
//     rx_msg[1] = Informe HID ID (2)
//     rx_msg[0] = 5BIT de mapa de bits de estado LED
//
/////////////////////////////////////////////////////////////////////////////
int8 char_2_usb_kbd_code(char c){

   int8 ic;
   tx_msg[1] = 0x00;

   if(isAlpha(c)){
      ic=c-'a'+4;
   }
   else{
      if(c=='0'){
        ic=39;
      }
      else{
        ic=c-'1'+30;
      }
   }
   return(ic);
}

/////////////////////////////////////////////////////////////////////////////
//
// usb_rx_task()
//
// Escucha a EP1 para todos los paquetes entrantes. El único informe ID que
// es configurdo que nos envíe los datos es de 2 (teclado LED de estado, véase más arriba)
//
/////////////////////////////////////////////////////////////////////////////

void usb_rx_task(void)
{

   if (usb_kbhit(1))
   {
      usb_get_packet(1, rx_msg, sizeof(rx_msg));
   }
}

///////////////////////////////////////////////////////////////////////////////
//subrutina de corrimiento
///////////////////////////////////////////////////////////////////////////////

Corrimiento()
{

   PUERTOB=LSB;
   rotate_left( &LSB, 1);
   if(LSB==0b11101111)
   LSB=0b11111110;
}

///////////////////////////////////////////////////////////////////////////////
//SUBRUTINA ENTERO, determina que tecla se oprimio
///////////////////////////////////////////////////////////////////////////////

int Entero()
{
   tecla1=PUERTOB;
   
   switch (tecla1)
   {
      case 0xEE : tecla='a';       break;
      case 0xED : tecla='9';           break;
      case 0xEB : tecla='8';           break;
      case 0xE7 : tecla='7';         break;
      case 0xDE : tecla='e';           break;
      case 0xDD : tecla='6';           break;
      case 0xDB : tecla='5';         break;
      case 0xD7 : tecla='4';          break;
      case 0xBE : tecla='d';         break;
      case 0xBD : tecla='3';         break;
      case 0xBB : tecla='2';         break;
      case 0xB7 : tecla='1';         break;
      case 0x7E : tecla='c';         break;
      case 0x7D : tecla='b';         break;
      case 0x7B : tecla='a';         break;
      case 0x77 : tecla='0';          break;
      default   : tecla=16;      break;
      }
      return tecla;
}


////////////////////////////////////////////////////////////////////////////////
//PROGRAMA PRINCIPAL
////////////////////////////////////////////////////////////////////////////////

void main()
{

   hay_dato=0;

   delay_ms(500);

   LED_OFF(LED1);
   LED_OFF(LED2);
   LED_OFF(LED3);

   usb_init_cs();
   set_tris_b(0b11110000);              // Inicializacion del Teclado
   port_b_pullups(TRUE);
   LSB=0b11111110;
   PUERTOB=LSB;
   tecla=16;
 

   while (TRUE)
   {

      usb_task();
      usb_debug_task();

      if (usb_enumerated())//Devuelve 1 si el dispositivo fue enumerado correctamente
      {
       
         Corrimiento();
         Entero();
         
         if(tecla!=16)
         {
            tx_msg[3]=char_2_usb_kbd_code(tecla);
            usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
            LED_ON(LED2);
            delay_ms(300);
            LED_OFF(LED2);
            tecla=16;           

         }
          else
         {
                     
            tx_msg[3]=0;
            usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
            delay_ms(5);
           
         }
         
         usb_rx_task();
         delay_ms(5);
      }
   }
}




Hasta aqui todo funciona bien pero el problema es que quiero enviar otros simbolos (/, *, -, +) enves de las letras a,b,c,d he intentado varias cosas pero nada funciona, segun yo ago los cambios a la programacion y no logro que se mande los simbolos: /,*,-,+ si  no que aparece cualquier otra cosa que nada tiene que ver. Se que tiene que ver con los datos mandados en tx_msg pero no logro decifrar que es. Si alguien me pudiera echar la mano es esto se los agradeceria ampliamente.

Gracias

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Teclado USB
« Respuesta #1 en: 27 de Diciembre de 2009, 11:45:17 »
No crees temas repetidos, por favor usa el que ya habías abierto.

http://www.todopic.com.ar/foros/index.php?topic=28766.msg237571#msg237571


 

anything