打印
[Kinetis]

k60 矩阵键盘扫描问题

[复制链接]
2800|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
774729254|  楼主 | 2014-8-9 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uint8 KBPin[8]= {23,22,21,20,19,18,17,16};
PORTx KB_Port[8]={PORTB,PORTB,PORTB,PORTB,PORTB,PORTB,PORTB,PORTB};
void KBInit(void)
{
    uint8 i;  
    for(i = 0;i < 4;i++)//
    {
            gpio_init (KB_Port[i], KBPin[i], GPI_UP, 0);
     }
     for(i = 4;i < 8;i++)
    {
          gpio_init (KB_Port[i], KBPin[i], GPO_HDS,0);
    }
}
//============================================================================
//函数名称:KBScanN
//函数返回:多次扫描键盘得到的键值
//参数说明:重复扫描键盘的的次数(KB_count)
//功能概要:多次扫描键盘,消除"抖动"。
//============================================================================
uint8 KBScanN(uint8 KB_count)
{
    uint8 i,KB_value_last,KB_value_now;
    // 先扫描一次得到的键值,便于下面比较
    if (0 == KB_count || 1 == KB_count)
        return KBScan1();   
    KB_value_now = KB_value_last = KBScan1();   
    //以下多次扫描消除误差
    for (i=0; i<KB_count-1; i++)
    {               
        KB_value_now = KBScan1();
        if (KB_value_now == KB_value_last)
            return KB_value_now;                       //返回扫描的键值
        else
            KB_value_last = KB_value_now;
   }
    // 返回出错标志
    return 0xFF;
}

//============================================================================
//函数名称:KBDef
//函数返回:无
//参数说明:键值valve
//功能概要:键值转为定义值函数。
//============================================================================
//键盘定义表
//键盘定义表
const uint8 KBtable[] =
{
    0xEE,8,0xDE,9,0xBE,10,0x7E,11,
    0xED,5,0xDD,6,0xBD,7,0x7D,12,
    0xEB,2,0xDB,3,0xBB,4,0x7B,13,
    0xE7,0,0xD7,14,0xB7,1,0x77,15,
    0x00
};
uint8 KBDef(uint8 valve)
{
    uint8 KeyPress;                       //键定义值
    uint8 i;
    i = 0;
    KeyPress = 0xff;
    while (KBtable[i] != 0x00)         //在键盘定义表中搜索欲转换的键值,直至表尾
    {
        if(KBtable[i] == valve)        //在表中找到相应的键值
        {
            KeyPress = KBtable[i+1];   //取出对应的键定义值
            break;
        }
        i += 2;                                        //指向下一个键值,继续判断
    }
    return KeyPress;
}
//============================================================================
//函数名称:KBScan1
//函数返回:扫描到的键值
//参数说明:键值valve
//功能概要:扫描1次4*4键盘,返回扫描到的键值,若无按键,返回0xff 。
//============================================================================
uint8 KBScan1(void)
{
    uint8 i,j,tmp=0xFF;
    uint8 k = 0;//
    KBInit();                //键盘初始化
    for (i = 0; i <= 3; i++) //最多将扫描4根行线
    {
        if((GPIO_PDIR_REG(GPIOx[KB_Port[i]]) & (1<<KBPin[i])) == 0)//GPIO_PDIR数据端口输入寄存器
        {
                for(j = 4;j <8;j++)
                {
                        gpio_set(KB_Port[j],KBPin[j],1);                    
                        for(k = 0;k <100;k++)
                        {
                            asm("NOP");
                        }
                        if((GPIO_PDIR_REG(GPIOx[KB_Port[i]]) & (1<<KBPin[i])) != 0)
                        {
                            if(i == 0)
                            {
                                    if(j == 4)
                                            tmp = 0xEE;
                                    else if(j == 5)
                                            tmp = 0xDE;
                                    else if(j == 6)
                                            tmp = 0xBE;
                                    else if(j == 7)
                                            tmp = 0x7E;                                                       
                            }
                            else if(i == 1)
                            {
                                    if(j == 4)
                                            tmp = 0xED;
                                    else if(j == 5)
                                            tmp = 0xDD;
                                    else if(j == 6)
                                            tmp = 0xBD;
                                    else if(j == 7)
                                            tmp = 0x7D;                                    
                            }
                            else if(i == 2)
                            {
                                    if(j == 4)
                                            tmp = 0xEB;
                                    else if(j == 5)
                                            tmp = 0xDB;
                                    else if(j == 6)
                                            tmp = 0xBB;
                                    else if(j == 7)
                                            tmp = 0x7B;                                    
                            }
                            else if(i == 3)
                            {
                                    if(j == 4)
                                            tmp = 0xE7;
                                    else if(j == 5)
                                            tmp = 0xD7;
                                    else if(j == 6)
                                            tmp = 0xB7;
                                    else if(j == 7)
                                            tmp = 0x77;                                    
                            }
                            else
                                    tmp = 0x00;
                            break;
                        }                      
                        gpio_set(KB_Port[j],KBPin[j],0);
                }
        }
    }
    for(k=0;k<=80;k++)asm("NOP");
    return (tmp);
}
以上是矩阵键盘扫描程序,现在我的问题是temp=0x7d.0x7b.0x77对应的3个键,当按下时,时而有效,时而无效,而其他所有按键都很灵敏,有人遇到过类似问题吗?请指教

相关帖子

沙发
攻城狮| | 2014-8-11 09:42 | 只看该作者
楼主,
没有人会细心看你的代码的,网友只会针对你的软件设计思想,提出针对性的解决意见的。
所以你可以最好介绍一下你的设计思想,不要把满屏的代码贴出来。

使用特权

评论回复
板凳
FSL_TICS_Jeremy| | 2014-8-11 14:36 | 只看该作者
你好,楼主!
请简单介绍一下程序设计的思想,单看代码我不好提供意见,2楼说的很对!

使用特权

评论回复
地板
jd972594| | 2014-8-12 09:20 | 只看该作者
果然这么多代码看的有点摸不着头脑,你这代码看上去好累啊就不能换成switch case形式吗?
试一下这样修改后,temp=0x7d.0x7b.0x77对应的3个键还会那样吗?
                            else if(i == 1)
                            {
                                    if(j == 7)
                                            tmp = 0x7D;
  
                                    else if(j == 5)
                                            tmp = 0xDD;
                                    else if(j == 6)
                                            tmp = 0xBD;
                                    else if(j == 4)
                                            tmp = 0xED;
                                 
                            }
                            else if(i == 2)
                            {
                                    if(j == 7)
                                            tmp = 0x7B;  

                                    else if(j == 5)
                                            tmp = 0xDB;
                                    else if(j == 6)
                                            tmp = 0xBB;
                                    else if(j == 4)
                                            tmp = 0xEB;   
                                 
                            }
                            else if(i == 3)
                            {
                                    if(j == 7)
                                            tmp = 0x77;
   
                                    else if(j == 5)
                                            tmp = 0xD7;
                                    else if(j == 6)
                                            tmp = 0xB7;
                                    else if(j == 4)
                                            tmp = 0xE7;
                                 
                            }

使用特权

评论回复
5
774729254|  楼主 | 2014-8-13 09:31 | 只看该作者
攻城狮 发表于 2014-8-11 09:42
楼主,
没有人会细心看你的代码的,网友只会针对你的软件设计思想,提出针对性的解决意见的。
所以你可以最 ...

你好,程序所用的就是矩阵键盘的思想,设置行为输入,列为输出,只是有一列常常不能被正确识别,有时很灵敏,有时需要按很多次才被识别,问题基本就是这样,再次感谢你

使用特权

评论回复
6
774729254|  楼主 | 2014-8-13 09:31 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-8-11 14:36
你好,楼主!
请简单介绍一下程序设计的思想,单看代码我不好提供意见,2楼说的很对! ...

你好,程序所用的就是矩阵键盘的思想,设置行为输入,列为输出,只是有一列常常不能被正确识别,有时很灵敏,有时需要按很多次才被识别,问题基本就是这样,再次感谢你

使用特权

评论回复
7
774729254|  楼主 | 2014-8-13 09:33 | 只看该作者
jd972594 发表于 2014-8-12 09:20
果然这么多代码看的有点摸不着头脑,你这代码看上去好累啊就不能换成switch case形式吗?
试一下这样修改后 ...

好的,请问这样改的原理是啥,与扫描顺序有关还是?

使用特权

评论回复
8
FSL_TICS_Jeremy| | 2014-8-13 14:12 | 只看该作者
774729254 发表于 2014-8-13 09:31
你好,程序所用的就是矩阵键盘的思想,设置行为输入,列为输出,只是有一列常常不能被正确识别,有时很灵 ...

想你这样的问题,我估计就不单单是程序代码的问题啊,你有没有用示波器看过按键按下时的波形变化,看看有问题的几个按键与正常的几个波形有什么区别

使用特权

评论回复
9
774729254|  楼主 | 2014-8-14 09:06 | 只看该作者
jd972594 发表于 2014-8-12 09:20
果然这么多代码看的有点摸不着头脑,你这代码看上去好累啊就不能换成switch case形式吗?
试一下这样修改后 ...

你好,已经按照你的思路进行修改,还是不行啊,问题会出在硬件吗

使用特权

评论回复
10
攻城狮| | 2014-8-14 09:44 | 只看该作者
774729254 发表于 2014-8-13 09:31
你好,程序所用的就是矩阵键盘的思想,设置行为输入,列为输出,只是有一列常常不能被正确识别,有时很灵 ...

既然只有一列有问题,而且不是功能无法实现,而是实现过程有些怪的话,我想你有必要检查下硬件啊。
可以参考8楼斑竹的意见试试。

使用特权

评论回复
11
774729254|  楼主 | 2014-8-14 12:29 | 只看该作者
现在问题解决了,谢谢楼上的几位,我的问题不管那一列作为扫描的最后一列输出,结果都有问题,现在我用的是最笨的方法,做成4×5的键盘,输出5列,最后一列空扫不做任何操作,这样的出现的问题就逃避掉了,哈哈

使用特权

评论回复
12
攻城狮| | 2014-8-15 09:56 | 只看该作者
774729254 发表于 2014-8-14 12:29
现在问题解决了,谢谢楼上的几位,我的问题不管那一列作为扫描的最后一列输出,结果都有问题,现在我用的是 ...

恩,看看软件扫描到最后一列是不是有一个共性问题啊,虽然现在不影响应用,但还是可以要找出原因啊

使用特权

评论回复
13
jd972594| | 2014-8-26 09:20 | 只看该作者
774729254 发表于 2014-8-13 09:33
好的,请问这样改的原理是啥,与扫描顺序有关还是?

就是怀疑你的程序写的有问题,所以让你这么修改一下的。
因为键盘硬件不复杂,一般不会出现大问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

299

帖子

1

粉丝