?? qd.c
字號:
else
{
Send_Retransmit(); //不做任何操作,相當于NAK
Receive_Data_Num=0;
ReceiveFlag=0;
} //enable to receive the information data again
}
break;
case 6:
if( Receive_Data_Num==2)
{ // SCON1 |= 0x20; // SM2位置1,只在地址時中斷
if (Check_Info_Data(InfoData_Buffer,Receive_Data_Num)) //?????judge if the check_num is right
{
Rec_Ctrl_Flag=1;
if (!Ctrl_Info_Flag){ Deal_Flag=1; }
else
{
switch(Ctrl_Info_Buffer[1])
{
case 0:
case 1:
case 2:
case 3:
case 6:
case 7:
Ctrl_Info_Counter=4;
break;
case 4:
Ctrl_Info_Counter=5;
break;
case 5:
Ctrl_Info_Counter=7;
break;
default:
break;
}
SCON1 &= 0xfd; //SCON1的TI1標志位清零
temp=0;
for(i=0;i<Ctrl_Info_Counter-1;i++) temp=Ctrl_Info_Buffer[i]+temp; //求校驗和CHK
Ctrl_Info_Buffer[Ctrl_Info_Counter-1]=temp;
Deal_Flag=1;
}
}
else
{
Send_Retransmit(); //不做任何操作,相當于NAK
}
Receive_Data_Num=0;
ReceiveFlag=0; //enable to receive the information data again
}
break;
default:
break;
}
//end of switch
} //end of else
// EIE2 |=0x40; // 打開串口1中斷
}
else //發送中斷處理程序 // If Transmit Complete:
{
SCON1 &= 0xfd; //清TI1標志位
// Send_Ack_Flag=1;
if((Ctrl_Info_Flag==1)&&(Rec_Ctrl_Flag == 1))
{
Send_Ctrl_Info_Counter++;
if( Send_Ctrl_Info_Counter>(Ctrl_Info_Counter-1))
{
Send_Ctrl_Info_Counter=0;
//Ctrl_Info_Flag=0;
First_Send_Flag=0;
Rec_Ctrl_Flag=0;
Rec_Ack_Flag=0;//接收回應標志位清零
Ack_Timer_Flag=1;
Timer3_Counter=0;//定時器3的計數器清零
TMR3CN |= 0x04; //啟動定時器3,檢查20ms之內收到回應
}
else if (Send_Ctrl_Info_Counter==(Ctrl_Info_Counter-1))
{
SCON1 |= 0x08; // TB8置1
SBUF1=Ctrl_Info_Buffer[Send_Ctrl_Info_Counter]; // interrupt to service.
}
else
{
SCON1 &= 0xf7; // TB8置0
SBUF1=Ctrl_Info_Buffer[Send_Ctrl_Info_Counter];
}
}
}
EIE2 |=0x40; // 打開串口1中斷
}
//----------------------------------------------------------------------------------------
// USER_ISR: User SW_UART Interrupt Service Routine (IE7 ISR)
// If interrupt-mode test code is enabled, this ISR
// transmits 15 characters and receives 15 characters. This routine is triggered each
// time a SW_UART transmit or receive is completed.
// - Checks receive complete indicator, and services.
// - Checks transmit complete indicator, and services.
// - Checks for transmits or receives that completed during the ISR; if so, triggers the
// interrupt again.
//
//軟串口中斷服務程序
void USER_ISR(void) interrupt 19 { // IE7 Interrupt Service Routine
unsigned char Rec_Data,i;
PRT1IF &= ~(0x80); // Clear IE7 interrupt flag
if (SRI){ // If Receive Complete:
SRI = 0; // Clear receive flag.
Rec_Data=RDR;
if (Receive_Ini_Flag==0)
{
if(Rec_Data==0xa5)
Receive_Ini_Flag=1; //Has received the first byte
}
else if ( Receive_Ini_Flag==1)
{
if(Rec_Data==0xa5)
{
Receive_Ini_Flag=2;
Ini_Data_BufferPoint=Ini_Data_Buffer;
Ini_Data_Num=0;
}
else
Receive_Ini_Flag=0;
}
else if ( Receive_Ini_Flag==2)
{
*(Ini_Data_BufferPoint+Ini_Data_Num)=Rec_Data;
Ini_Data_Num++;
if( Ini_Data_Num==27)
{
Receive_Ini_Flag=0;
Ini_Data_Num=0;
/*for(i=0;i<4;i++)
{
if(*(Ini_Data_BufferPoint+i)==0xff)
counter3++;
}
if(counter3>=3)
counter3=0;
else
{*/
for(i=0;i<4;i++)
{
Info_Frame1[i+4]=*(Ini_Data_BufferPoint+i);
Info_Frame2[i+4]=*(Ini_Data_BufferPoint+i);
Info_Frame3[i+4]=*(Ini_Data_BufferPoint+i);
Info_Frame4[i+4]=*(Ini_Data_BufferPoint+i);
Info_Frame5[i+4]=*(Ini_Data_BufferPoint+i);
Test_Frame[i+4]=*(Ini_Data_BufferPoint+i);
}
//}
for(i=0;i<4;i++) MDB_DATA_TEMP[i+18]=*(Ini_Data_BufferPoint+i+4);
for(i=0;i<2;i++) MDB_DATA_TEMP[i+24]=*(Ini_Data_BufferPoint+i+8);
Time_Distance[0]=*(Ini_Data_BufferPoint+10);
Time_Distance[1]=*(Ini_Data_BufferPoint+11);
Distance = Time_Distance[0]*256+Time_Distance[1];
for(i=0;i<8;i++) MAC_Key[i]=*(Ini_Data_BufferPoint+12+i);
//counter3=0;
/*for(i=0;i<6;i++)
{
if(*(Ini_Data_BufferPoint+i+20)==0xff)
counter3++;
}
if(counter3==6)*/
CS_RTC=0;
/* RegB=0x86;// ??????????????????????????????????????????????????????? //考慮打開RTC日期設置
Century=*(Ini_Data_BufferPoint+20);
Year = *(Ini_Data_BufferPoint+21);
Month = *(Ini_Data_BufferPoint+22);
Day = *(Ini_Data_BufferPoint+23);
Hour = *(Ini_Data_BufferPoint+24);
Minute= *(Ini_Data_BufferPoint+25);
Second= *(Ini_Data_BufferPoint+26);
*/
RegB=0x1e;//????????????????????????????????????????????????????????
CS_RTC=1;
Store_Ini_Data();
CS_RTC = 1;
for(i=0;i<20;i++) Ini_Data_Buffer[i]=XBYTE[IniDataAddress+i];
CS_RTC = 0;
Ini_Data_Flag=1;
}
//end of else
}
else
{
Receive_Ini_Flag=0;
}
}
else if (STI)
{ // If Transmit Complete:
STI = 0; // Clear transmit flag.
if (m<27){ // If less than 15 characters transmitted:
STXBSY = 1; // Claim SW_UART Transmitter.
TDR = *(Ini_Data_BufferPoint+m);
m++; // Increment variable, transmit.
CCF1 = 1; // Force module 0 interrupt to initiate TX
}
else
m=0;
Ini_Data_Flag=0;
// SW_DONE=1; // Indicate last character transmitted.
}
// if (STI|SRI) // If SRI or STI is set, re-trigger
// PRT1IF |= 0x80; // interrupt to service.
}
//-------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
//FLASH初始化子程序
void FLASH_INI(void)
{
unsigned int i,j;
unsigned char temp;
CS_RTC=1; //Select and Enable Flash Chip,Low Effect
i=0;
Send_Data_Num=0; //initiate the num of the data sent
UnSend_Data_Num=0; //initiate the num of the data unsent
Data_Total_Num=0; //initiate the total num of the data frame byte
for (i=0;i<960;i++)
{
temp=XBYTE[StartAddress+i*64];
if (temp!=0xff) //judge if it is effect data frame
{
switch(temp)
{
case 0x79:
for(j=0;j<6;j++)
{
Device_Error_Status[j]=XBYTE[StartAddress+i*64+10+j];
}
break;
case 0x7a:
for(j=0;j<6;j++)
{
Column_Error_Status[j]=XBYTE[StartAddress+i*64+10+j];
}
break;
case 0x7b:
for(j=0;j<6;j++)
{
Goods_Status[j]=XBYTE[StartAddress+i*64+10+j];
}
break;
case 0x7d:
for(j=0;j<28;j++)
{
Device_Info[j]=XBYTE[StartAddress+i*64+10+j];
}
break;
default:
break;
}
temp=XBYTE[StartAddress+i*64+63];
if (temp!=0xff) //the ACK has been received
Send_Data_Num++;
else
UnSend_Data_Num++;
//the num of data frame increase 1
}
else
break;
}
if (i==0)
Frame_Num=-1;
else
Frame_Num=i-1;
Data_Total_Num =i*64; //get the total num of data frame byte
CS_RTC=0; //Disable Flash
if(Data_Total_Num>=43008) //總數達到56K字節
{
Erase_Flag=1;
if(Data_Total_Num>=56320)
{
Flash_Full_Flag = 1;
}
}
}
//
//
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
//計算MDB數據的校驗和
bit Check_Info_Data(unsigned char * point,unsigned char length )
{ unsigned char i;
unsigned char temp;
temp=0;
for (i=0;i<length-1;i++)
{
temp += *(point+i); //??????????????????????????
}
if (temp==*(point+length-1))
return 1 ;
else
return 0;
}
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//讀取當前時間子程序
void Read_Time(void)
{
CS_RTC=0;
YEAR=Year;
MONTH=Month;
DAY=Day;
HOUR=Hour;
MINUTE=Minute;
CS_RTC=1;
}
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//存儲數據到FLASH子程序
void Store_Data(unsigned char *point,unsigned char type, unsigned char length )
{
int i;
unsigned char xdata tempbuffer[100],Verify_Counter;
if(!Flash_Full_Flag)
{
switch(type)
{
case 1: //identify that it is device error status
while(1)
{
for (i=1;i<length-1;i++)
{
Info_Frame1[i+9]=*(point+i);
}
Info_Frame1[2]= (Frame_Num- Frame_Num%256)/256;
Info_Frame1[3]= Frame_Num%256;
Info_Frame1[16]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -