⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vectors08.c

📁 这是我自己在做实验设计时做的,用摩托罗拉飞思卡尔做的一个多功能电子钟
💻 C
字号:
/*-----------------------------------------------------*
*文件名:vectors08.c                                    *
*功  能:用于定义中断矢量表                             *
*-----------------------------------------------------*/
//[头文件]
#include "GP32C.H"          //包含头文件
#include "userdefine.h"
#include "KB.h" 
//未定义的中断处理函数,本函数不能删除
#define TSTOPBit   5        //定时器计数停止位
#define TOFBit     7        //定时器溢出标志位
/*isrTIMER1:定时器溢出中断处理函数---------------------*
*功  能:给内存单元Time[0-2](时分秒)赋值                *
*-----------------------------------------------------*/
extern Time_Struct Time,Alarm;      //H M S
extern void Time_Var2char(Time_Struct);
extern void lcdshow(unsigned char str[]);
extern char Is_yunnian(unsigned short int year);
extern void Alarm_handle(void);
extern char Select_key_is_pressed_flag,Up_Modify_key_is_pressed_flag,Down_Modify_key_is_pressed_flag;
extern char Timer_5sec_trigger,Timer_5sec_counter,Alarm_counter;
extern char Alarm_enable_flag,Alarm_trigger,Minute_second_integral_flag,Integral_counter;
extern char Time_fresh,Alarm_fresh;
extern unsigned char LCD_buff[32];

#pragma interrupt_handler isrKBI
void isrKBI(void) 
{
	  unsigned char KB_valve;
	  asm("SEI");	  	        //关总中断
	  Timer_5sec_trigger=1;
	  Timer_5sec_counter=0;
	  INTKBSCR|= (1<<IntBit); //屏蔽键盘中断(IMASKK=1)
	  KB_valve=KB_Scan();     //扫描键值
      KB_valve=KB_Def(KB_valve);  //键值转化为定义值
      switch(KB_valve)
      {
      	case '1':Select_key_is_pressed_flag++;break;
      	case '2':Up_Modify_key_is_pressed_flag++;break;
      	case '3':Down_Modify_key_is_pressed_flag++;break;
      	case '4':Alarm_handle();break;
      	default: ;break;
      }
	  KB_Init();			     //重新初始化键盘
	  INTKBSCR&= ~(1<<IntBit); //打开键盘中断(IMASKK=0)
	 asm("CLI");			     //开总中断
}



#pragma interrupt_handler isrTIMER1
void isrTIMER1(void)
{
   unsigned char i,tmp;
   asm("SEI");            //关总中断
   //------------------------------
   Time.sec++;
   if(Time.sec!=60) goto isrTIMER1_exit;
   Time.sec=0;
   Time.min++;
   if(Time.min!=60) goto isrTIMER1_exit;
   Time.min=0;
   Time.hour++;
   if(Time.hour!=24) goto isrTIMER1_exit;
   Time.hour=0;
   Time.day++;
   if(!Is_yunnian(Time.year))       //如果不是闰年
   {
		if((Time.month!=2)&&(Time.month==1)||(Time.month==3)||(Time.month==5)||(Time.month==7)||(Time.month==8)||(Time.month==10||(Time.month==12)))
		{
			if(Time.day!=31) goto isrTIMER1_exit;
			Time.day=0;
			Time.month++;
			if(Time.month!=12) goto isrTIMER1_exit;
			Time.month=0;
			Time.year++;
		}
		else if((Time.month!=2)&&(Time.month==4)||(Time.month==6)||(Time.month==9)||(Time.month==11))
		{
			if(Time.day!=30) goto isrTIMER1_exit;
			Time.day=0;
			Time.month++;
			if(Time.month!=12) goto isrTIMER1_exit;
			Time.month=0;
			Time.year++;
		}
		else
		{
			if(Time.day!=28) goto isrTIMER1_exit;
			Time.day=0;
			Time.month++;
			if(Time.month!=12) goto isrTIMER1_exit;
			Time.month=0;
			Time.year++;
		}
   }
   else        //否则为闰年
   {
   		if((Time.month!=2)&&(Time.month==1)||(Time.month==3)||(Time.month==5)||(Time.month==7)||(Time.month==8)||(Time.month==10||(Time.month==12)))
		{
			if(Time.day!=31) goto isrTIMER1_exit;
			Time.day=0;
			Time.month++;
			if(Time.month!=12) goto isrTIMER1_exit;
			Time.month=0;
			Time.year++;
		}
		else if((Time.month!=2)&&(Time.month==4)||(Time.month==6)||(Time.month==9)||(Time.month==11))
		{
			if(Time.day!=30) goto isrTIMER1_exit;
			Time.day=0;
			Time.month++;
			if(Time.month!=12) goto isrTIMER1_exit;
			Time.month=0;
			Time.year++;
		}
		else
		{
			if(Time.day!=29) goto isrTIMER1_exit;
			Time.day=0;
			Time.month++;
			if(Time.month!=12) goto isrTIMER1_exit;
			Time.month=0;
			Time.year++;
		}
   }
   isrTIMER1_exit:	 
   if(Timer_5sec_trigger)
   {
   		Timer_5sec_counter++;
   }
   if(Alarm_enable_flag&&(Time.year==Alarm.year)&&(Time.month==Alarm.month)&&(Time.day==Alarm.day)&&(Time.hour==Alarm.hour)&&(Time.min==Alarm.min))
   {
   	    Alarm_trigger=1;
   		Alarm_counter++;	
   }
   if((Time.min==0)&&(Time.sec==0))
   {
   		Minute_second_integral_flag=1;
   }
   if(Minute_second_integral_flag) 
   	 Integral_counter++;
   	  	
	     	
   //------------------------------
   //清除定时器溢出标志位
   Time_fresh=1;             //置时间更新位!
   Alarm_fresh=1;
   T1SC&=~(1<<TOFBit);
   asm("CLI");            //开总中断
}

#pragma interrupt_handler isrDummy  
void isrDummy(void) 
  {
  }
//中断矢量表,需定义中断函数,可修改下表中的相应项目
//(interrupt service routine,isr 中断处理程序)
#pragma abs_address:0xffdc    //中断向量表起始地址
void (* const _vectab[])(void) = {            
	isrDummy,		//时基中断 
	isrDummy,		//AD转换中断      
	isrKBI,    	//键盘中断   
	isrDummy,		//SCI TC/TE 
	isrDummy,		//SCI RF/IDLE 
	isrDummy,		//SCI PE/FE/NF/OR
	isrDummy,		//SPI TE  
	isrDummy,		//SPI MOD/OVR/RF
	isrDummy,		//TIM2溢出中断 
	isrDummy,		//TIM2通道1
	isrDummy,		//TIM2通道0
	isrTIMER1,	//TIM1溢出中断       
	isrDummy,		//TIM1通道1
	isrDummy,		//TIM1通道0
	isrDummy,		//CGM     
	isrDummy,		//IRQ     
	isrDummy		//SWI       
    //RESET也是中断,定义在 crt08.o中 
   };
#pragma end_abs_address      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -