📄 main.c
字号:
#include <common.h>
#include <scom.h>
uint delay;
uchar T0Count=0; //用作T0定时1s计数器,每次定时10ms,累计100次
uchar T0Count1=0; //用作T0定时60ms计数器,每次定时10ms,累计6次
uchar T0_1S_Out=NO; //用作定时1s到标志
uchar KeyPressCount=0; //用作按键次数累计
#ifndef OffINT0
uchar T0_60mS_Out=NO;
#endif
#ifdef TestRS485
#define ReBufLen 10
#define TrBufLen 10
uchar data ReBuf[ReBufLen]={0,0,0,0,0,0,0,0,0,0};
uchar data TrBuf[TrBufLen]={0xee,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0xff};
#endif
/******************** Key Test **************************/
#ifndef TestRS485
#ifndef OffINT0
void int_int0(void) interrupt 0 using 2
{
EX0 = 0;
if(KeyPressCount==0) //只有1s内第一次按键可以启动T0,开始定时1s
{
TH0=0xD8 ;
TL0=0xF0 ;
TR0=1; //启动T0开始定时
KeyPressCount++; //第1次有效按键,按键次数累计
}
if( (KeyPressCount>=1) && (T0_60mS_Out==YES) ) //第2,3,4...次有效按键
{
KeyPressCount++; //2次按键以上
//KeyPressCount=2;
T0Count1=0;
T0_60mS_Out=NO;
}
EX0 = 1;
}
void int_t0( void ) interrupt 1 using 3
{
TH0 = 0xD8 ; //定时10ms
TL0 = 0xF0 ;
T0Count++;
T0Count1++;
if( (T0Count1<99) && (T0Count1>6) ) // 60ms time out
{
T0_60mS_Out = YES;
}
if(T0Count > 99)//1S time out
{
TR0 = 0;
T0Count = 0;
T0Count1 = 0;
T0_60mS_Out = NO;
T0_1S_Out = YES;
}
}
#endif
//////////////////////////////////////////////////////////////////////
#ifdef OffINT0
void int_int0(void) interrupt 0 using 2
{
EX0=0;
if(KeyPressCount==0) //只有1s内第一次按键可以启动T0,开始定时1s
{
TH0=0xD8 ;
TL0=0xF0 ;
TR0=1; //启动T0开始定时
}
KeyPressCount++; //有效按键,按键次数累计
T0Count1=0;
}
void int_t0( void ) interrupt 1 using 3
{
TH0 = 0xD8 ; //定时10ms
TL0 = 0xF0 ;
T0Count++;
T0Count1++;
if( (T0Count1<99) && (T0Count1>15) ) // 150ms time out
{
EX0=1;
}
if(T0Count >= 99)//1S time out
{
TR0 = 0;
EX0 = 0;
T0Count = 0;
T0Count1 = 0;
T0_1S_Out = YES;
}
}
#endif
void main( void )
{
IT0 = 0; //INT0 is triggered by LOW level
EA = 1; //IE=0x83, EA=1,ET0=1,EX0=1,the rest are all zero
ET0 = 1;
EX0 = 1;
IP = 0x01 ; //PX0=1,PT0=0
TMOD |= 0x01; //T0 is 16-bit timer(mod 1),and T1 is UART's BaudGenerator,T2 is not used
UARTInit_T1( ); //T1 as UART's BaudrateGenerator
while( 1 )
{
if(T0_1S_Out == YES) // 1S is time out
{
TI = 0;
SBUF = 0xaa;
while( TI==0 );
TI = 0;
SBUF = KeyPressCount;
while( TI==0 );
TI = 0;
T0_1S_Out = NO;
KeyPressCount = 0;
#ifdef OffINT0
EX0=1;
#endif
}
}
}
#endif
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
/*************** RS485 interface Test *********************************/
#ifdef TestRS485
#pragma rb(2)
void receive( uchar idata *p , uchar data count )
{
uchar i;
RI=0;
i=0;
while(i<count)
{
if( _testbit_(RI) )
{
*p++ = SBUF;
i++;
}
}
}
#pragma rb(2)
void transmit( uchar idata *p , uchar data count )
{
uchar i;
TI = 0;
for(i=0; i<count; i++)
{
SBUF = *p;
while( TI==0 ) ;
TI = 0;
p++;
}
}
void int_int0( void ) interrupt 0 using 2
{
EX0 = 0;
RT_CONT_485=1;
for(delay=650;delay>0;delay--) ;
transmit( TrBuf,TrBufLen );
for(delay=650;delay>0;delay--) ;
RT_CONT_485=0;
for(delay=650;delay>0;delay--) ;
receive(ReBuf,ReBufLen);
for(delay=650;delay>0;delay--) ;
if(ReBuf[0]==0xaa)
{
RT_CONT_485=1;
for(delay=650;delay>0;delay--) ;
transmit( ReBuf,ReBufLen );
for(delay=650;delay>0;delay--) ;
RT_CONT_485=0;
ReBuf[0]=0;
}
EX0 = 1;
}
void main( void )
{
IT0=0; //INT0 and INT1 is triggered by LOW level
IE = 0x8B; //EA=1,ET1=1,ET0=1,EX0=1,the rest are all zero
TMOD = 0x11;//T0 and T1 are both 16-bit timer(mod 1)
IP = 0x09; //PX0=1,PT1=1,PT0=0,INT0 is high,T1 is middle, T0 is low
UARTInit_T2();
while(1)
{
_nop_();
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -