📄 pio.c
字号:
{
if(TI0)
{
TI0=0;
TEST=~TEST;
if(++AnsPoint0<=7)
{
SBUF0=TXsave0[AnsPoint0];
}
}
if(RI0)
{
RI0=0;
TEST=~TEST;
ConTime02=0;
if(!ComInfoAvalible0)
{
if (SBUF0==SOIofAnalog)
{
CommoIni0();
RXstatus0=StartCom;
}
switch( RXstatus0)
{
case NunCom:
break;
case StartCom:
if (SBUF0!=EOIofAnalog)
{
RXsave0[PCom0]=SBUF0;
if(++PCom0>maxCom-1)
{
CommoIni0();
RXstatus0=NunCom;
}
}
else
{
RXstatus0=NunCom;
ComInfoAvalible0=1; //when com completed,the PCom point to the EOI
}
break;
}
}
}
}
//------------------------------------------------------------------------------------
// 串口1中断服务例程(用于DIO通讯)
//------------------------------------------------------------------------------------
void UART1_ISR (void) interrupt 20
{
if ((SCON1&0x02)==0x02) //if TI1=1
{
SCON1 &= 0xfd; //TI1=0
TEST=~TEST;
if(Send1LastBit)
{
Send1Complete=1;
}
if (Send1Complete==0)
{
SBUF1=TXsave1[++AnsPoint1];
if(TXsave1[AnsPoint1]==0x0D)
{
Send1LastBit=1;
}
}
}
if ((SCON1&0x01)==0x01) //if RI1=1
{
SCON1 &= 0xfe; //RI1=0
TEST=~TEST;
ConTime12=0;
if(!ComInfoAvalible1)
{
if ((SBUF1==SOIofDigitalChk)|(SBUF1==SOIofDigitalCon))
{
CommoIni1();
RXstatus1=StartCom;
}
switch( RXstatus1)
{
case NunCom:
break;
case StartCom:
if (SBUF1!=EOIofDigital)
{
RXsave1[PCom1]=SBUF1;
if(++PCom1>maxCom-1)
{
CommoIni1();
RXstatus1=NunCom;
}
}
else
{
RXstatus1=NunCom;
ComInfoAvalible1=1; //when com completed,the PCom point to the EOI
}
break;
}
}
}
}
//-----------------------------------------------------------------------------
// ADC0中断服务例程
//-----------------------------------------------------------------------------
void ADC0_ISR (void) interrupt 15 using 3
{
unsigned int tempt;
AD0INT = 0; // clear ADC0 conversion complete indicator
tempt=ADC0/8;
TXsave0[6]=0x30+tempt%10;
tempt=tempt/10;
TXsave0[5]=0x30+tempt%10;
tempt=tempt/10;
TXsave0[3]=0x30+tempt%10;
tempt=tempt/10;
TXsave0[2]=0x30+tempt%10;
AnsPoint0=0;
SBUF0=TXsave0[AnsPoint0];
}
//--------------------------------------------------------------------
//AIO 通讯参数初始化
//--------------------------------------------------------------------
void CommoIni0(void)
{
ComInfoAvalible0=0;
PCom0=0;
}
//--------------------------------------------------------------------
//DIO 通讯参数初始化
//--------------------------------------------------------------------
void CommoIni1(void)
{
ComInfoAvalible1=0;
PCom1=0;
}
//--------------------------------------------------------------------
//启动ADC0采样通道0
//--------------------------------------------------------------------
void SendAD0(void)
{
while (AD0BUSY)
{
}
ADC0CF &= ~0x07; // PGA gain = 1
AMX0SL = 0x00; // Select AIN0 as ADC mux output
AD0BUSY = 1; //Start the ADC0
}
//--------------------------------------------------------------------
//启动ADC0采样通道2
//--------------------------------------------------------------------
void SendAD1(void)
{
while (AD0BUSY)
{
}
ADC0CF &= ~0x07; // PGA gain = 1
AMX0SL = 0x02; // Select AIN2 as ADC mux output
AD0BUSY = 1; //Start the ADC0
}
//--------------------------------------------------------------------
//DIO输出变换
//输入:欲输出对应值
//--------------------------------------------------------------------
void IOoutChange(unsigned char OutChar)
{
unsigned char tempt;
tempt=0;
if (OutChar & 0x01 )
{
tempt |=0x01;
}
if (OutChar & 0x02)
{
tempt |=0x04;
}
if (OutChar & 0x04)
{
tempt |=0x80;
}
if (OutChar & 0x08)
{
tempt |=0x40;
}
if (OutChar & 0x10)
{
tempt |=0x02;
}
if (OutChar & 0x20)
{
tempt |=0x08;
}
if (OutChar & 0x40)
{
tempt |=0x10;
}
if (OutChar & 0x80)
{
tempt |=0x20;
}
OutBackUp=tempt;
P2=OutBackUp;
}
//--------------------------------------------------------------------
//DIO输入采样(2.56ms间隔)
//--------------------------------------------------------------------
void IOinSample(void)
{
if (P7 & 0x20) //P7.5 <->L9
{
In0Sum++;
}
else
{
In0Sum--;
}
if (P7 & 0x80) //P7.7 <->L10
{
In1Sum++;
}
else
{
In1Sum--;
}
if (P3 & 0x20) //P3.5 <->L11
{
In2Sum++;
}
else
{
In2Sum--;
}
if (P3 & 0x80) //P3.7 <->L12
{
In3Sum++;
}
else
{
In3Sum--;
}
if (P7 & 0x10) //P7.4 <->L13
{
In4Sum++;
}
else
{
In4Sum--;
}
if (P7 & 0x40) //P7.6 <->L14
{
In5Sum++;
}
else
{
In5Sum--;
}
if (P3 & 0x10) //P3.4 <->L15
{
In6Sum++;
}
else
{
In6Sum--;
}
if (P3 & 0x40) //P3.6 <->L16
{
In7Sum++;
}
else
{
In7Sum--;
}
}
//--------------------------------------------------------------------
//DIO输入变换
//--------------------------------------------------------------------
void IOinChange(void)
{
if (In0Sum>(128+InSampleSetTimes-10)) //P7.5 <->L9
{
InBackUp |=0x01;
}
if (In0Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x01;
}
if (In1Sum>(128+InSampleSetTimes-10)) //P7.7 <->L10
{
InBackUp |=0x02;
}
if (In1Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x02;
}
if (In2Sum>(128+InSampleSetTimes-10)) //P3.5 <->L11
{
InBackUp |=0x04;
}
if (In2Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x04;
}
if (In3Sum>(128+InSampleSetTimes-10)) //P3.7 <->L12
{
InBackUp |=0x08;
}
if (In3Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x08;
}
if (In4Sum>(128+InSampleSetTimes-10)) //P7.4 <->L13
{
InBackUp |=0x10;
}
if (In4Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x10;
}
if (In5Sum>(128+InSampleSetTimes-10)) //P7.6 <->L14
{
InBackUp |=0x20;
}
if (In5Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x20;
}
if (In6Sum>(128+InSampleSetTimes-10)) //P3.4 <->L15
{
InBackUp |=0x40;
}
if (In6Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x40;
}
if (In7Sum>(128+InSampleSetTimes-10)) //P3.6 <->L16
{
InBackUp |=0x80;
}
if (In7Sum<(128-InSampleSetTimes+10))
{
InBackUp &=~0x80;
}
In0Sum=128;
In1Sum=128;
In2Sum=128;
In3Sum=128;
In4Sum=128;
In5Sum=128;
In6Sum=128;
In7Sum=128;
}
//--------------------------------------------------------------------
//DIO设置值BCD到二进制变换
//输入:两位BCD码
//输出:对应十六进制值
//--------------------------------------------------------------------
unsigned char IOsetChange(unsigned char a,unsigned char b)
{
unsigned char temptChar1;
unsigned char temptChar2;
if (a>0x39)
{
if (a>0x46)
{
temptChar1=a-0x57; //a~f
}
else
{
temptChar1=a-0x37; //A~F
}
}
else
{
temptChar1=a-0x30; //0~9
}
if ((0x0f-temptChar1)>9)
{
infoBackH = (0x0f-temptChar1)-10+0x41;
}
else
{
infoBackH = (0x0f-temptChar1)+0x30;
}
if (b>0x39)
{
if (b>0x46)
{
temptChar2=b-0x57; //a~f
}
else
{
temptChar2=b-0x37; //A~F
}
}
else
{
temptChar2=b-0x30; //0~9
}
if ((0x0f-temptChar2)>9)
{
infoBackL = (0x0f-temptChar2)-10+0x41;
}
else
{
infoBackL = (0x0f-temptChar2)+0x30;
}
return((temptChar1<<4)+temptChar2);
}
//--------------------------------------------------------------------
//十六进制到ASCII变换
//输入:十六进制值
//输出:对应ASCII码
//--------------------------------------------------------------------
unsigned int getASCIIfromHEX(unsigned char hexvalue)
{
unsigned char temptvalueL,temptvalueH;
temptvalueL=hexvalue&0x0f;
if (temptvalueL>9)
{
temptvalueL=temptvalueL+0x37;
}
else
{
temptvalueL=temptvalueL+0x30;
}
temptvalueH=(hexvalue&0xf0)>>4;
if (temptvalueH>9)
{
temptvalueH=temptvalueH+0x37;
}
else
{
temptvalueH=temptvalueH+0x30;
}
return((temptvalueH<<8)+temptvalueL);
}
//--------------------------------------------------------------------
// 输入:无
// 输出:无
// 功能:保护程序被非法读出
//---------------------------------------------------------------------
void FlashProtect(void)
{
unsigned char xdata *pwrite; // pointer in CODE space
FLSCL = 0x81;
PSCTL = 0x01;
pwrite=0xfdff;
*pwrite=0x80;
FLSCL = 0x80;
PSCTL = 0x04;
}
//--------------------------------------------------------------------
//主程序初始化例程
//--------------------------------------------------------------------
void MainIni(void)
{
PCom0=0;
PCom1=0;
AnsPoint0=0;
AnsPoint1=0;
ComInfoAvalible0=0;
ComInfoAvalible1=0;
RXstatus0=NunCom;
RXstatus1=NunCom;
ConTime00=0;
ConTime01=0;
ConTime02=0;
ConTime10=0;
ConTime11=0;
ConTime12=0;
Send1Complete=1;
Send1LastBit=0;
TXsave0[0]='>';
TXsave0[1]='+';
TXsave0[4]='.';
TXsave0[7]=0x0D;
WorkStatus=Sta0;
InSampleCon=0;
infoBackL = 0xF;
infoBackH = 0xF;
}
//--------------------------------------------------------------------
//延时例程
//--------------------------------------------------------------------
void delay(unsigned char n)
{
unsigned char t;
while (!(n==0))
{
t=200;
n--;
while(!(t==0))
{
t--;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -