?? vectors08.c
字號:
//-------------------------------------------------------------------------*
//文件名:vectors08.c *
//功 能:用于定義中斷矢量表 *
//-------------------------------------------------------------------------*
//頭文件
#include "GP32C.H" //包含頭文件
#include "Type.h" //類型別名定義
#include "EnDisInt.h" //開放或禁止MCU各模塊中斷頭文件
#include "LCD.h" //包含LCD驅動頭文件
#include "Show.h" //包含LCD顯示頭文件
#include "SCI.h" //包含SCI發送接收頭文件
#include "Flash.h" //擦寫Flash函數聲明
//定時器相應寄存器定義
#define TOFBit 7 //定時器溢出標志位
#define CH0FBit 7 //定時器通道標志位
//全局變量聲明
extern INT16U ADValue[11]; //11路A/D采集數據
extern INT8U LcdShowBuff[64]; //外部定義64個字節的LCD顯示緩沖區
extern INT16U Temper; //設定溫度
extern INT16U CurtTmp; //當前溫度
extern INT16U CurtTime; //當前時間
extern INT16U Time; //定時時間
extern INT8U ScdTim; //中斷秒數
extern INT16U MntTim; //中斷分數
extern const INT16U BigNumCode[10][32]; //32*16點陣數字編碼首地址
extern const INT8U MCUno; //MCU號
extern INT8U SendFlag; //是否需要向PC發送參數的標志
extern INT8U FlashFlag1; //因為校準值要寫Flash的標志
extern INT8U FlashFlag2; //因為改MCU號要寫Flash的標志
extern INT16U TmaxAdjust; //PC發來的當前溫度校準值
extern INT8U NewMCUno; //PC發來的新MCU號
extern INT8U CaptureTime; //捕捉中斷用來記上次中斷發生時間防"抖動"
extern INT8U BakeFlag; //Bake爐電源重啟按鈕是否按下的標志
extern INT8U ResetFlag; //復位按鈕是否按下的標志
extern INT8U N; //寫入數據的個數
extern INT8U FlashData[111]; //寫入的數據
//=======================中斷處理函數函數===================================
//isrSCIRe:串行接收中斷處理函數--------------------------------------------*
//功 能:接收PC發來的數據,根據幀中不同的命令置相應標志 *
// 命令要求的具體操作在主循環中進行,中斷處理函數應盡量簡單 *
//幀格式: 1字節MCU號+1字節命令+2字節數據(若只有1字節數據,"后對齊") *
//說 明: *
// 修改的全局變量:TmaxAdjust、NewMCUno *
// 修改的標志:SendFlag、FlashFlag1、FlashFlag2 *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrSCIRe
void isrSCIRe(void)
{
INT8U data[4],i;
INT8U tmp[12];
DisableMCUInterrupt(); //禁止總中斷
//接收4字節數據,根據幀頭的MCU號判斷是否作進一步處理
SCIReN(1,data);
if(data[0]==MCUno)
{
SCIReN(4,data);
if(data[3]=='E') //幀頭:MCU號;幀尾:'E'
switch(data[0])
{
case 'R'://讀數據命令
SendFlag=1;
break;
case 'T'://校準當前溫度值命令
SCISend1(0x56); //反饋給PC表示接收成功
TmaxAdjust=data[1]*256 +data[2]; //當前溫度的校準值
FlashFlag1=1;
break;
case 'M'://更改MCU號命令
SCISend1(0x56); //反饋給PC表示接收成功
NewMCUno=data[2]; //新的MCU號
FlashFlag2=1;
break;
}//switch
}
else if(data[0]==MCUno+10)
{
SCIReN(111,FlashData);
N=110;
/* SCISendN(110,FlashData);
EraseFlash(0x8080); //擦除0x8000為始址的一個頁
WriteFlash(0x8080); //將FlashData[8]數組的8個數據寫入0x8000為始址的一個頁
for(i=0;i<11;i++)
FlashData[i]=i;
N=11;
FLBPR=0b11111111; //不保護FLASH區域
EraseFlash(0x8080); //擦除0x8000為始址的一個頁
FLBPR=0b11111111; //不保護FLASH區域
WriteFlash(0x8080); //將FlashData[8]數組的8個數據寫入0x8000為始址的一個頁
SCISendN(110,(INT8U *)0x8080);
*/
FlashFlag1=1;
}
EnableMCUInterrupt(); //開放總中斷
}
//isrTIMER1:定時器1溢出中斷處理函數----------------------------------------*
//功 能:每1秒計時秒數加1,加到60(不含)就清0,并分數加1 *
// LCD顯示刷新間隔:1秒 *
//說 明: *
// 修改的全局變量:ScdTim、MntTim *
// 使用的全局變量:CurtTmp,Temper,CurtTime,Time,LcdShowBuff[64] *
// 使用的常量:BigNumCode *
// 修改的標志:無 *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrTIMER1
void isrTIMER1(void)
{
DisableMCUInterrupt(); //禁止總中斷
//1 計時加熱時間
if(ScdTim<59)
ScdTim++; //秒計數
else
{
MntTim++; //分計數
ScdTim=0;
}
//3 清除定時器溢出標志位
T1SC&=~(1<<TOFBit);
EnableMCUInterrupt(); //開放總中斷
}
//isrTim2Ch0I:定時器2通道0下降沿輸入捕捉中斷處理程序-----------------------*
//功 能: 復位按鈕按下觸發此中斷,置標志 *
//說 明: *
// 修改的全局變量:CaptureTime(防"抖動") *
// 使用的全局變量:ScdTim *
// 修改的標志:ResetFlag *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrTim2Ch0I
void isrTim2Ch0I(void)
{
DisableMCUInterrupt(); //禁止總中斷
//防"抖動",1秒內最多只算一次中斷
if(CaptureTime !=ScdTim) //好像有1/60的概率將正常中斷防掉誒?!
{
ResetFlag=1;
}
CaptureTime=ScdTim; //更新"上次"中斷時間
//清除定時器溢出標志位
T2SC0&=~(1<<CH0FBit);
EnableMCUInterrupt(); //開放總中斷
}
//isrTim2Ch1I:定時器2通道1下降沿輸入捕捉中斷處理程序-----------------------*
//功 能: Bake爐電源重啟按鈕按下觸發此中斷,置標志 *
//說 明: *
// 修改的全局變量:CaptureTime(防"抖動") *
// 使用的全局變量:ScdTim *
// 修改的標志:BakeFlag *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrTim2Ch1I
void isrTim2Ch1I(void)
{
DisableMCUInterrupt(); //禁止總中斷
//防"抖動",1秒內最多只算一次中斷
if(CaptureTime !=ScdTim) //好像有1/60的概率將正常中斷防掉誒?!
{
BakeFlag=1;
}
CaptureTime=ScdTim; //更新"上次"中斷時間
//清除定時器溢出標志位
T2SC1&=~(1<<CH0FBit);
EnableMCUInterrupt(); //開放總中斷
}
/**/
//未定義的中斷處理函數,本函數不能刪除
#pragma interrupt_handler isrDummy
void isrDummy(void)
{
}
//=============================中斷向量表===================================
//中斷矢量表,需定義中斷函數,可修改下表中的相應項目
//(interrupt service routine,isr 中斷處理程序)
#pragma abs_address:0xffdc //中斷向量表起始地址
void (* const _vectab[])(void) = {
isrDummy, //時基中斷
isrDummy, //AD轉換中斷
isrDummy, //鍵盤中斷
isrDummy, //SCI TC/TE
isrSCIRe, //SCI RF/IDLE
isrDummy, //SCI PE/FE/NF/OR
isrDummy, //SPI TE
isrDummy, //SPI MOD/OVR/RF
isrDummy, //TIM2溢出中斷
isrTim2Ch1I, //TIM2通道1
isrTim2Ch0I, //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 + -