智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2846|回复: 1
打印 上一主题 下一主题

[单片机] interrupt void scan(void) 为什么没有声明 就能直接引用中断?

[复制链接]

1

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
28
威望
26
贡献
2
兑换币
2
注册时间
2015-5-7
在线时间
0 小时
毕业学校
WuHan University of Technology
跳转到指定楼层
1#
发表于 2015-5-7 14:55:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
interrupt void scan(void) 为什么没有声明  就能直接引用中断?


#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define CONT1 PORTK_PK3
#define CONT2 PORTK_PK2
#define CONT3 PORTK_PK1
#define CONT4 PORTK_PK0
#define CONT1_dir DDRK_DDRK3
#define CONT2_dir DDRK_DDRK2
#define CONT3_dir DDRK_DDRK1
#define CONT4_dir DDRK_DDRK0
#define DATA PTP
#define DATA_dir DDRP
#define KEY1 PTIH_PTIH3                  
#define KEY1_dir DDRH_DDRH3

#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUZZ PORTK_PK5
#define BUZZ_dir DDRK_DDRK5

#define  BUS_CLOCK                   32000000           //总线频率
#define  OSC_CLOCK                   16000000           //晶振频率

byte data1 = 0;
byte data2 = 10;
byte data3 = 0;
byte data4 = 0;
byte single = 1;
unsigned char fen=99,miao=0;
unsigned char statesingle = 0;   //0为等待,1为开始计时,2计时时间到
unsigned int temp;
unsigned int cycle=0;


byte shuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,       //0~9对应的段码
                0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};      //0~9后加小数点对应的段码

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
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×(SYNDIV+1)/(REFDIV+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
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xff;      //指定所有通道为输出比较方式
  TCTL1 = 0x00;            // 后四个通道设置为定时器与输出引脚断开
  TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  TIE   = 0x01;     // 允许通道0定时中断
  TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  TFLG1 = 0xff;            // 清除各IC/OC中断标志位
  TFLG2 = 0xff;     // 清除自由定时器中断标志位
}

/*************************************************************/
/*                      初始化端口                           */
/*************************************************************/
void INIT_port(void)
{
  CONT1_dir = 1;               //DDRK3
  CONT2_dir = 1;
  CONT3_dir = 1;
  CONT4_dir = 1;
  CONT1 = 0;
  CONT2 = 0;                 //PORTK
  CONT3 = 0;
  CONT4 = 0;
  DATA_dir = 0xff;
  DATA = 0x00;               //PTP连接数码管
}

/*************************************************************/
/*                      初始化按键                           */
/*************************************************************/
void INIT_KEY(void)
{
    KEY1_dir=0;            //PH3
    PPSH = 0x00;                      //极性选择寄存器,选择下降沿;
    PIFH = 0xFF;                                        //对PIFH的每一位写1来清除标志位;
    PIEH = 0x08;                      //中断使能寄存器;
}

/*************************************************************/
/*                     PIT模块初始化函数                     */
/*************************************************************/
void init_PIT(){
PITMTLD0=249;     //为0通道8位计数器赋值
PITLD0=63999;     //为0通道16位计数器赋值   //(249+1)*(63999+1)=16000000个总线周期=0.5秒
PITMUX_PMUX0=0;   //第0通道使用微计数器0
PITCFLMT=0X80;    //使能周期中断定时器
}


/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(void)
{
unsigned int i,j;
for(j=0;j<200;j++)
for(i=0;i<60000;i++);
}

/*************************************************************/
/*                      中断扫描函数                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void scan(void)
{
  if(TFLG1_C0F == 1)
  {
    TFLG1_C0F = 1;
    TC0 = TCNT + 1250; //设置输出比较时间为5ms
  }
  switch(single)
  {
    case 1:
      CONT1 = 1;               //CONT1 PORTK_PK3
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 0;
      if(data1==0)
        DATA=0;                //DATA PTP
      else
        DATA=shuma[data1];
      break;

    case 2:
      CONT1 = 0;
      CONT2 = 1;
      CONT3 = 0;
      CONT4 = 0;
      DATA=shuma[data2];
      break;

    case 3:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 1;
      CONT4 = 0;
      DATA=shuma[data3];
      break;

    case 4:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 1;
      DATA=shuma[data4];
      break;

    default:
      break;
  }

  single +=1;
  if(single == 5) single = 1;
}

/*************************************************************/
/*                      按键中断函数                         */
/*************************************************************/
interrupt void PTH_inter(void)
{
   if(PIFH != 0)     //判断中断标志
   {
      PIFH = 0xff;     //清除中断标志
      if(KEY1 == 0)         //按键1按下
      {
           if(statesingle==0)
           {
              statesingle=1;
              PITCE_PCE0=1;     //PIT第0通道计数器工作
              PITINTE_PINTE0=1; //PIT0通道定时器定时中断被使能
           }
      }
   }
}

/*************************************************************/
/*                      计时中断函数                         */
/*************************************************************/
interrupt void PIT_INTER(void)
{
  if(PITTF_PTF0 == 1)
    PITTF_PTF0 = 1;    //清除标志位
  cycle+=1;
  if(cycle>1)
  {
      cycle=0;
      if(miao==0)
      {
          fen-=1;
          miao=59;
      }
      else
          miao-=1;
      data1=fen/10;           //分的十位数
      data2=fen%10;            //分的个位数
      data2=data2+10;       //加小数点小数点跟在分钟个位数
      data3=miao/10;         //秒的十位数
      data4=miao%10;           //秒的个位数
      if(fen==0&&miao==0)
      {
          PITCE_PCE0=0;     //禁止PIT第0通道计数器工作
          PITINTE_PINTE0=0; //PIT0通道定时器定时中断被禁止
          statesingle=2;
      }

  }

}
#pragma CODE_SEG DEFAULT

/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  INIT_port();
  INIT_KEY();
  init_PIT();
  LEDCPU_dir=1;         //LEDCPU PORTK_PK4  output
  LEDCPU=0;
  BUZZ_dir=1;
  BUZZ=0;                  //ring
  EnableInterrupts;

  TFLG1_C0F = 1;
  TC0 = TCNT + 1250;         //设置输出比较时间为5ms

  data1=fen/10;
  data2=fen%10;
  data2=data2+10;       //加小数点
  data3=miao/10;
  data4=miao%10;
  for(;;)
  {
      if(statesingle==2)
      {
            BUZZ=1;
            delay();
            BUZZ=0;
            for(;;);
      }
  }
}


         

回复

使用道具 举报

6

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
963
威望
323
贡献
178
兑换币
204
注册时间
2015-5-11
在线时间
231 小时
毕业学校
six middle school
2#
发表于 2015-5-11 21:15:55 | 只看该作者
我记得规定就是这样的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 21:45 , Processed in 0.044123 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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