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