451按鍵码不能用USB上传到PC端

CH451L只做键盘接口,使用INTO端口,USB使用INT1端口。 以下是451中断源码,单片机响应中断后由USB口回送到PC测试(USB发送接收测试没有问题),使用CH372DBG\DEBUG372\Release\DEBUG372.EXE 数据端2上传接收,长度设为1,可是451按键按下后,测试软件无反映(以按下 数据端2上传 的确定按扭),请问这是为什么?

/* CH451键盘中断服务程序INT0,使用寄存器组1 */ void mCH451Interrupt( ) interrupt 0 using 1 { ............ ............ 以上获取获取CH451_KEY(同示例,用指示灯测试按键正常) IE0=0; /* 清中断标志 */ CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); /* 向USB端点1的发送缓冲区写入数据块 */ CH372_WR_DAT_PORT(1); /* 首先写入接收到的数据长度 */ CH372_WR_DAT_PORT(CH451_KEY); /* 接收到的数据是否正确 */ } 请高手指教,谢谢。

CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); 这哪里是往端点1送数据啊? 端点2 吧!


你的晶振是多少? 如果晶振大于16MHZ 在CH372_WR_CMD_PORT(CMD_WR_USB_DATA7);后面加上2us的延时试试


向375命令口写命令的子程序如果是象下面这样写的 void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ Delay2us(); CH375_CMD_PORT=cmd; Delay2us(); } 你可以把第一个Delay2us();去掉试试.或者在程序的开头加上#pragma NOAREGS 因为你的CH375_WR_CMD_PORT()子程序加在中断程序中.而你的中断程序使用了寄存器组1, 延时程序中使用了工作寄存器R7,它的地址在寄存器组1中的地址与其他寄存器组的地址是不一样的.


这是keil编译器的问题


我的晶振是12M的,我试试,谢谢各位。 1234请问你所说的: 而你的中断程序使用了寄存器组1,延时程序中使用了工作寄存器R7,它的地址在寄存器组1中的地址与其他寄存器组的地址是不一样的.

工作寄存器R7是地址在寄存器组1中的R7吗? 如果我用寄存器组2呢?R7是否是2的R7?

0-3的四组寄存器中R7的地址分别为07H,0FH,17H,1FH.


如果你用寄存器组2,R7是2组的R7


知道了,谢谢1234


只有登录才能回复,可以选择微信账号登录