买了圈圈的书,用到里面的键盘功能,
试验中USB键盘实现用的是一个单独的小板,用的是STC11F05E,和USBD12,移植后单独用按键测试的时候没有问题,后面改用串口接收命令,再发送相应的指令。
如发送的是左移键的命令,则用文本观察,光标一直左移动,查了一阵总没差出来,请帮忙看看是哪里出了问题!
这边是窜口的代码;
void InitUART(void)
{
EA=0; //暂时关闭中断
TMOD&=0x0F; //定时器1模式控制在高4位
TMOD|=0x20; //定时器1工作在模式2,自动重装模式
SCON=0x50; //串口工作在模式1
TH1=256-Fclk/(BitRate*12*16); //计算定时器重装值
TL1=256-Fclk/(BitRate*12*16);
PCON|=0x80; //串口波特率加倍
ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断
getchar = 0;
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:串口中断处理。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void UartISR(void) interrupt 4
{
if(RI) //收到数据
{
RI=0; //清中断请求
getchar = SBUF;
}
else //发送完一字节数据
{
TI=0;
}
}
下面是主函数发送的相关代码:
if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
{
if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据
{
if(getchar != 0){
SendReport();
getchar = 0;
}
}
}
下面是USB发送函数的代码:
void SendReport(void)
{
uint8 Buf[8]={0,0,0,0,0,0,0,0};
//由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
uint8 i;
i = getchar;
if(i < 5){
//根据不同的按键设置输入报告
if(i == 0x01) //如果KEY1按住
{
Buf[3]|=0x50; //KEY1为左Ctrl键。
}
else if(i == 0x02) //如果KEY1按住
{
Buf[3]|=0x4f; //KEY1为左Ctrl键。
}
else if(i == 0x03) //如果KEY1按住
{
Buf[3]|=0x52; //KEY1为左Ctrl键。
}
else if(i == 0x04) //如果KEY1按住
{
Buf[3]|=0x52; //KEY1为左Ctrl键。
}
//报告准备好了,通过端点1返回,长度为8字节。
D12WriteEndpointBuffer(3,8,Buf);
Ep1InIsBusy=1; //设置端点忙标志。
i = 0;
}
getchar = 0;
}
1.最开始以为是一直其他串口在一直对他发送命令,直接拔掉窜口线,问题依然。
2.由于串口改为接收数据,原来的代码串口调试函数全部删掉了。删除后,有通过按键方式测试,正常。
请帮忙看看,这何种问题,或需要用什么方法进行调试。
谢谢了 |