?? isr.c
字號:
/*******************************Copyright (c)***************************************
桑海為實業(yè)發(fā)展有限公司
自 動 化 鋼 琴 研 究 所
http://www.pianoshw.com
E-mail:shw@pianoshw.com
----------------------------------文件信息-------------------------------------------
文 件 名 : ISR.C
創(chuàng) 建 人 : 吳應(yīng)斌
創(chuàng) 建 日 期: 2004-6-7 9:41
功 能 描 述: SL811中斷服務(wù)程序
************************************************************************************/
#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收發(fā)緩沖區(qū),長度28672=0x7000
/*-----------------------------------------------------------------------------------
名稱: void Reset_Timer0(void)
功能: 定時器0復(fù)位.
-----------------------------------------------------------------------------------*/
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; //串口狀態(tài)
uartState=0; //接收狀態(tài)初始化
if(RI==0)
return;
while(!RI);
i=SBUF;
RI=0;
if(i==0xAA) //收到第一個同步碼0xAA
uartState=1;
else
{ //如果非同步碼設(shè)定串口故障標志
bXXGFlags.bits.bCOM_ERR=1;
uartState=0;
return;
}
Reset_Timer0(); //重置定時器0
while(!RI && !TF0);
if(TF0)
{
bXXGFlags.bits.bCOM_ERR=1; //如果接收超時設(shè)定串口故障標志
uartState=0;
return;
}
i=SBUF;
RI=0;
if((i==0xbb)&&(uartState==1)) //收到第二個同步碼0xBB
uartState=2;
else
{
bXXGFlags.bits.bCOM_ERR=1; //如果非同步碼設(shè)定串口故障標志
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; //命令保存到緩沖區(qū)pbuf=UartCmdBlock;
RI=0;
}
/* 資料寫入數(shù)據(jù)處理 */
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; //數(shù)據(jù)超長錯誤
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; //待寫入的數(shù)據(jù)保存到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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -