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