[讨论] 仿真扫描3*3矩阵查表按键值正确,全速运行后不对

szkenvin   2015-9-29 17:39 楼主
各位好,本人使用Atmel AVR mega32单片机遇到以下问题,请指教。

1.实现扫描3*3矩阵按键,先扫描后查表得到按键值,分别按9个按键用仿真跑得到按键正确,但全速运行不正确,为什么?
2.代码:
         while(1)
         {

            KeyPadCheck();
         }

void KeyPadCheck(void)
{
   for (Row = 1; Row < 4; Row++)
   {
       PORTD &= ~(1 << (4 + Row));  
       delay_ms(10);

       if ((PIND & 0x1C) != 0x1C)  
       {
            for (Col = 0; Col < 3; Col++) // 行
            {
                     u8ColMask = (1 << (2 + Col));
                     delay_ms(20);
                     if ((PIND & u8ColMask) == 0x00)
                      {
                           u8KeyNum = KeyMap[Row + Col*3];
                      }
           }
       }
   }


}

回复评论 (5)

1可能是延时问题,仿真时你可能有暂停或者单步操作,变相的增加了延时时间,仿真时的运行频率可能与全速时的频率不同。
2硬件问题,可能按键抖动造成的误触发,在仿真时由于单步没有体现。
只能给点意见,具体问题还要反复调试。
点赞  2015-9-30 09:03
不要在循环中延时,你算算这样执行一次需要多少时间?防抖处理是在循环外做的。 通常按键判断在定时器中断里,每20ms一次。在中断里循环中判断有没有键被按下,下一次中断在和上一次的结果进行比较,仍然按下的就可以认为是真正按下了。 本帖最后由 dcexpert 于 2015-9-30 09:27 编辑
点赞  2015-9-30 09:24
正如楼上所言,看看硬件是否正确。 电平能否正确变化。 运行时,增加延时,能否正确得到按键的状态。
点赞  2015-10-6 14:06
硬件电平变化测试过没有问题的,问题锁定在这里,最开始默认用内部1M晶振上面代码检查按键使用正常,有个问题是Sci通信收发数据不对(可能是晶振误差率较大),然后熔丝设置用外部7.3727M,通信收发正常了,结果:按键检查(键值)错误或没反应,这是前后更改,各位是否有好建议??
点赞  2015-10-12 11:16
断电放在查表后仿真得到按键值正常,但全速运行后显示按键错误或没反应啊,各位是否有建议?谢谢
点赞  2015-10-12 11:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复