阅读:2285回复:11
键盘驱动修改大致成功,还有点小问题
键盘是我自己设计的中断通知+并行IO读取+处理成VKEY
我现在用的自己做的个小板来代替键盘,即几个拨码开关控制IO口的输入,一个按钮作中断(EINT1),即按键和中断不是连动的 现在调到可以接收按键也能在屏幕上输出了,但是停不下来,比如按了A就一直不停地A,把拨码开关调到B对应的输入,依然屏幕上闪A,直到按一次中断按钮之后,开始持续输入B 我检查了,EINT1配置是沿触发(不是的话也该一拨拨码马上变啊……) 处理键值的代码如下: static UINT KeybdPdd_GetEventEx2(UINT uiPddId, UINT32 rguiScanCode[16], BOOL rgfKeyUp[16]) { SETFNAME(_T("KeybdPdd_GetEventEx2")); RETAILMSG(1, (TEXT(">>> kbd under response \r\n"))); UINT32 scInProgress = 0; static UINT32 scPrevious; BOOL fKeyUp; UINT8 ui8ScanCode; UINT cEvents = 0; DEBUGCHK(rguiScanCode != NULL); DEBUGCHK(rgfKeyUp != NULL); int j; //延迟 volatile tmp = 1; for(j = 0; j < 3; j++) tmp += tmp; for(j = 0; j < 250 * 30; j++) tmp += tmp; //getsFromKBCTL(&ui8ScanCode); //原SPI对应函数,不使用 ui8ScanCode=0x0; //先清0再处理 //若干行根据并行IO输入修改ui8ScanCode的语句 DEBUGMSG(ZONE_SCANCODES, (_T("%s: scan code 0x%08x, code in progress 0x%08x, previous 0x%08x\r\n"), pszFname, ui8ScanCode, scInProgress, scPrevious)); scInProgress = ui8ScanCode; if (scInProgress == scPrevious) { // mdd handles auto-repeat so ignore auto-repeats from keybd } else { // Not a repeated key. This is the real thing. scPrevious = scInProgress; // if (ui8ScanCode & scKeyUpMask) { //别人建议fKeyUp始终为F // fKeyUp = false; // scInProgress &= ~scKeyUpMask; // } else { fKeyUp = FALSE; // } rguiScanCode[cEvents] = scInProgress; rgfKeyUp[cEvents] = fKeyUp; ++cEvents; } return cEvents; } |
|
沙发#
发布于:2007-07-18 19:08
我估计是要在 if (scInProgress == scPrevious) {
// mdd handles auto-repeat so ignore auto-repeats from keybd } 里面加什么东西,不知道对不对…… 仿佛也不该啊,中断一次才会调用一次这整个函数 麻烦大家告诉我下还有哪要改 我不是学软件的,看C比看英文难多了,到这已经基本要崩溃了…… |
|
板凳#
发布于:2007-07-18 20:12
缺少按键抬起事件,就是
// if (ui8ScanCode & scKeyUpMask) { //别人建议fKeyUp始终为F // fKeyUp = false; // scInProgress &= ~scKeyUpMask; // } else { fKeyUp = FALSE; // } 这部分 在驱动中,第一次发的是按键按下值 当按键抬起时,再发一起按键抬起值 |
|
地板#
发布于:2007-07-18 23:56
抬起
针对我自己做的小板 是中断按钮弹起? 但我设的是单沿触发啊 而且是没有沿的时候在不断重复 楼上能否给个具体的描述? |
|
地下室#
发布于:2007-07-19 00:03
难道你意思是
这个scKeyUpMask是指示按键弹起? 也就是if里的fKeyUp = false应该为TRUE 才能正确保证弹起被响应? 我之前以为是类似SHIFT的状态记忆一类的 明天试试 顺便问问各位,我板子LAN口没做好 只能编译一次用DNW烧到SDRAM一次 而编译一次要20分钟 有没有办法只编译改动的键盘驱动、快速得到.NB0? 请发个帖子连接,不要只说一个术语名称 巨感谢 |
|
5楼#
发布于:2007-07-19 08:38
我在邮件中回复你了。
应该是一个键有两个动作,按下和弹起。如果只有按下而没有弹起的话,layout memager的auto-repeat功能就起作用了。现象就是不断重复前一个按键。只要你及时产生弹起事件,就是同一个扫描键值,但是fkeyup=true就行。 我把中断改为双边沿,前一中断keydown,后一中断keyup。 如果不修改特性和注册表,bib文件等,你可以在file view栏,项目文件夹上右键菜单第一项,build当前项目即可。一般你要Build keybd这个文件夹,会把底下的所有按键项目编译并且copy到realse文件夹。前提是选上sysgen菜单下的copy to .. after build和另外一个选项(名字不记得了,应该是下一项)。然后,在菜单栏的SYSGEN栏下的make image即可。 |
|
6楼#
发布于:2007-07-19 08:52
上面说的错了一点,应该是build os 一栏,是不是sysgen。
|
|
7楼#
发布于:2007-07-19 08:57
双边沿
那不是会出现按下不放,就疯狂重复直到松开的情况么 |
|
8楼#
发布于:2007-07-19 09:35
PB 4.2
眼睛都看大了也没找到你说那个功能…… |
|
9楼#
发布于:2007-07-19 11:23
PB50才有。
方便性PB50比4.2改进了很多!! 4。2的话还是学学命令行好一些。 |
|
10楼#
发布于:2007-07-19 17:44
引用第7楼sunignol于2007-07-19 08:57发表的 : 这才叫repeat,老兄,你先前的那个按一个键就不断repeat就是问题,改成上,下沿触发吧,区分好keydown和keyup |
|
11楼#
发布于:2007-07-28 09:48
|
|