求助:用C8051F320模拟USB键盘键码重发问题
我现在用C8051F320实现接收串口的字符然后模拟usb键盘将字符以文本的方式输入到文本文件里面。现在遇到的问题是接收一个字符后,这个字符会自动重发,找了一天没找到主要原因。希望哪位大侠能指点迷津一下啊。
不胜感激。//-----------------------------------------------------------------------------
// UART0_Interrupt
//-----------------------------------------------------------------------------
//
// This routine is invoked whenever a character is entered or displayed on the
// Hyperterminal.
//
//-----------------------------------------------------------------------------
void UART0_Interrupt (void) interrupt 4
{
unsigned char key=0;
unsigned char rx=0;
if (RI0 == 1)
{
rx = SBUF0;
RI0 = 0; // Clear interrupt flag
switch(rx)
{
case 'a':
key = 0x04;
IN_PACKET =key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'b':
key = 0x05;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'c':
key = 0x06;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'd':
key = 0x07;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'e':
key = 0x08;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'f':
key = 0x09;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'g':
key = 0x0A;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'h':
key = 0x0B;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'i':
key = 0x0C;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'j':
key = 0x0D;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'k':
key = 0x0E;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'l':
key = 0x0F;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'm':
key = 0x10;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'n':
key = 0x11;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'o':
key = 0x12;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'p':
key = 0x13;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'q':
key = 0x14;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'r':
key = 0x15;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 's':
key = 0x16;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 't':
key = 0x17;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'u':
key = 0x18;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'v':
key = 0x19;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'w':
key = 0x1A;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'x':
key = 0x1B;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'y':
key = 0x1C;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'z':
key = 0x1D;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'A':
key = 0x04;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'B':
key = 0x05;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'C':
key = 0x06;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'D':
key = 0x07;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'E':
key = 0x08;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'F':
key = 0x09;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'G':
key = 0x0A;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'H':
key = 0x0B;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'I':
key = 0x0C;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'J':
key = 0x0D;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'K':
key = 0x0E;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'L':
key = 0x0F;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'M':
key = 0x10;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'N':
key = 0x11;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'O':
key = 0x12;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'P':
key = 0x13;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'Q':
key = 0x14;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'R':
key = 0x15;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'S':
key = 0x16;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'T':
key = 0x17;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'U':
key = 0x18;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'V':
key = 0x19;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'W':
key = 0x1A;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'X':
key = 0x1B;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'Y':
key = 0x1C;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 'Z':
key = 0x1D;
IN_PACKET = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '1':
key = 0x1E;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '2':
key = 0x1F;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '3':
key = 0x20;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '4':
key = 0x21;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '5':
key = 0x22;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '6':
key = 0x23;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '7':
key = 0x24;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '8':
key = 0x25;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '9':
key = 0x26;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '0':
key = 0x27;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '.':
key = 0x37;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case ',':
key = 0x36;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '-':
key = 0x2D;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case '+':
key = 0x2E;
IN_PACKET = 0x02;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case ' ':
key = 0x2C;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case ':':
key = 0x33;
IN_PACKET = 0x02;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
case 0x0d:
key = 0x58;
IN_PACKET = key;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
default:
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
}
}
} 自己抢个沙发 再顶一下 把工程整个打包rar上来 {:sweat:} jetli 发表于 2012-8-21 09:36 static/image/common/back.gif
把工程整个打包rar上来
attach://Keyboard.zip
谢谢,帮忙看看哈 jetli 发表于 2012-8-21 09:36 static/image/common/back.gif
把工程整个打包rar上来
已经上传了 试着做这样的测试,【 调试程序的排除法】
1、接收到一个字符后,强制进入一个死循环例如某LED闪。
2、如果还会有,重复字符重发,说明是中断出现了循环。
3、再屏蔽此中断
、、、 zzh90513 发表于 2012-8-21 09:43 static/image/common/back.gif
已经上传了
不知道你的问题解决没?我最近用321做个东西也是重复发码,还没找到问题 本帖最后由 xi416547162 于 2013-7-11 09:02 编辑
应该是没发断码,相当于电脑认为按键按下未释放,不知道usb键盘里有没有这说法? zzh90513 发表于 2012-8-21 09:41
attach://Keyboard.zip
谢谢,帮忙看看哈
兄弟:
你的程序搞好了吗?我也是用C8051F340模拟枚举USB键盘,可是到 SEF CONFIG 命令后失败!有没好的方法? 本帖最后由 and001 于 2014-8-17 10:46 编辑
兄弟搞好那个重复问题没?我等你的答案呀?好像是USB重复发,???
我看你的解决办法是空闲的时候发“0”,对吧?
// IN_PACKET = key;
// IN_PACKET =0;
// IN_PACKET =0;
// IN_PACKET =0;
// IN_PACKET =0;
// IN_PACKET =0;
// SendPacket (0);
// break;
default:
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
IN_PACKET =0;
SendPacket (0);
break;
}
// }
}
and001 发表于 2014-8-17 10:23
兄弟搞好那个重复问题没?我等你的答案呀?好像是USB重复发,???
我看你的解决办法是空闲的时候发“0” ...
发送0代表释放按键,“按下”和“弹起”必须成对出现,要不然就是“连按” zzh90513 发表于 2014-8-18 10:33
发送0代表释放按键,“按下”和“弹起”必须成对出现,要不然就是“连按” ...
非常感谢!我也已经实现用C8051F340实现USB键盘模拟功能!
想顺便问问:兄弟现在搞啥项目? zzh90513 发表于 2014-8-18 10:33
发送0代表释放按键,“按下”和“弹起”必须成对出现,要不然就是“连按” ...
当前想用内部的晶体(默认为12MHz)
如下操作:
#define SYS_INT_OSC 0x00 // Select to use internal oscillator
#define SYS_EXT_OSC 0x01 // Select to use an external oscillator
#define SYS_4X_DIV_2 0x02
先#define _USB_LOW_SPEED_ // 让它直接用内部时钟,其他都不修改
void Sysclk_Init (void)
{
#ifdef _USB_LOW_SPEED_
OSCICN |= 0x03; // Configure internal oscillator for 内部时钟不分频
// its maximum frequency and enable
// missing clock detector
CLKSEL= SYS_INT_OSC; // Select System clock --用内部时钟
CLKSEL |= USB_INT_OSC_DIV_2; // Select USB clock---系统时钟2分频给USB用--6MHz
#else
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency and enable
// missing clock detector
CLKMUL= 0x00; // Select internal oscillator as
// input to clock multiplier
CLKMUL |= 0x80; // Enable clock multiplier
CLKMUL |= 0xC0; // Initialize the clock multiplier
Delay(); // Delay for clock multiplier to begin
while(!(CLKMUL & 0x20)); // Wait for multiplier to lock
CLKSEL= SYS_INT_OSC; // Select system clock
CLKSEL |= USB_4X_CLOCK; // Select USB clock
#endif/* _USB_LOW_SPEED_ */
}
就好像枚举都不成功了,请问我这样有什么问题、。?? and001 发表于 2014-8-18 22:13
当前想用内部的晶体(默认为12MHz)
我前面上传了工程,对照下 zzh90513 发表于 2014-8-18 22:31
我前面上传了工程,对照下
谢谢!我弄错了,应该已经是内部时钟了,只是为什么是全速USB呢?好像键盘和鼠标都应该是 低速的吗? and001 发表于 2014-8-18 23:05
谢谢!我弄错了,应该已经是内部时钟了,只是为什么是全速USB呢?好像键盘和鼠标都应该是 低速的吗? ...
全速,低速代表传输速度,跟什么设备没关系 我定义成低速完全跑不起来?是不是HID设备枚举里面已经有参数默认成全速?
#define _USB_LOW_SPEED_ 后不能枚举?? and001 发表于 2014-8-19 14:14
我定义成低速完全跑不起来?是不是HID设备枚举里面已经有参数默认成全速?
#define _USB_LOW_SPEED_ 后不 ...
枚举过程里面变量需要修改
页:
[1]