智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3600|回复: 12
打印 上一主题 下一主题

求高手指点小弟的LED灯程序

[复制链接]

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
跳转到指定楼层
1#
发表于 2013-1-21 16:12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   各位高手见笑了我是刚开始学的,很多都不懂。我想了一个程序几天了,都没有能够弄出来,麻烦各位高手指点下小弟。
   主要想实现通过“按键控制流水灯的流速,同时当某一个按键按下的时候,流水灯会改变它原先的点亮顺序,向相反方向点亮。再按下另一个按钮又恢复到原先的方向。还有要求两个按钮同时按下的时候,灯全部亮。再全部按下的时候恢复到流水灯的状态。”   
  现在我的流水灯的程序是没问题的
  关键加了 按键中断的程序后流水灯就不流了,不知道为什么   
  对于按键输入中断 和 相关寄存器也不是太了解  ,望高手们指点下。
学长帮忙 指点下,这几天小弟想得都睡不着觉了。
万分感谢
万分感谢
万分感谢

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
2#
发表于 2013-1-21 16:34:25 | 只看该作者
程序发出来看看 不然不知道你哪错了
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
3#
 楼主| 发表于 2013-1-21 17:50:05 | 只看该作者
mxj1005071012 发表于 2013-1-21 16:34
程序发出来看看 不然不知道你哪错了

大哥我这个是改教程的,自己因为对中断还是一片盲区,所以在里面稍微改一下,以为能达到我要的效果,但是不行。麻烦您指导下啦。


/*---------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define LED PORTB
#define LED_dir DDRB
#define UP PTIH_PTIH0
#define DOWN PTIH_PTIH1
//#define LEFT PTIH_PTIH2  //定义左边的按钮
//#define RIGHT PTIH_PTIH3//定义右边的按钮
#define UP_dir DDRH_DDRH0
#define DOWN_dir DDRH_DDRH1
//#define LEFT_dir DDRH_DDRH2
//#define RIGHT_dir DDRH_DDRH3
unsigned char data=0x01;
unsigned char direction=1;   //设置灯亮的方向,0向左,1向右。
unsigned char time=5;        //设置灯闪的速度,默认5次/s
/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(unsigned int n) //方便改时间,改n
{
  unsigned int i,j;
  for(j=0;j<n;j++)
  for(i=0;i<60000;i++)
  ;
}
/*************************************************************/
/*                      初始化LED灯                          */
/*************************************************************/
void init_led(void)
{
  LED_dir=0xff;       //设置为输出
  LED=~data;          //点亮LED1
}
/*************************************************************/
/*                       初始化按键                          */
/*************************************************************/
void init_key(void)
{
     UP_dir =0;       //设置为输入
     DOWN_dir=0;
    // LEFT_dir=0;
     //RIGHT_dir=0;
     PPSH = 0x00;        //极性选择寄存器,选择下降沿;
     PIFH = 0x0f;     //对PIFH的每一位写1来清除标志位;
     PIEH = 0x0f;        //中断使能寄存器;
}
/*************************************************************/
/*                    按键中断函数                           */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PTH_inter(void)   //VECTOR ADDRESS 0xffcc PTH_inter (使进入到中断程序中)
{
   if(PIFH != 0)     //判断中断标志
   {
      PIFH = 0xff;     //清除中断标志
      if(UP == 0)         //按键1按下
      {
          time-=1;        //流水灯速度减慢
          if(time==0)
              time=1;
      }
      if(DOWN == 0) //down按下
      {
          time+=1;//流水灯速度加快
          if(time>10)
              time=10;
      }
      //if(LEFT == 0)
          //direction=0;
      //if(RIGHT == 0)
          //direction=1;
   }
}
#pragma CODE_SEG DEFAULT//  这句话是将接下来的代码(一般是中断函数)置于非分页区。
/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void) {
DisableInterrupts;
  init_led();
  init_key();
EnableInterrupts;

  for(;;)
  {
      delay(time);
      if(UP == 0)
      {     direction==1;
          data=data<<1;         //左移一位
          if(data==0)
              data=0x01;
      }
      if(DOWN == 0)
      {    direction==0;
          data=data>>1;         //右移一位
          if(data==0)
              data=0x80;
      }
      
      LED = ~data;
  }
}
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
4#
 楼主| 发表于 2013-1-21 17:53:48 | 只看该作者
大哥,我是想如果让你写,你会怎样写。可不可以发个相应的程序来看看,麻烦了。
回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
5#
发表于 2013-1-21 18:57:27 | 只看该作者
ccsshu 发表于 2013-1-21 17:53
大哥,我是想如果让你写,你会怎样写。可不可以发个相应的程序来看看,麻烦了。

不会吧 你的程序问题很大 中断需要大换血 我时间比较忙 我觉得你仔细改改中断里的函数吧 中断一般都是改变标志位的 你这里也需要设置 并根据情况修改标志位 主函数里也应该通过标志位改
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
6#
 楼主| 发表于 2013-1-21 19:28:55 | 只看该作者
表示不懂,可不可以稍微指点一二啊,很谢谢您的关心。
回复 支持 反对

使用道具 举报

7

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2777
威望
1405
贡献
792
兑换币
756
注册时间
2012-7-9
在线时间
290 小时
7#
发表于 2013-1-21 19:57:31 | 只看该作者
不同的按键对应不同的标志位,在中断里不同的标志位对应不同的处理。
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
8#
 楼主| 发表于 2013-1-21 20:24:19 | 只看该作者
谢谢各位,但我因为是刚学的,对于这些还不是很了解,有木有相应的例程跟讲解啊。我太笨了,麻烦各位啦。
回复 支持 反对

使用道具 举报

14

主题

369

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2881

优秀会员奖章活跃会员奖章

威望
1348
贡献
823
兑换币
493
注册时间
2012-11-13
在线时间
355 小时
9#
发表于 2013-1-21 22:16:16 | 只看该作者
不知道帮顶下
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
10#
 楼主| 发表于 2013-1-22 00:19:02 | 只看该作者
谢谢你
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 06:43 , Processed in 0.073350 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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