4619|13

8

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

大家好,有用查询方式实现S3C6410的矩阵键盘的吗,总有问题呢? [复制链接]

我就是照友坚提供的4*4查询方式实现的矩阵键盘,我的键盘响应总是有问题,有时候没有,有时候出好几次,
大家能有什么方法解决这个问题吗?

for(i=0;i<5;i++)// modi 4 as 5
                {                             
                        g_pIOPregs->GPLDAT |= ( (0x1<<0) |(0x1<<1) |(0x1<<2) |(0x1<<3) | (0x1<<4)  );
                        g_pIOPregs->GPLDAT &= ~(0x1<                         for(j=8;j<13;j++)//modi 12 as 13
                        {     
                                Sleep(5)//Sleep(10);
                                R =0xff;
                                C=  0xff;          
                                if(!(g_pIOPregs->GPKDAT &(0x1<                                 {
                                        C = i;
                                        R = j-8;       
                                        goto over_scan;
                                }
                               
                        }
                }

over_scan:   

                for(j=0;j                 {                                  
                        HandleUp_Down[j]=FALSE;
                }


                RETAILMSG(denis_keypad,(TEXT("[matrix_keyboard_thread]***  R is %x C is %x .\r\n"), R,C));

        //if(KEY_EVENT[R][C]==KEY_EVENT[0][0])
                if(( R==0) && (C==0) )                  
                {
                        Key_Press_Down[key_switch]=1;               
                        HandleUp_Down[key_switch]=TRUE;
                        SetEvent(HandleDown[key_switch]);
                }
                else
                {     
                    Key_Press_Down[key_switch]=0;       
                        HandleUp_Down[key_switch]=FALSE;
                }
                  if(KEY_EVENT[R][C]==KEY_EVENT[0][1])
                {
                        Key_Press_Down[key_light]=1;
                        HandleUp_Down[key_light]=TRUE;
                        SetEvent(HandleDown[key_light]);
                }
                else
                {
                    Key_Press_Down[key_light]=0;       
                        HandleUp_Down[key_light]=FALSE;        
                }

最新回复

MARK,学习~  详情 回复 发表于 2010-5-16 22:13
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
查询方式效率低下,为什么不用中断模式呢?
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
效率高低,

看程序,

查询也好,中断也好,符合你的整体结构就可以,

只要结构合理,

分析一下效率,改善看看
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
你是隔多久查询一次,把这个时间再调短点,然后去抖动这些没问题吗,?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
估计没有用定时器来扫描吧?开个定时器来定时扫描按键,20ms一次,就不会有问题,前提是你硬件没问题。。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
不是用定时器的方式。就是一直在等待按键的查询方式,当有键按下时查询到就去置事件,在While(1)中一直查询如果有键按下马上就检测到了,效果是有键马上打印字符,可不止一个字符输出,苦恼在这里啊,把延时消抖设短了就出好几个字符,这不知道怎么回事啊
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
帮顶下,学习学习
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
“我的键盘响应总是有问题,有时候没有,有时候出好几次”

有时候没有,是不是因为你的系统开启了其他的中断,经常性的跑去执行中断,而且其中占用很长时间?假如这个时候来了个按键,那你肯定是丢失了。

有时候出好几次,因为你的按键没消抖,当检测到了,抖动,就连续检测到几个,一般的按键消抖延时,需要10ms。

所以,我还是建议楼主,在定时器扫描按键。既不会丢失按键,因为无论什么时候,假如没有更高优先级的中断,它都会按时扫描。同时,也不用延时做消抖。无论用不用操作系统,都是这样做的,有益于整个系统的稳定和健壮。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
在WHILE(1)中都不能及时处理按键产生的事件,如果用定时器时间上也不会有多大改变啊。以前2440的按键是用中断实现的,非常好,现如今有了这么个键盘模块,不应该越来越难弄吧
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
测一下按键按下与没按下的IO口电压各为多少,如果相差<1V,中断识别就会有问题就需要更改上下拉电阻的阻值或者去抖电容的容值;
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
谢谢楼上的回答,但这个是查询方法不是中断,
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
我记得友坚的这部分代码是用
在一个线程里用WaitForSingleObject(hEvent_any, 100);
来实现扫描的,也就是说100ms进行一次键码扫描,而这个线程的优先级、时间片选都是没有设置的,所以这个你目前整个系统的运行负荷(其它线程的优先级)关系很大,还是建议楼主搞中断实现,4*4的按键可以四个中断对应一个服务线程,然后再去判断,判断是同时判断按下和抬起,这样会比较好些。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
一、没有反应的情况,这个你需要测试在按下的时候,相应GPIO的电平状态,很有可能和GPIO的上拉、下拉电阻有关。这点一定要和硬件工程师沟通好。

二、按下的时候好几次输出,这个肯定是你的逻辑处理的问题了。你用while逻辑来做,对于一次操作当做多次处理,就出现了这个效果。整理下逻辑思路吧。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 7 楼 peasant_lee 的回复:
“我的键盘响应总是有问题,有时候没有,有时候出好几次”

有时候没有,是不是因为你的系统开启了其他的中断,经常性的跑去执行中断,而且其中占用很长时间?假如这个时候来了个按键,那你肯定是丢失了。

有时候出好几次,因为你的按键没消抖,当检测到了,抖动,就连续检测到几个,一般的按键消抖延时,需要10ms。

所以,我还是建议楼主,在定时器扫描按键。既不会丢失按键,因为无论什么时候,假如没有……


MARK,学习~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表