📄 scomm.c
字号:
#include "Config.h"
#include "I2C.h"
#include "Scomm.h"
#include "ZI.h"
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
void Delay(uchar);
#define uchar unsigned char
#define uint unsigned int
sbit CTRL485 = P1^7;
#define N 32
uchar idata Serial_buf[N];
#define AT24c04 0x08
uchar data Command_status1 = 0x00;
uchar Receive_Data()
{
RI = 0;
while(!RI)
RI = 0;
ACC = SBUF;
if(P != RB8)
{
SP--;
SP--;
CY = 0;
return CY;
}
return(ACC);
}
bit Receive_One(uchar *s)
{
uchar CS = 0x00;
uchar Serial_data;
char i,j;
RI = 0;
Serial_data = SBUF;
while(Serial_data != 0xfe)
return 0;
do
Serial_data = Receive_Data();
while(Serial_data == 0xfe);
if(Serial_data != 0x68)
return 0;
CS += 0x68;
for(i=0;i<=5;i++)
{
*(s+i) = Receive_Data();
CS += *(s+i);
}
if(Receive_Data() != 0x68)
return 0;
CS += 0x68;
CS +=(*(s+6) = Receive_Data());
j = *(s+7)=Receive_Data();
CS += j;
for(i=0;i<=(j-1);i++)
{
CS += (*(s+i+8) = Receive_Data());
*(s+i+8) -= 0x33;
}
if(CS != Receive_Data())
return 0;
if(Receive_Data() != 0x16)
return 0;
REN = 0;
return 1;
}
void RXD_Int(void) interrupt 4
{
CY = Receive_One(Serial_buf);
if(CY)
Command_status1 |= 0x04;
}
void Send_Data(uchar Serial_data)
{
ACC = Serial_data;
TB8 = P;
TI = 0;
SBUF = Serial_data;
while(!TI)
TI = 0;
}
void TXD_Int(uchar *s)
{
uchar CS = 0x68;
char i,j;
CTRL485 = 0;
Delay(1);
TI = 0;
Send_Data(0xfe);
Send_Data(0xfe);
Send_Data(0x68);
for(i=0;i<=5;i++)
{
CS += *(s+i);
Send_Data(*(s+i));
}
CS += 0x68;
Send_Data(0x68);
CS += *(s+6);
Send_Data(*(s+6));
CS += *(s+7);
j = *(s+7);
Send_Data(j);
for(i=0;i<=j-1;i++)
{
(*(s+i+8)) += 0x33;
Send_Data(*(s+i+8));
CS += (*(s+i+8));
}
Send_Data(CS);
Send_Data(0x16);
RI = 0;
TI = 0;
Delay(1);
CTRL485 = 1;
}
uchar Serial_Addr(uchar *s1)
{
uchar i,a[6];
IRcvStr(AT24c04,0x00,a,6);
for(i=0;i<=5;i++)
{
if(*(s1+i) != 0x99)
break;
if(i == 5)
return(0x02);
}
for(i=0;i<=5;i++)
{
if(*(s1+i) != a[i])
return(0x00);
}
return(0x01);
}
bit Serial_Password(uchar *s)
{
uchar i,a[4];
IRcvStr(AT24c04,0x06,a,4);
for(i=0;i<=3;i++)
{
if(*(s+i) != a[i])
return 0;
}
return 1;
}
bit Serial_Command_Run(uchar *s)
{
switch(Serial_Addr(s))
{
case 0x02:
break;
case 0x01:
switch(*(s+6))
{
case 0x0f:
if(~Serial_Password(s+8))
return 0;
ISendStr(AT24c04,0x06,s+12,4);
Delay(5);
IRcvStr(AT24c04,0x00,s,6);
IRcvStr(AT24c04,0x06,s+8,4);
(*(s+6)) |= 0x80;
(*(s+7)) = 0x04;
TXD_Int(s);
break;
case 0x01:
break;
case 0x04:
break;
default:
break;
}
break;
case 0x00:
return 0;
break;
}
return 1;
}
void Serial_Command()
{
if(Command_status1 & 0x04)
{
if(~Serial_Command_Run(Serial_buf))
{
REN = 1;
Command_status1 &= 0xfb;
return;
}
REN = 1;
Command_status1 &= 0xfb;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -