sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:2188回复:11

键盘驱动修改大致成功,还有点小问题

楼主#
更多 发布于:2007-07-18 19:05
键盘是我自己设计的中断通知+并行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;
}
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-18 19:08
我估计是要在   if (scInProgress == scPrevious) {
        //    mdd handles auto-repeat so ignore auto-repeats from keybd
    }
里面加什么东西,不知道对不对……
仿佛也不该啊,中断一次才会调用一次这整个函数
麻烦大家告诉我下还有哪要改
我不是学软件的,看C比看英文难多了,到这已经基本要崩溃了……
wenzai
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2011-03-04
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望424点
  • 贡献值0点
  • 好评度309点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-18 20:12
缺少按键抬起事件,就是
//      if (ui8ScanCode & scKeyUpMask) {                //别人建议fKeyUp始终为F
//            fKeyUp = false;
//            scInProgress &= ~scKeyUpMask;
//        } else {
            fKeyUp = FALSE;
//        }
这部分

在驱动中,第一次发的是按键按下值
当按键抬起时,再发一起按键抬起值
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-18 23:56
抬起
针对我自己做的小板
是中断按钮弹起?
但我设的是单沿触发啊
而且是没有沿的时候在不断重复
楼上能否给个具体的描述?
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-19 00:03
难道你意思是
这个scKeyUpMask是指示按键弹起?
也就是if里的fKeyUp = false应该为TRUE
才能正确保证弹起被响应?
我之前以为是类似SHIFT的状态记忆一类的
明天试试
顺便问问各位,我板子LAN口没做好
只能编译一次用DNW烧到SDRAM一次
而编译一次要20分钟
有没有办法只编译改动的键盘驱动、快速得到.NB0?
请发个帖子连接,不要只说一个术语名称
巨感谢
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
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即可。
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-19 08:52
上面说的错了一点,应该是build os 一栏,是不是sysgen。
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-07-19 08:57
双边沿
那不是会出现按下不放,就疯狂重复直到松开的情况么
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-07-19 09:35
PB 4.2
眼睛都看大了也没找到你说那个功能……
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-07-19 11:23
PB50才有。
方便性PB50比4.2改进了很多!!
4。2的话还是学学命令行好一些。
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-07-19 17:44
引用第7楼sunignol于2007-07-19 08:57发表的  :
双边沿
那不是会出现按下不放,就疯狂重复直到松开的情况么



这才叫repeat,老兄,你先前的那个按一个键就不断repeat就是问题,改成上,下沿触发吧,区分好keydown和keyup
anchor720
驱动牛犊
驱动牛犊
  • 注册日期2007-07-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-07-28 09:48
楼主的贴子不错,一直都是与时俱进。
我也在做wince的键盘驱动
MSN:liyong983@163.com
希望和大家多多交流
游客

返回顶部