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

📄 datafax.c

📁 PHILIP LPC935MCU UART用于与传真模块通信,SPI用于与SL811的USB模块通信.该软件把U盘存储的文件通过传真发到对方相同的设备接收到U盘
💻 C
📖 第 1 页 / 共 5 页
字号:
            case SYS_READY_RECIEVE_STATE:
            	if(Key_Down.Active)
                {
                    Key_Down.Active=false;
                    switch(Key_Down.Byte_data)
                    {
                         case KB_EXIT:
                              Do_Cancel();
                              Flag_KB_Enable=true; 
                         break;
                         case KB_RECIEVE:
                         	  SYS_Status=SYS_RECIEVEING_STATE;			
                         	  Recieve_File_Display();
                              Do_Recieve_File();
                              Flag_KB_Enable=true; 
                         break;
                         case KB_MENU:
				SYS_Status=SYS_MENU_STATE;
			        LCD_Clear();
			        Menu_Display();
			        Flag_KB_Enable=true; 
			   break;
                         default:
                         break;
                    }
                }

            break;
            case SYS_RECIEVEING_STATE:
            case SYS_SEND_FINISHED_STATE: 
            case SYS_RECIEVE_FINISHED_STATE:
            case SYS_ERROR_STATE:
            	if(Key_Down.Active)
                {
                    Key_Down.Active=false;
                    if(Key_Down.Byte_data==KB_EXIT)               
                    {
						Flag_KB_Enable=true; 
			        	Do_Cancel();                  	
					}
					Flag_KB_Enable=true; 
                }
            break;
            default:
            break;
        }  
     }

}



//---------------------------------- 
//功能:硬件初始化 
//----------------------------------
void Init_hw(void)
{

	EA=0;
	ET0=0;
	TR0=0;

    
  // configure timer 0
  	TMOD =0x01;

  // timer values


	TH0=TH0_DATA;
	TL0=TL0_DATA;

	ET0=1;
	TR0=1;

}
//---------------------------------- 
//功能:串口初始化 
//---------------------------------- 
void UART_Init() 
{ 

    SCON = 0x53;
    PCON = 0x80 | PCON;
    T2CON=0x30;
    //RCAP2H=0xFF;        // 57600 @ 24MHz: 24000000/(32*(65536-(RCAP2H,RCAP2L)))
    //RCAP2L=0xF3;
    RCAP2H=0xFF;        // 38400 @ 24MHz: 24000000/(32*(65536-(RCAP2H,RCAP2L)))
    RCAP2L=0xEC;
    TI=0;
    RI=0;
	TR2=1;
    ES = 1;
	Set_SPI_Slave;
	SPCFG=0x00;
	mspibusy=0;
} 

//---------------------------------- 
//功能:ms级延时 (注: 延时不准,受CPU主频影响)
//---------------------------------- 
void Delayms(int n) 
{ 
	int j; 
	while(n>0) 
	{ 
		for(j=0;j<680;j++); 
		n--; 
	} 
} 

//---------------------------------------
//100us 中断函数(定时中断)
//---------------------------------------
void timer0_int(void) interrupt 1 using 2
{
	EA=0;
	TH0=TH0_DATA;
	TL0=TL0_DATA;
	Delay_Cnt++;
	Flag_1ms=true;
//	SPI_SS=~SPI_SS;
	Cnt_Long_1ms++;
	EA=1;
}
//--------KEY DOWN EVENT-----------
// 			捕获按键
//--------------------------------
void Capture_KEY_Event()
{
   	if (!Key_Press){
        Key_No=SCAN_KB();
        if (Key_No!=0) {
            Key_Press=true;
            Buzzer_time=100;
			if(Flag_Buzzer) Buzzer_On;
        }
    }
    else
    {
        if (SCAN_KB()==0x00) 
        {   Key_Press=false; 
            Key_Down.Active=true;
            Flag_KB_Enable=false;
            Key_Down.Byte_data=Key_No;    
            LED_ShowOn(0xff);
        }
    }     
    if (Buzzer_time==0) Buzzer_Off;
    else Buzzer_time--; 
}
//--------Get Messages------------
//    获取MODEM发送来的连接信息
//--------------------------------
void MODEM_Monitor()
{
    byte tempstr[64];
    byte i=0;
    byte temp;
	switch(MODEM_Status)
	{
		case MODEM_DISCONNECTED_STATE:
			Get_Modem_Msg();
  	    	break;
		case MODEM_RINGING_STATE:
			Get_Modem_Msg();
		break;
		case MODEM_DIALING_STATE:
			Get_Modem_Msg();
		break;
		case MODEM_CONNECTED_STATE:
			//Get_Modem_Msg();
		break;
		case MODEM_INIT_STATE:
		case MODEM_IDLE_STATE:
		break;
	}
}

//------------Answer Calling----------
//				应答呼叫
//------------------------------------
void Answer_Call()
{
    Sys_Ring.Active=false;
    Com_Send("ATA\r\n");     //发送MODEM AT 应答指令   
}

//----------Com Send a byte----------------------- 
//         从串口发送一个字节
//-----------------------------------------------
void Com_Send_Byte(byte c)
{
	TI=0;
	COM_TI=true;
    SBUF=c;
    while (COM_TI);
//    Delayms(1);
}
//---------------------------------------------
// 			串口发送字符串函数
//--------------------------------------------
void Com_Send(byte *tempstr)
{
	TI=0;
    while(*tempstr!=0)
    {
		COM_TI=true;
        SBUF=*tempstr;
    	while (COM_TI);
        tempstr++;
    }
}
//----------------------------------------------
//			串口中断接收函数
//--------------------------------------------
void Com_ReadData_Int(void) interrupt 4 using 2
{

    byte temp;
    byte i=0;
    byte j=0;
    EA=0;


   if (SPCFG & 0x80)  //接受来自USB的数据
   {
		if(!SPI_TI)
		{
    		SPI_Recv_Buf[SPI_Write_Point]=SPDAT; //将I2C数据写入接收缓冲区
    		SPI_Write_Point++;
//    		SPI_Recv_Byte_Cnt++;
    		if (SPI_Write_Point==Recv_Buf_Len) SPI_Write_Point=0; 
     	 }
		 else
		 	SPI_TI=0;
		
//		SPCFG=0x00;
    }
	if (SPCFG&0xC0)
	{
		SPCFG=0x00;
	}	

    if(RI)		//接收来自MODEM串口的数据
    {
        RI=0;
        temp=SBUF;
        Com_Recv_Buf[Com_Write_Point]=temp;
//        Com_Recv_Byte_Cnt++;       
        Com_Write_Point++;
        if(Com_Write_Point>Recv_Buf_Len) Com_Write_Point=0;
    }
	if (TI) 
	{ 
		TI=0;
		if (COM_TI) COM_TI=false;
	}
   EA=1;
}

//---------------------------------------------------
//				SPI总线中断函数
//--------------------------------------------------
void spi_isr(void) interrupt 9
{
  // clear SPIF bit by writing 1 to it
 // 	SPSTAT |= 0x80;
	mspibusy = 0;

} 

//---------------------------------------------
// 			SPI发送字节函数
//--------------------------------------------
void SPI_Send_Byte(byte c)
{	byte i;
	SPI_TI=true;
    SPDAT=c;
	while (!SPCFG&0x80);
	for(i=0;i<30;i++);
	SPCFG=0x00;
}
//---------------------------------------------
// 			SPI发送字符串函数
//--------------------------------------------
void SPI_Send(byte *tempstr)
{
    byte i;
	SPCTL=0x5C;
	i=0;
    while(*tempstr!=0)
    {
        SPDAT=*tempstr;
//        SBUF=*tempstr;
//        while(!TI);
//        TI=0;
//	SelectShow_Byte(0,20-i,*tempstr);
        tempstr++;
        i++;
        for(i=0;i<170;i++);
    }
	SPCTL=0xCC;
}
//---------------------------------------------
// 			获取U盘里的文件列表信息
//  注:    目前只接收处理前三个文件
//--------------------------------------------
void Get_File_List()
{
    word i;
	word Len=0;
    SPI_Recv_Byte_Cnt=0;
    for(i=0;i<Recv_Buf_Len;i++) SPI_Recv_Buf[i]=0xff;//初始化获取文件列表命令信息包
    SPI_Write_Point=0;   
	SPI_Read_Point=0; 
    for(i=0;i<37;i++)  UARTBUF[i]=0x00;
	Set_SPI_Master;
	SPI_SS=0;
	Delayms(2);
    for(i=0;i<37;i++)  SPI_Send_Byte(UARTBUF[i]);//发送取文件列表命令 
	Set_SPI_Slave;
	temp_bit=SPI_SS;
	SPI_TI=0;
    Cnt_Long_1ms=0;
	
    while(Cnt_Long_1ms<_1S)
    {
         if (SPI_Write_Point>=5)
        {
            if(SPI_Recv_Buf[0]==0x01 )
			{	
				Len=SPI_Recv_Buf[3];
				Len<<=8;
				Len+=SPI_Recv_Buf[4];
			 	break ;
			}
        }
		if(SPI_Recv_Buf[0]==0x00)
    	{   
			for (i=0;i<5;i++)
			{
				SBUF=SPI_Recv_Buf[i];
				Delayms(1);		
			}
			LCD_Show_Data(4,20,"Read Error...");
			for(i=0;i<37;i++)  UARTBUF[i]=0x00;
			UARTBUF[0]=0x0D;
			Set_SPI_Master;
			SPI_SS=0;
			Delayms(2);
    		for(i=0;i<37;i++)  SPI_Send_Byte(UARTBUF[i]);//发送取文件列表命令 
			Set_SPI_Slave;
			temp_bit=SPI_SS;
			SPI_TI=0;
			return;
		}
    }
		
	
    Cnt_Long_1ms=0;
	while(1)
	{
		if (SPI_Write_Point>=(Len+5)) break;
 		if (Cnt_Long_1ms>_5S)
		{
			LCD_Show_Data(4,20,"SPI Time Out");
//			for(i=0;i<Len+5;i++)
//			{
//				SBUF=SPI_Recv_Buf[i];
//				Delayms(1);		
//			}
			return;
		}
	}
//  ---Only for test;
//	for (i=0;i<Len+5;i++)
//	{
//			SBUF=SPI_Recv_Buf[SPI_Read_Point];
//			SPI_Read_Point++;
//			Delayms(1);	
//	}

    Get_File_Info(5);					//获取第一个文件信息
    LCD_Show_Data(4,20,"1.");
    LCD_Show_Data(4,18,File_Name);
    Get_File_Info(37);					//获取第二个文件信息
    LCD_Show_Data(2,20,"2.");
    LCD_Show_Data(2,18,File_Name);
    Get_File_Info(69);					//获取第三个文件信息
    LCD_Show_Data(0,20,"3.");
    LCD_Show_Data(0,18,File_Name);
    
}
//---------------------------------------------------
//         获取文详细信息项
//	住:目前只取出了文件名和文件长度信息
//		其他信息存放在File_Info数组
//--------------------------------------------------
void Get_File_Info(unsigned long index)
{
    byte i;
    byte j=0;
    byte k=0;
    for(i=0;i<12;i++) File_Name[i]=0x00;
    for(i=0;i<33;i++) File_Info[i]=0x00;
    for(i=0;i<32;i++) File_Info[i]=SPI_Recv_Buf[index+i];
    for(i=index;i<index+11;i++)	//获取文件名FAT16格式
    {
        if(SPI_Recv_Buf[i]!=0x20) 
        {
            if(j!=0x08)
            {
                File_Name[k]=SPI_Recv_Buf[i];
                k++;
            }
            else
            {
                File_Name[k]=0x2E;
                i--;
                k++;
            }
        }
        j++;
    }
    File_Size=0;
    for(i=4;i>1;i--)//获取文件长度
    {
       File_Size+=(ulong)SPI_Recv_Buf[index+27+i]; 
       File_Size<<=8;
    }
    File_Size+=(ulong)SPI_Recv_Buf[index+28];
}
//----------------------------------------------
//		打开已在文件列表中选中的文件
//     返回:1--成功   0--失败
//-----------------------------------------------
bit Open_File()
{
    byte i;
    for(i=0;i<37;i++) UARTBUF[i]=0x00;
    UARTBUF[0]=0X01;//打开文件命令
    for(i=5;i<16;i++) UARTBUF[i]=File_Info[i-5];//要打开的文件
    SPI_Read_Point=0;
    SPI_Write_Point=0;
    Set_SPI_Master;
	SPI_SS=0;
	Delayms(2);
    for(i=0;i<37;i++) SPI_Send_Byte(UARTBUF[i]); 
    Set_SPI_Slave;
	temp_bit=SPI_SS;
	SPI_TI=0;
    Cnt_Long_1ms=0;
    while(Cnt_Long_1ms<_5S)
    {
        if( SPI_Read_Point!=SPI_Write_Point)  SPI_Read_Point++;
        if (SPI_Read_Point==37)
        {
            if(SPI_Recv_Buf[0]==0x00 ) return 0;
            if(SPI_Recv_Buf[0]==0x01 ) return 1;
            return 0;
        }
    }
    return 0;
}
//-----------------------------------------
//			把文件指针定位到指定位置
//		返回: 1--成功   0--失败
//----------------------------------------
bit File_Seek(ulong index)
{
    byte i;
    for(i=0;i<37;i++) UARTBUF[i]=0x00;
    for(i=4;i>0;i--)
	{
		UARTBUF[i]=(byte)index;
        index>>=8;
	}
    UARTBUF[0]=0X03;//文件定位命令
    SPI_Read_Point=0;
    SPI_Write_Point=0;
    Set_SPI_Master;
	SPI_SS=0;
	Delayms(2);
    for(i=0;i<37;i++) SPI_Send_Byte(UARTBUF[i]); 
    Set_SPI_Slave;
	temp_bit=SPI_SS;
	SPI_TI=0;
    Cnt_Long_1ms=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -