?? usart.c
字號:
#include "24c08.h"
#include "Config.h"
#include "USART.h"
#include "display.h"
/*******************************************************************************
Rec_Judge()
接受數(shù)據(jù)的判斷函數(shù) 判斷是否符合645協(xié)議 并驗證效驗碼
*******************************************************************************/
uchar Rec_Judge(uchar *s)
{
uchar i,j,k;
if((*s != 0x68) && (*(s+7) != 0x68))
return 0;
else
{
for(i=1;i<7;i++)
{
if(*(s+i) > 0x99)
return 0;
}
}
if(*(s+9) > (Num-12))
return 0;
for(k=0;k<(*(s+9)+10);k++)
{
CS += *(s+k);
}
for(j=0;j<*(s+9);j++)
{
*(s+10+j) -= 0x33;
}
if(CS != *(s+(*(s+9)+10)))
return 0;
if(*(s+(*(s+9)+11)) != 0x16)
return 0;
else
return 1;
}
/*******************************************************************************
Send_Set()
數(shù)據(jù)發(fā)送的準(zhǔn)備函數(shù) 把所發(fā)送的數(shù)據(jù)存到s_buf[N]數(shù)組中,完成后關(guān)節(jié)后關(guān)閉接受中斷,
打開發(fā)送中斷
*******************************************************************************/
void Send_Set(uchar *s)
{
uint ii,jj,kk;
for(ii=0;ii<3;ii++) //前導(dǎo)字節(jié)
{
s_buf[ii] = 0xFE;
aa += 1;
}
for(jj=0;jj<10;jj++) //幀起始符到數(shù)據(jù)長度
{
s_buf[3+jj] = *(s+jj);
aa += 1;
SS1 += s_buf[3+jj];
}
for(kk=0;kk<s_buf[12];kk++) // 數(shù)據(jù)域的處理和準(zhǔn)備
{
s_buf[13+kk] = (readdata[kk] + 0x33);
aa += 1;
SS1 += s_buf[13+kk];
}
aa ++;
s_buf[(13+s_buf[12])] = SS1; //效驗碼的計算結(jié)果
aa ++;
s_buf[(14+s_buf[12])] = 0x16; //幀結(jié)束符
TXBUF0 = 0xFE;
IE1 &= ~URXIE0; //關(guān)接受中斷
IE1 |= UTXIE0; //開發(fā)送中斷
CY = 1;
}
/*******************************************************************************
usart_tx()
發(fā)送中斷函數(shù)
*******************************************************************************/
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx(void)
{
IFG1 &= ~UTXIFG0; //清零
TXBUF0 = s_buf[s0++]; //發(fā)送數(shù)據(jù)到緩沖寄存器
if(s0 >= aa) //發(fā)送接受的標(biāo)志
{
s0 = 0;
aa = 0;
SS1 = 0;
LCDMEM[11] &= ~0x05;
IE1 &= ~UTXIE0; //關(guān)閉發(fā)送中斷
IE1 |= URXIE0; //打開接受中斷
}
}
/*******************************************************************************
delay()
延時函數(shù)
*******************************************************************************/
void delay(uint nn)
{
while(nn -->0);
}
/*******************************************************************************
Serial_Addr()
通訊地址判斷函數(shù)
*******************************************************************************/
uchar Serial_Addr(uchar *s1)
{
uchar i,a[6];
for(i=0;i<=5;i++)
{
if((*(s_buf+i)) != 0x99) //不是廣播地址
break;
if(i==5)
return(0x01);
}
for(i=0;i<=5;i++)
{
if((*(s1+i)) != a[i])
return(0x00); //地址不相同
}
return(0x02);
}
/*******************************************************************************
Serial_Password()
通訊密碼判斷函數(shù)
*******************************************************************************/
char Serial_Password(uchar *s1)
{
uchar i,a[4];
for(i=0;i<=3;i++)
{
if((*(s1+i)) != a[i])
return 0;
}
return 1;
}
/*******************************************************************************
Serial_Command_Run()
通訊執(zhí)行函數(shù)
*******************************************************************************/
char Serial_Command_Run(uchar *s)
{
switch(Serial_Addr(s)) //判斷地址是否正確
{
case 0x02: //廣播地址999999999999H
break;
case 0x01:
switch(*(s_buf+6)) //正常地址
{
case 0x0f: //進(jìn)行密碼修改
if(~Serial_Password(s+8))
return 0;
delay(5);
(*(s+6)) |= 0x80;
(*(s+7)) = 0x04;
Send_Set(s); //*存取新密碼
break;
case 0x02:
break;
case 0x04:
break;
default:
break;
}
break;
case 0x00:
return 0;
}
return 1;
}
/*******************************************************************************
USART()
通訊主函數(shù)
*******************************************************************************/
void USART()
{
if(RXFLG) // 準(zhǔn)備發(fā)送數(shù)據(jù)
{
RXFLG = 0;
TXFLG = Rec_Judge(r_buf);
if(TXFLG)
{
TXFLG = 0;
Write_Data(&r_buf[10],StartAddr,r_buf[9]);
_NOP();
_NOP();
_NOP();
CS = 0x00;
Display_Flag = Read_Data(readdata,StartAddr,r_buf[9]);
if(Display_Flag)
{
Display_Flag = 0;
display();
}
Command_Status1 |= 0x04;
if(CY == 1)
{
Send_Set(r_buf);
}
}
}
if(Command_Status1 & 0x04) //通訊事件發(fā)送
{
if(~Serial_Command_Run(s_buf)) //幀執(zhí)行
{
Command_Status1 &= 0xfb; //幀錯誤,恢復(fù)信道功
return;
}
Command_Status1 &= 0xfb; //清除通訊處理事件
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -