//-------------------------------------------------------------------------*
//文件名: isr.c                                                            *
//说  明: 中断处理函数,本文件包含:                                         *                                                             *  
//        isrDummy: 中断处理程序                                           *
//-------------------------------------------------------------------------*

//头文件
#include "Includes.h"
extern uint8  StopFlag;                                    //定义于main中
static uint8  StartFlagForPC;                              //标志高端是否已经启动，通过该标志控制发送开始命令还是停止命令     

//此处为用户新定义中断处理函数的存放处

//-------------------------------------------------------------------------*
//函数名: KeyBoard_ISR                                                     *
//功  能: 扫描键盘,向串口发送定义值,到PC转换ACSII                          *  
//参  数: 无                                                               *
//返  回: 无                                                               *
//说  明: 利用扫描法                                                       *
//-------------------------------------------------------------------------*
interrupt void KeyBoard_ISR(void)
{
    uint8 value;
    uint16 i;
    for(i=0; i<1000; i++);                                 //延时，等待电平稳定

    DisableInterrupt();                                    //关总中断
    DisableKBint();                                        //屏蔽键盘中断
    
    value = KBScanN(10);                                   //扫描键值,存于value中
    //SCISend1(1, value);                                  //发送键值
    SCISend1(1,KBDef(value));                              //键值转化为定义值并发送

    KBInit();                                              //键盘初始化键盘中断
    EnableKBint();                                         //开放键盘中断
    EnableInterrupt() ;                                    //开总中断
}

//-------------------------------------------------------------------------*
//函数名: SCI1_ISR                                                         *
//功  能: 串行接收中断，当有数据接收时，发生中断                           *  
//参  数: 无                                                               *
//返  回: 无                                                               *
//说  明: 通过串口接收中断，如果接收到的数据包符合规则0x00 0x00 0x00 0xFE  *
//         0xFF 0xFF 0xFF那么解析出0xFE,作为停止标志。7个字段              * 
//-------------------------------------------------------------------------*
interrupt void SCI1_ISR(void)
{
    uint8 isrReceiveData[7]; 
    DisableInterrupt();                                    //禁止总中断
    
    SCIReN(SCI_NUM,7,isrReceiveData);
    if( isrReceiveData[3] == CODE_STOP &&                  //首先比对这一项是对编译器的优化，如果这一样比如失败，将不会继续比对，运行快
        isrReceiveData[0] == CODE_SUCCESSED &&             //全部使用宏，方便调整
        isrReceiveData[1] == CODE_SUCCESSED &&
        isrReceiveData[2] == CODE_SUCCESSED &&
        isrReceiveData[4] == CODE_FAILED &&
        isrReceiveData[5] == CODE_FAILED &&
        isrReceiveData[6] == CODE_FAILED  )
    {        
        StopFlag = CODE_SUCCESSED;                         //置位为1，允许停止
    }
   
    EnableInterrupt();                                     //开放总中断 
}

//-------------------------------------------------------------------------*
//函数名: T2Ch0In_ISR                                                      *
//功  能: 定时器2通道0输入捕捉中断。从拨码开关捕捉信号,并向PC机发送高端    *  
//        演示程序启动命令。 0xFF 0xFF 0xFF code 0x00 0x00 0x00。CODE定义  *
//        为宏 CODE_START_PC_SHOW 。                                       *
//参  数: 无                                                               *
//返  回: 无                                                               * 
//-------------------------------------------------------------------------*
interrupt void T2Ch0In_ISR(void)
{
    uint8 temp[7];
    temp[0] = CODE_FAILED;
    temp[1] = CODE_FAILED;
    temp[2] = CODE_FAILED;
    //temp[3] = CODE_START_PC_SHOW;                        //需要PC机识别的演示启动码
    temp[4] = CODE_SUCCESSED;
    temp[5] = CODE_SUCCESSED;
    temp[6] = CODE_SUCCESSED;
    
    DisableInterrupt();                                    //禁止总中断
    
    if(StartFlagForPC == CODE_FAILED)
    {
        temp[3] = CODE_START_PC_SHOW;                      //需要PC机识别的演示启动码          
        StartFlagForPC = CODE_SUCCESSED;                   //标志反转
    }
    else
    {                                                      //reset时，先执行这里面的
        temp[3] = CODE_STOP_PC_SHOW;                       //需要PC机识别的演示停止码，暂时保留
        StartFlagForPC = CODE_FAILED;                      //标志反转
    }
    
    SCISendN(SCI_NUM,7,temp);                              //发送命令字到PC
    
    Delay(1);                                              //延时,防止波动开关时产生抖动
	                                                       //清除输入捕捉标志位
	AW60_TPM2_CHSCSTR(TIMER2_CHANNEL_BZ_NUM) &= 
	                        ~AW60_TPM_CHSCSTR_CHF;         //向输入捕捉标志位写0
	
	EnableInterrupt();                                     //开放总中断
}


//-------------------------------------------------------------------------*
//函数名: T1Count_ISR                                                      *
//功  能: 利用定时器1的溢出中断，发送技术消息给PC，让PC进行计数            *  
//参  数: 无                                                               *
//返  回: 无                                                               * 
//-------------------------------------------------------------------------*
interrupt void T1Count_ISR(void)
{    
    uint8 count[7];                                                            
                                                           //组成命令字,发送计数
    MakeCommand(CODE_FAILED,
                CODE_SUCCESSED,
                CODE_TIMER__,                              //发送计数
                count);
    
    DisableInterrupt();                                    //禁止总中断
    
    SCISendN(SCI_NUM,7,count);                             //发送确认信息 
   
                                                           //清定时器1溢出标志位 
    AW60_TPM_CSTR(TIMER_NUM_1) &= ~(AW60_TPM_CSTR_TOF);    //向定时器1溢出标志位TOF写0       
    
    EnableInterrupt();                                     //开放总中断 
}


//-------------------------------------------------------------------------*
//函数名: IRQ_ISR                                                          *
//功  能: 外部中断服务程序，产生中断后，改变小灯的状态                     *  
//参  数: 无                                                               *
//返  回: 无                                                               * 
//-------------------------------------------------------------------------*
interrupt void IRQ_ISR(void)
{
    DisableInterrupt();                                    //禁止总中断

	if((IRQSC & 0x08)==0x08)                               //判断有无irq中断请求
	{
        IRQSC_IRQACK=1;                                    //清除外部中断标志位
                                                           //SCISend1(SCI_NUM, 0xA5); 
    }  
    
    EnableInterrupt();                                     //开放总中断 
}

//未定义的中断处理函数,本函数不能删除
interrupt void isrDummy(void)
{
}

//中断处理子程序类型定义
typedef void( *ISR_func_t)(void);

//中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目
const ISR_func_t ISR_vectors[] @0xFFCC = 
{
    isrDummy,     //   0xFFCC       //时基中断
    isrDummy,     //   0xFFCE       //IIC中断
    isrDummy,     //   0xFFD0       //ADC转换中断
    KeyBoard_ISR, //   0xFFD2       //键盘中断
    isrDummy,     //   0xFFD4       //SCI2发送中断
    isrDummy,     //   0xFFD6       //SCI2接收中断
    isrDummy,     //   0xFFD8       //SCI2错误中断
    isrDummy,     //   0xFFDA       //SCI1发送中断
    SCI1_ISR,     //   0xFFDC       //SCI1接收中断
    isrDummy,     //   0xFFDE       //SCI1错误中断
    isrDummy,     //   0xFFE0       //SPI中断
    isrDummy,     //   0xFFE2       //TPM2溢出中断
    isrDummy,     //   0xFFE4       //TPM2通道1输入捕捉/输出比较中断
    T2Ch0In_ISR,  //   0xFFE6       //TPM2通道0输入捕捉/输出比较中断
    T1Count_ISR,  //   0xFFE8       //TPM1溢出中断
    isrDummy,     //   0xFFEA       //TPM1通道5输入捕捉/输出比较中断
    isrDummy,     //   0xFFEC       //TPM1通道4输入捕捉/输出比较中断
    isrDummy,     //   0xFFEE       //TPM1通道3输入捕捉/输出比较中断
    isrDummy,     //   0xFFF0       //TPM1通道2输入捕捉/输出比较中断
    isrDummy,     //   0xFFF2       //TPM1通道1输入捕捉/输出比较中断
    isrDummy,     //   0xFFF4       //TPM1通道0输入捕捉/输出比较中断
    isrDummy,     //   0xFFF6       //ICG的PLL锁相状态变化中断
    isrDummy,     //   0xFFF8       //低电压检测中断
    IRQ_ISR,      //   0xFFFA       //IRQ引脚中断
    isrDummy      //   0xFFFC       //SWI指令中断 
     //RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o文件中)
};



