📄 isr.c
字号:
/*******************************Copyright (c)***************************************
桑海为实业发展有限公司
自 动 化 钢 琴 研 究 所
http://www.pianoshw.com
E-mail:shw@pianoshw.com
----------------------------------文件信息-------------------------------------------
文 件 名 : ISR.C
创 建 人 : 吴应斌
创 建 日 期: 2004-6-7 9:41
功 能 描 述: SL811中断服务程序
************************************************************************************/
#include <COMMON.H>
#include <HAL.H>
#include <SL811.H>
#include <HPI.H>
extern XXGFLAGS bdata bXXGFlags;
extern UART_CMD_BLOCK xdata UartCmdBlock;
extern unsigned char xdata UARTBUF[UARTBUF_LENGTH]; //UART收发缓冲区,长度28672=0x7000
/*-----------------------------------------------------------------------------------
名称: void Reset_Timer0(void)
功能: 定时器0复位.
-----------------------------------------------------------------------------------*/
void Reset_Timer0(void)
{
TR0=0;
TF0=0;
TL0 = 0x00;
TH0 = 0x00;
TR0 = 1;
}
/*-----------------------------------------------------------------------------------
名称: void ISR_COMM(void) interrupt 4
功能: 串口接收中断处理.
-----------------------------------------------------------------------------------*/
void ISR_COMM(void) interrupt 4
{
unsigned char *pBuf=(unsigned char *)&UartCmdBlock; //接收命令指针
unsigned int cnt;
unsigned char i;
unsigned char uartState; //串口状态
uartState=0; //接收状态初始化
if(RI==0)
return;
while(!RI);
i=SBUF;
RI=0;
if(i==0xAA) //收到第一个同步码0xAA
uartState=1;
else
{ //如果非同步码设定串口故障标志
bXXGFlags.bits.bCOM_ERR=1;
uartState=0;
return;
}
Reset_Timer0(); //重置定时器0
while(!RI && !TF0);
if(TF0)
{
bXXGFlags.bits.bCOM_ERR=1; //如果接收超时设定串口故障标志
uartState=0;
return;
}
i=SBUF;
RI=0;
if((i==0xbb)&&(uartState==1)) //收到第二个同步码0xBB
uartState=2;
else
{
bXXGFlags.bits.bCOM_ERR=1; //如果非同步码设定串口故障标志
uartState=0;
return;
}
for(cnt=0;cnt<64;cnt++) //接收64Byte命令资料
{
Reset_Timer0();
while(!RI && !TF0);
if(TF0)
{
bXXGFlags.bits.bCOM_ERR=1; //串口超时
uartState=0;
return;
}
*(pBuf+cnt)=SBUF; //命令保存到缓冲区pbuf=UartCmdBlock;
RI=0;
}
/* 资料写入数据处理 */
if(UartCmdBlock.cmd==CMD_WRITE_FILE)
{
UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength=SwapINT16(UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength);
if(UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength>MAX_WRITE_LENGTH)
{
bXXGFlags.bits.bCOM_ERR=1; //数据超长错误
uartState=0;
return;
}
for(cnt=0;cnt<UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength;cnt++)
{
Reset_Timer0();
while(!RI && !TF0);
if(TF0)
{
bXXGFlags.bits.bCOM_ERR=1;
uartState=0;
return;
}
UARTBUF[cnt]=SBUF; //待写入的数据保存到UARTBUF[];
RI=0;
}
UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength=SwapINT16(UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength);
}
bXXGFlags.bits.bUartInDone=1; //串口接收完毕标志置位
RI=0;
}
/*-----------------------------------------------------------------------------------
名称: void ISR_Timer1(void) interrupt 1
功能: 定时器1中断处理.
-----------------------------------------------------------------------------------*/
void ISR_Timer1(void) interrupt 3
{
}
/*-----------------------------------------------------------------------------------
名称: ISR_INT1(void) interrupt 2
功能: 外部中断1处理.
-----------------------------------------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
}
/*-----------------------------------------------------------------------------------
名称: void ISR_Timer0(void) interrupt 1
功能: 定时器0中断处理.
-----------------------------------------------------------------------------------*/
void ISR_Timer0(void) interrupt 1
{
DISABLE_INTERRUPTS;
bXXGFlags.bits.bTimer = 1;
ENABLE_INTERRUPTS;
}
/*-----------------------------------------------------------------------------------
名称: ISR_INT1(void) interrupt 2
功能: 外部中断0处理(SL811中断).
-----------------------------------------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{
DISABLE_INTERRUPTS;
SL811Write(IntStatus,INT_CLEAR);
ENABLE_INTERRUPTS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -