wb5846410 发表于 2008-12-3 21:18:35

AVR 独立按键问题【恢复】

按照以前学习51时候的思路,写了一个独立按键的测试程序,发现PIND.6按键按下后,有时PA口输出没有反应。

用PROTEUS仿真和在试验板测试,都是这个现象。怀疑按键问题,但用万用表测量PD.6引脚的电压,每次按键按下都变为0,

说明按键没问题。请各位高手指点啊

#include <mega16.h>

#include <delay.h>

unsigned char da;

void main(void)

{

PORTA=0x00;

DDRA=0xff;   //设置输出

PORTD=0xff;

DDRD=0x00;  //设置为输入,



while (1)

   {

      if(PIND.6==0)   //如果PIND.6按键按下

         {

           delay_ms(10); //10ms的消抖时间

           if(PIND.6==0)//确认PIND.6按键按下

             { da++; 

               PORTA=da;  //通过PA口的变化,检测按键是否按下

                }

           }

        while(PIND.6==0);  //等待按键松开

            } ;

      }

本贴被 wb5846410 编辑过,最后修改时间:2008-12-03,21:56:44.

Gorgon_Meducer 发表于 2008-12-4 07:59:40

可能出现按键抖动的情况。

当你按下一个按钮的时候,程序满足第一个if,但是由于抖动的出现,有一定几率

当10ms延时以后,读取到的却不是低电平,这个时候,就无法满足地二个if语句,

而直接进入while(PIND.6==0);的循环中了。是有可能存在这种情况的。

wb5846410 发表于 2008-12-3 23:04:21

谢谢。 调试程序发现了一点问题、

while(PIND.6==0);  //等待按键松开 

 这里没有放置到 if 判读语句里面

NE5532 发表于 2008-12-3 21:42:34

先说方法,调试中需要有“观察点”。怀疑PA输出有问题,就要确认PA输出是否正确,否则你就没有地方可以观察程序的运行情况了。你可以通过写固定值的方式来验证PA输出是否正常,再往下做。推荐“脱离仿真器玩单片机”一文,到我博客下载。
页: [1]
查看完整版本: AVR 独立按键问题【恢复】