智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 12970|回复: 6
打印 上一主题 下一主题

用按键控制LED灯的程序(有问题)

[复制链接]

2

主题

7

帖子

0

精华

注册会员

Rank: 2

积分
95
威望
59
贡献
20
兑换币
23
注册时间
2014-2-22
在线时间
8 小时
毕业学校
上海交通大学
跳转到指定楼层
1#
发表于 2014-2-25 21:08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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.请各位帮我看看是什么原因,谢谢!





回复

使用道具 举报

2

主题

7

帖子

0

精华

注册会员

Rank: 2

积分
95
威望
59
贡献
20
兑换币
23
注册时间
2014-2-22
在线时间
8 小时
毕业学校
上海交通大学
2#
 楼主| 发表于 2014-2-26 22:06:31 | 只看该作者
找到原因了,第一个问题是没有将B口的数据方向寄存器定为输出,第二个问题是这个程序查询函数只能查询一次,因此以后再按键就没有反应了,应该加入循环。
回复 支持 反对

使用道具 举报

6

主题

1251

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
14709

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章资源大师奖章

QQ
威望
6641
贡献
5456
兑换币
1645
注册时间
2011-2-22
在线时间
1306 小时
3#
发表于 2014-7-11 19:39:22 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
QQ
威望
275
贡献
106
兑换币
76
注册时间
2014-11-20
在线时间
22 小时
毕业学校
重庆大学
4#
发表于 2015-1-19 20:24:37 | 只看该作者
程序不会等着你来按键的
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

高级会员

Rank: 4

积分
501
威望
257
贡献
146
兑换币
160
注册时间
2013-11-8
在线时间
49 小时
5#
发表于 2015-1-22 10:09:05 | 只看该作者
每次按键后要加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);//等待按键释放
    }
  }
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

高级会员

Rank: 4

积分
501
威望
257
贡献
146
兑换币
160
注册时间
2013-11-8
在线时间
49 小时
6#
发表于 2015-1-22 10:09:59 | 只看该作者
还要放在while大循环里
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
45
威望
34
贡献
7
兑换币
10
注册时间
2015-5-27
在线时间
2 小时
毕业学校
常州信息职业技术学院
7#
发表于 2015-6-2 11:25:33 | 只看该作者
上楼正解,。几个月前我在参加本校的单片机大赛时碰到的设计LED灯问题时也是没有加while释放语句导致我我和冠军失之交臂。还好团体赛冠军
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 15:35 , Processed in 0.070350 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表