智能车制作

标题: 求高手们看下程序 [打印本页]

作者: ccsshu    时间: 2013-1-23 10:21
标题: 求高手们看下程序
小弟我是刚学的,卡在了输入中断这一部分几天了,求高手们指导下。我这个程序是想实现按键中断的,功用有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 */
}


作者: 爱你,就一句话    时间: 2013-1-23 10:39
循环模块有问题,for循环语句里面没有判断退出语句,导致循环中的相应代码不断重复执行
作者: ccsshu    时间: 2013-1-23 10:45
师兄,那是不是在每一个if 后面都加一个break啊

作者: ccsshu    时间: 2013-1-23 11:07
不行啊,加了break;之后,很快就跳出了程序,而且还有错误
说remove deep code
作者: qurrer    时间: 2013-1-23 13:41

作者: 773655190    时间: 2013-3-11 22:58
那个我想说你按下up对down无影响,如果不是全亮,说明up或down必为1,一个是1一个是0,按照你的程序,当然是左移一位,右移一位了呗!
作者: 773655190    时间: 2013-3-11 23:01
另外,你何必要让它死循环呢,可以再加个东西,比如说up与down都是1的时候跳出来。这个程序问题太大,再重新写吧!同努力!
作者: ccsshu    时间: 2013-3-12 15:19
恩,谢谢




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