智能车制作

标题: 求高手 [打印本页]

作者: 千虑愚翁    时间: 2012-2-5 16:28
标题: 求高手
/*---------------------------------------------------------*/
/************************************************************
刚开始学,各位见笑了       帮忙找找问题     问题还似乎挺多的

主要想实现通过“按键控制流水灯的流速”   
现在流水灯程序是没问题的
关键加了 按键中断的程序后流水灯就不流了   似乎没进for循环
按键中断没找到相关资料  相关寄存器也不是太了解  
学长帮忙看看程序  问题出在哪?  
有什么好资料麻烦发到   邮箱1047861637@qq.com
万分感谢
万分感谢
万分感谢

************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define LED PORTB                //B口
#define LED_dir DDRB  
#define UP PTIH_PTIH0             //按键  H口   上
#define DOWN PTIH_PTIH1                       //下
#define UP_dir DDRH_DDRH0
#define DOWN_dir DDRH_DDRH1
#define  BUS_CLOCK     32000000    //总线频率
#define  OSC_CLOCK     16000000    //晶振频率
unsigned char data=0x01;          //定义 流水灯 初始化

unsigned int time=20;              //时间
/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif
    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}

/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(unsigned int t)
{
  unsigned int i,j;
  for(j=0;j<t;j++)
  for(i=0;i<10000;i++)
  ;
}
/*************************************************************/
/*                       初始化按键                          */
/*************************************************************/
void init_key(void)
{
     UP_dir=0;     //设置为输入
     DOWN_dir=0;
     PPSH = 0x00;        //极性选择寄存器,选择下降沿;
     PIFH = 0x03;     //对PIFH的每一位写1来清除标志位;
     PIEH = 0x03;        //中断使能寄存器;
}
/*************************************************************/
/*                    按键中断函数                           */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PTH_inter(void)
{
   if(PIFH != 0)     //判断中断标志
   {
      PIFH = 0xff;     //清除中断标志
      if(UP == 0)         //按键UP按下
      {
        delay(1);
        if(UP == 0)
        {
            if(time<100)
                time+=5;   //流速加快
            while(UP == 0);
        }
      }
      if(DOWN == 0)
      {
        delay(1);
        if(DOWN == 0)
        {
         
            if(time> 0)
                time-=5 ;   //流速减慢
            while(DOWN == 0);
        }
      }
      
   }
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/*                          主函数                           */
/*************************************************************/
void main(void) {
DisableInterrupts;
init_key();
INIT_PLL();

  LED_dir=0xff;       //设置为输出
  LED=~data;          //点亮LED1
  
EnableInterrupts;

  for(;;)
  {
      delay(time);          //延时
      data=data<<1;         //左移一位
      if(data==0)
          data=0x01;        //for循环的流水灯正常  没问题
      LED = ~data;
  }
}


作者: wuqt    时间: 2012-2-6 13:41
中断函数怎么没有中断号??
作者: 会错意)。    时间: 2013-11-18 22:12
不懂
作者: 麦田里的守望者    时间: 2013-11-20 12:49
中断写对了吗?




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