智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2538|回复: 5
打印 上一主题 下一主题

求高手们看下程序

[复制链接]

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
跳转到指定楼层
#
发表于 2013-1-23 10:21:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
小弟我是刚学的,卡在了输入中断这一部分几天了,求高手们指导下。我这个程序是想实现按键中断的,功用有1、按下down键,LED流水灯往右移;2、按下up键LED流水灯往左移;3、同时按下两键则灯全亮,再按下则又恢复LED流水灯。小弟这个程序现在是LED流水灯灯跑没问题,按键也能实现相应的功用。但不知为什么跑得很奇怪,例如我按下up键,灯会往左移一位,再往右移一位,接着又往左移一位,如此循环,不知为什么。求高手们帮忙看看,小弟万分感谢!


/*---------------------------------------------------------*/
#include <hidef.h>           /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define LED PORTB         //定义LED灯的引脚
#define LED_dir DDRB      //定义LED灯对应引脚的方向寄存器
#define EN_up PTT_PTT0    //定义按键EN_up引脚
#define EN_down  PTT_PTT1  //定义按键EN_down引脚
#define EN_dir  DDRT  //定义按键EN对应引脚的方向寄存器
unsigned char data=0x01,EN_up1=1,EN_down1=1;     //定义一个8位的字符型变量  跟八个LED灯对应
/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(void)
{
  unsigned int i,j;
  for(j=0;j<500;j++)
  for(i=0;i<1500;i++)
  ;
}
/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void init_ECT(void)    //初始化输入模块 函数
{  
  EN_dir = 0x00;   // 设置按键为输入
  PERT = 0xff;     // 设置对应引脚允许内部上、下拉
  PPST = 0X00;     // 设置对应引脚内部上拉
  
  TIOS_IOS0 = 0;   // 设置PT0为输入捕捉
  TIOS_IOS1 = 0;   // 设置PT1为输入捕捉
  TCTL4_EDG0A=0;
  TCTL4_EDG0B=1; //  (PT0) 下降沿捕捉
  TCTL4_EDG1A=0;
  TCTL4_EDG1B=1; //  (PT1) 下降沿捕捉
  TIE_C0I = 1;   //中断请求允许
  TIE_C1I = 1;   //中断请求允许
  TSCR1_TEN = 1;    // 定时器使能位.
}
/*************************************************************/
/*                      输入捕捉中断                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED    // 中断函数置于非分页区内
interrupt void Int_ico0(void)  //T0
{
    TFLG1_C0F = 1; //中断的标志位清零!
    EN_up1++;
     
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void Int_ico1(void)  //T1
{
   TFLG1_C1F = 1; //中断的标志位清零!
   EN_down1++;
  
}

void main(void)
{
DisableInterrupts;
  init_ECT();       //初始化输入模块
  LED_dir=0xff;     //定义LED方向
  LED=data;       //  对LED赋初值
EnableInterrupts;  //允许可屏蔽中断
  for(;;)
  {
     if(EN_down==0&&EN_up==0)
    {
      delay();
       data=0xff;
       LED=data;
     }
  
  
     if(EN_down1%2==1)      //判断方向
     {
        delay();    //延时消抖
        if(data!=0x80)
         {
          data=data<<1;         //左移一位
        
          LED = ~data;
         }
       }  
      if(EN_down1%2==0)      //判断方向
     {
        delay();    //延时消抖
        if(data!=0x01)
         {
          data=data>>1;         //右移一位
        
          LED = ~data;
         }
       }
      
   
   
    if(EN_up1%2==1)      //判断方向
     {                                               }
        delay();    //延时消抖
        if(data!=0x80)
         {
          data=data<<1;         //左移一位
        
          LED = ~data;
         }
      if(EN_up1%2==0)
       {
        delay();
        if(data!=0x01)
          {
          data=data>>1;         //右移一位
          LED = ~data;
          }         
       }
      
      

  } /* loop forever */
  /* please make sure that you never leave main */
}

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
5#
 楼主| 发表于 2013-3-12 15:19:13 | 只看该作者
恩,谢谢
回复 支持 反对

使用道具 举报

2

主题

40

帖子

0

精华

高级会员

Rank: 4

积分
508
威望
290
贡献
146
兑换币
103
注册时间
2012-9-1
在线时间
36 小时
4#
发表于 2013-3-11 23:01:23 | 只看该作者
另外,你何必要让它死循环呢,可以再加个东西,比如说up与down都是1的时候跳出来。这个程序问题太大,再重新写吧!同努力!
回复 支持 反对

使用道具 举报

2

主题

40

帖子

0

精华

高级会员

Rank: 4

积分
508
威望
290
贡献
146
兑换币
103
注册时间
2012-9-1
在线时间
36 小时
3#
发表于 2013-3-11 22:58:40 | 只看该作者
那个我想说你按下up对down无影响,如果不是全亮,说明up或down必为1,一个是1一个是0,按照你的程序,当然是左移一位,右移一位了呗!
回复 支持 反对

使用道具 举报

6

主题

782

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4804
威望
2424
贡献
1324
兑换币
1685
注册时间
2011-11-2
在线时间
528 小时
2#
发表于 2013-1-23 13:41:47 | 只看该作者
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
1#
 楼主| 发表于 2013-1-23 11:07:38 | 只看该作者
不行啊,加了break;之后,很快就跳出了程序,而且还有错误
说remove deep code
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
#
 楼主| 发表于 2013-1-23 10:45:23 | 只看该作者
师兄,那是不是在每一个if 后面都加一个break啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
26
威望
24
贡献
2
兑换币
3
注册时间
2013-1-23
在线时间
0 小时
毕业学校
广州中医药大学
推荐
发表于 2013-1-23 10:39:28 | 只看该作者
循环模块有问题,for循环语句里面没有判断退出语句,导致循环中的相应代码不断重复执行
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 17:37 , Processed in 0.173672 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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