⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.c

📁 一个U盘的文件系统源代码!!!C语言编写
💻 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 + -