智能车制作

标题: 用按键控制LED灯的程序(有问题) [打印本页]

作者: 改变ING    时间: 2014-2-25 21:08
标题: 用按键控制LED灯的程序(有问题)
void main(void) {
     unsigned char k;
      k=0;
     DDRH=0x0;    //定义H口的数据方向寄存器为输入   
     PERH_PERH0=1;
     PERH_PERH1=1;        //上拉电阻使能
  if(PTH_PTH0==0) {    //PH0为低电平时表示S1被按下
    delay(10);   //延时10ms   //消抖
    if(PTH_PTH0==0) {
      k=1;
    }
  }
  else if(PTH_PTH1==0) { //PH1为低电平时表示S2被按下
    delay(10);
    if(PTH_PTH1==0) {    //消抖
      k=2;
    }
  }

      if(k==1){

         PORTB=0xFF; //S1键被按下时LED灯以此种方式亮



      } else if(k==2){

         PORTB=0x1;   //S2键被按下时LED灯以此种方式亮



      }
        EnableInterrupts;


  for(;;) {
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
        各位高手以上是我自己写得程序(延时程序未加入),目的是读取S1,S2的按键状态,并使LED在不同键按下时能有不同的显示状态,可是下到单片机以后无论怎么按键都没有任何反应。我的单片机型号是mc9s12dg128.请各位帮我看看是什么原因,谢谢!






作者: 改变ING    时间: 2014-2-26 22:06
找到原因了,第一个问题是没有将B口的数据方向寄存器定为输出,第二个问题是这个程序查询函数只能查询一次,因此以后再按键就没有反应了,应该加入循环。
作者: 若要走    时间: 2014-7-11 19:39

作者: Single_Sunshine    时间: 2015-1-19 20:24
程序不会等着你来按键的
作者: 我快乐    时间: 2015-1-22 10:09
每次按键后要加while(!PTH_PTH)
如:  if(PTH_PTH0==0) {    //PH0为低电平时表示S1被按下
    delay(10);   //延时10ms   //消抖
    if(PTH_PTH0==0) {
      k=1;
     while(!PTH_PTH0);//等待按键释放
    }
  }
  else if(PTH_PTH1==0) { //PH1为低电平时表示S2被按下
    delay(10);
    if(PTH_PTH1==0) {    //消抖
      k=2;
     while(!PTH_PTH1);//等待按键释放
    }
  }
作者: 我快乐    时间: 2015-1-22 10:09
还要放在while大循环里
作者: WG1314    时间: 2015-6-2 11:25
上楼正解,。几个月前我在参加本校的单片机大赛时碰到的设计LED灯问题时也是没有加while释放语句导致我我和冠军失之交臂。还好团体赛冠军




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2