📄 datafax.c
字号:
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 + -