本帖最后由 ddllxxrr 于 2017-11-21 17:42 编辑
这周我改了下,USB的复合设备,就是键盘同鼠标复合设备那个,原理很简单,我用P1.6和P1.7两个管脚当键盘,当P1.6为低时鼠标向
上,当P1.7低时鼠标向下。
在主函数里声明管脚
Port1Cfg(1,6);
Port1Cfg(1,7);
然后始终在执行
- if(Ready)
- {
- while(1)
- {
- HIDValueHandle();
- }
- }
复制代码
而在HIDValueHandle中,是这样:
- oid HIDValueHandle()
- {
- UINT8 i;
- if(P1^6 == 0)
- {
- i = 1;
- }
- else if(P1^7 == 0)
- {
- i = 2;
-
- }
- else
- i = 0;
- switch(i)
- {
- //êó±êêy¾YéÏ′«ê¾ày
- case 1: //×ó¼ü
- HIDMouse[2] = -1;
- Enp2IntIn();
- i=0;
- break;
- case 2: //óò¼ü
- HIDMouse[2] = 1;
- Enp2IntIn();
- i=0;
- break;
- //¼üÅìêy¾YéÏ′«ê¾ày
- case 'A': //A¼ü
- FLAG = 0;
- HIDKey[2] = 0x04; //°′¼ü¿aê¼
- Enp1IntIn();
- HIDKey[2] = 0; //°′¼ü½áêø
- while(FLAG == 0)
- {
- ; /*μè′yéÏò»°ü′«êäíê3é*/
- }
- Enp1IntIn();
- break;
- case 'P': //P¼ü
- FLAG = 0;
- HIDKey[2] = 0x59;
- Enp1IntIn();
- HIDKey[2] = 0; //°′¼ü½áêø
- while(FLAG == 0)
- {
- ; /*μè′yéÏò»°ü′«êäíê3é*/
- }
- Enp1IntIn();
- break;
- case 'Q': //Num Lock¼ü
- FLAG = 0;
- HIDKey[2] = 0x53;
- Enp1IntIn();
- HIDKey[2] = 0; //°′¼ü½áêø
- while(FLAG == 0)
- {
- ; /*μè′yéÏò»°ü′«êäíê3é*/
- }
- Enp1IntIn();
- break;
- default: //ÆäËû
- UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //ĬèÏó|′eNAK
- UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //ĬèÏó|′eNAK
- break;
- }
- }
复制代码
我编译完后,可以看到鼠标自动向上移动,说明可以以每次每格的速度移动鼠标,但是我的问题是
我没有给管脚拉低,它确自动向上移动,我用万用表量了,确实是5V电压,但我用杜绑线拉低时也没有见它下来。
请问大家这是为什么?????
奇怪的是,我单独试按键程序如下:
- void main( )
- {
- UINT16 j = 0;
- CfgFsys( ); //CH554ê±ÖóÑ¡ÔñÅäÖÃ
- mDelaymS(20);
- mInitSTDIO( ); //′®¿ú03õê¼»ˉ
- printf("start ...\n");
- Port1Cfg(1,6); //P14éèÖÃ3éàà51Ë«ÏòÄ£ê½
- if(TIN4 == 0)
- {
- printf("press\n");
- }
- }
复制代码
而我用串口监视,确又是好的,即可以输出"PRESS",而我不接地时输出“Start。。。”
上传个视频:一插上就向上,但我还没有连接任何的导线。
http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1
上述问题解决了
首先谢谢回贴个位:我把程序改为
- if(MISO == 0)
- {
- i = 1;
- }
- else if(SCK == 0)
- {
- i = 2;
-
- }
- else
- i = 0;
复制代码
就好了,上下可以随便动了。
此内容由EEWORLD论坛网友ddllxxrr原创,如需转载或用于商业用途需征得作者同意并注明出处