免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liutaolinux
打印 上一主题 下一主题

高手们!帮忙看一下!矩阵键盘扫描,程序! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-11-30 20:02 |只看该作者
回复 9# T-Bagwell


    我只想知道 扫描 怎么做!来确定键值!input类型设备我还是比较熟悉的!

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
12 [报告]
发表于 2011-11-30 20:07 |只看该作者
You can keydown a key , and get the value, is that right?

论坛徽章:
0
13 [报告]
发表于 2011-12-01 10:06 |只看该作者
回复 12# T-Bagwell


    是的,但是反转法,我已经转蒙了!能给我重新讲讲吗!

论坛徽章:
0
14 [报告]
发表于 2011-12-01 10:12 |只看该作者
{:3_198:} 回复 12# T-Bagwell


    我目前只是按键有中断响应!进入中断函数!但是扫描,确定不了是哪个按键!

论坛徽章:
0
15 [报告]
发表于 2011-12-01 11:14 |只看该作者
矩阵按键一般都不需要中断的吧,

难道不是直接检测电平吗?

比如gpio口的4*4键盘,发现一个1~4有一个点平为0,然后查看5~8中那个为0,从而确定是哪个按键。


莫非现在按键都要中断来响应了?

论坛徽章:
0
16 [报告]
发表于 2011-12-01 11:17 |只看该作者
回复 15# any_wind


    不需要中断,但是扫描函数需要开启吧,在中断中开启,我的意思是每个按键都能开启扫描函数,但是我确定不了是哪个按键!
   请教了!

论坛徽章:
0
17 [报告]
发表于 2011-12-01 11:21 |只看该作者
回复 16# liutaolinux


    扫描函数一直开着的吧,检测电平,有电平变化了确定是哪个按键

论坛徽章:
0
18 [报告]
发表于 2011-12-01 13:04 |只看该作者
回复 17# any_wind


    我写的是6410系统的内核驱动模块,加的扫描,怎么能一直开着!

论坛徽章:
0
19 [报告]
发表于 2011-12-01 18:53 |只看该作者
static void Scan_Keyboard(void)
{
        unsigned int IOValue = 0;
        unsigned int temp = 0;
        int i;
       
        //temp = readl(S3C64XX_GPNDAT);
        temp |= 0xffff;
        temp &=        0xfff8;
        writel(temp,S3C64XX_GPNDAT);
       
        Port_Init();/*012 output 4 5 6 9 是input*/

        IOValue = readl(S3C64XX_GPNDAT);
        //printk("1...IOVAlue = %x...\n",IOValue);
       
        if((IOValue & (1 << 4)) == 0)
        {
                COLVAL = 1;       
        }
        else if((IOValue & (1 << 5)) == 0)
        {
                COLVAL = 2;               
        }
        else if((IOValue & (1 << 6)) == 0)
        {
                COLVAL = 3;       
        }
        else if((IOValue & (1 << 9)) == 0)
        {
                COLVAL = 4;       
        }
       

        for (i = 0; i<100;i++){}  //延时一小下  再反转
                //反转
               
        //temp = readl(S3C64XX_GPNDAT);
        temp |= 0xffff;
        temp &= 0xfd8f;
        writel(temp,S3C64XX_GPNDAT);

               
        port_init();/*012是input 4 5 6 9是output*/
       
       
        if((IOValue & (1 << 0)) == 0)
        {
                ROWVAL = 1;
        }
        else if((IOValue & (1 << 1)) == 0)
        {
                ROWVAL = 2;
        }
        else if((IOValue & (1 << 2))        == 0)
        {
                ROWVAL = 3;       
        }


}
这是最后的扫描函数 测试 有BUG  多次按键得到列值有时候不对!请问为什么!

论坛徽章:
0
20 [报告]
发表于 2011-12-02 12:27 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP