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

//头文件
#include "Includes.h"

//此处为用户新定义中断处理函数的存放处
//isrSCIre:接收中断处理函数------------------------------------------------*
//功能:总中断关闭，接收1个字节数据,满足条件就开始组帧，                    *
//     不满足条件丢弃接收的帧                                              *
//     "An????D"帧头:A；帧尾:B；n:代表有效数据长度；?:有效数据；D:帧尾。   *
//     gSCI_ISR_buffer:接收数据缓冲区                                      *
//     gSCI_ISR_flag:组帧完成标志位.(1:组帧完成可解帧读取数据;0:未完成组帧)*
//内部调用函数:SCIRe1(1,&i)                                                *            *
//-------------------------------------------------------------------------*
interrupt void isrSCIre(void) 
{
    //临时变量
    uint8 i,Redata;                          //临时变量i是SCIRe1(1,&i)的接受成功标志指针,
                                             //Redata存放接收来的数据
    //静态变量                 
    static uint8 j=0;                        //指代接收到的数据的个数

DisableInterrupt();                          //禁止总中断     

    if (gSCI_ISR_flag==1) goto isrSCIre_Exit;//此时,用户正在解帧则退出中断
    //接收一个数据开始组帧
    Redata=SCIRe1(1,&i);      
    
    //若是第一个数据开始组帧
    if(j==0)
    {
        if (Redata='A') 
        {
            gSCI_ISR_buffer[0]='A';         //当接收到的第一个数据是帧头'A'则存入
                                            //接收数据缓冲区gSCI_ISR_buffer中
            j++; 
        }
        goto isrSCIre_Exit;
    }
    //若是第二个数据则执行
    if(j==1)
    {
        gSCI_ISR_buffer[1]=Redata;          //将接收到的第二个数据存入gSCI_ISR_buffer中
        j++;
        goto isrSCIre_Exit;
    }
    //第二位数据是有效数据长度
    if (j>=2 && j<=(gSCI_ISR_buffer[1]+2)) 
    {
        gSCI_ISR_buffer[j]=Redata;          //存放有效数据
        j++;
        goto isrSCIre_Exit;
    }
    //若是末尾数据则执行
    if(j>=(gSCI_ISR_buffer[1]+3))
    {
        if (Redata!='D')                    //若帧尾不是'D'则执行
        {
            gSCI_ISR_flag=0;                //组帧完成标志位置0,丢掉接收到的帧
            j=0;                            //接收数据个数清0,可以开始重新组帧
        }
        else
        {
            gSCI_ISR_buffer[j]=Redata;      //将帧尾'D'存入缓冲区
            gSCI_ISR_flag=1;                //组帧完成标志位置1,允许用户解帧
            j=0;                            //接收数据个数清0,可以开始重新组帧
        }
    }  
   
isrSCIre_Exit:
    EnableInterrupt();                      //开放总中断
}



//isrT1OV:定时器1溢出中断处理函数------------------------------------------*
//功能:以秒为最小单位计时,并清定时器1溢出标志位                            *
//内部调用:                                                                *
//    SecAdd1:以秒为最小单位递增时,分,秒缓冲区的值                         *
//-------------------------------------------------------------------------*
interrupt void isrT1OV(void)
{
    uint8 temp;
    DisableInterrupt();                     //禁止总中断
    SecAdd1(time);                          //1s到,递增时,分,秒缓冲区的值
    SCISend1(1,Timer_commandtype);       
    SCISendN(1,3, time);
    temp  = AW60_TPM_CSTR(2);               //1.读取定时器1状态和控制寄存器T1SC
    AW60_TPM_CSTR(2) &= ~AW60_TPM_CSTR_TOF; //2.向定时器溢出标志位TOF写0       
    EnableInterrupt();                      //开放总中断 
} 

//isrKeyBoard:键盘中断处理函数---------------------------------------------*
//功能:识别按键并发送键值,把键值转换成对应的定义值,再从串口发送出去        *
//调用函数:                                                                *
//    (1)扫描法读取键值函数(KBscanN)                                       *
//    (2)键值转为定义值函数(KBdef)                                         *
//    (3)串行发送一个字节数据(SCIsend1)                                    *
//    (4)键盘初试化(KBInit)                                                *
//-------------------------------------------------------------------------*
interrupt void isrKeyBoard(void)  
{
    uint8 value;
    uint16 i;
    for(i=0; i<1000; i++);
    DisableInterrupt();                     //关总中断
    DisableKBint();                         //屏蔽键盘中断
    value = KBScanN(10);                    //扫描键值,存于value中
    if(value!=0xFF)
    {
      SCISend1(1,KB_commandtype);
      SCISend1(1,KBDef(value));             //键值转化为定义值并发送
    }
    KBInit();                               //键盘初始化键盘中断
    EnableKBint();                          //开放键盘中断
    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转换中断
    isrKeyBoard,  //   0xFFD2       //键盘中断
    isrDummy,     //   0xFFD4       //SCI2发送中断
    isrDummy,     //   0xFFD6       //SCI2接收中断
    isrDummy,     //   0xFFD8       //SCI2错误中断
    isrDummy,     //   0xFFDA       //SCI1发送中断
    isrSCIre,     //   0xFFDC       //SCI1接收中断
    isrDummy,     //   0xFFDE       //SCI1错误中断
    isrDummy,     //   0xFFE0       //SPI中断
    isrT1OV,      //   0xFFE2       //TPM2溢出中断
    isrDummy,     //   0xFFE4       //TPM2通道1输入捕捉/输出比较中断
    isrDummy,     //   0xFFE6       //TPM2通道0输入捕捉/输出比较中断
    isrDummy,     //   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       //低电压检测中断
    isrDummy,     //   0xFFFA       //IRQ引脚中断
    isrDummy      //   0xFFFC       //SWI指令中断 
     //RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o文件中)
};



