?? vectors08.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 + -