⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 etr232i_new.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
字号:
#include <dos.h>
#include "etr232i.h"

#define		PIOMODE0	0xFF70
#define		PIODIR0		0xFF72
#define		PIODATA0	0xFF74
#define		PIOMODE1	0xFF76
#define		PIODIR1		0xFF78
#define		PIODATA1	0xFF7A
#define		WDTCTRL		0xFFE6

#define         TMR0CNT		0xFF50
#define         TMR0CMPA	0xFF52
//#define		MULTIPLIER	1143L              //V8
//#define		MULTIPLIER	1000L              //V11
#define         MaxTick		0x1800beL

#define		GPIO0	0x0001          // PIODATA0
#define		GPIO1	0x0400  	// PIODATA0
#define		GPIO2	0x8000		// PIODATA0
#define		GPIO3	0x0200		// PIODATA1
#define		GPIO4	0x0400		// PIODATA1
#define		GPIO5	0x0800          // PIODATA1
#define		GPIO6	0x1000          // PIODATA1
#define		GPIO7	0x2000          // PIODATA1

unsigned int DatBit[8] = { GPIO0, GPIO1, GPIO2, GPIO3,
			   GPIO4, GPIO5, GPIO6, GPIO7 };

// Valid bits: Dir[0], Dir[1], ... Dir[7]
// Dir[i] = 0: output
// Dir[i] = 1: input (default setting)
unsigned char GPIODirCfg( unsigned char Dir, int BitIdx )
{
    unsigned int i1, portMode, portDir, N;

    if( BitIdx < 0 )
    {
	i1 = 0;         // setup all 8 bits
	N = 8;
    }
    else
    {
	i1 = BitIdx;
	N = i1 + 1;
    }

    disable( );
    for( ; i1<N; i1++ )
    {
	if( i1 < 3 )
	{
	    portMode = PIOMODE0;
	    portDir = PIODIR0;
	}
	else
	{
	    portMode = PIOMODE1;
	    portDir = PIODIR1;
	}

	if( Dir&(1<<i1) )		// input
	{
	    outport( portMode, inport(portMode)&~DatBit[i1] );
	    outport( portDir, inport(portDir)|DatBit[i1] );
	}
	else			// output
	{
	    outport( portMode, inport(portMode)|DatBit[i1] );
	    outport( portDir, inport(portDir)&~DatBit[i1] );
	}
    }
    enable( );
    return 0;
}

// Valid bits: Value[0], Value[1], ... Value[7]
void  GPIOWrite( unsigned char Value )
{
   unsigned int  i1;

   disable( );
   i1 = inport( PIODATA0 )&~(GPIO0|GPIO1|GPIO2);
   if( Value&0x01 ) i1 |= GPIO0;
   if( Value&0x02 ) i1 |= GPIO1;
   if( Value&0x04 ) i1 |= GPIO2;
   outport( PIODATA0, i1|inport(PIODIR0) );

   i1 = inport( PIODATA1 )&~(GPIO3|GPIO4|GPIO5|GPIO6|GPIO7);
   if( Value&0x08 ) i1 |= GPIO3;
   if( Value&0x10 ) i1 |= GPIO4;
   if( Value&0x20 ) i1 |= GPIO5;
   if( Value&0x40 ) i1 |= GPIO6;
   if( Value&0x80 ) i1 |= GPIO7;
   outport( PIODATA1, i1|inport(PIODIR1) );
   enable( );
}

// return input status
unsigned char GPIORead( )
{
   unsigned int  i1;
   unsigned char ub1;

   ub1 = 0;
   i1 = inport( PIODATA0 );
   if( i1&GPIO0 ) ub1 |= 0x01;
   if( i1&GPIO1 ) ub1 |= 0x02;
   if( i1&GPIO2 ) ub1 |= 0x04;

   i1 = inport( PIODATA1 );
   if( i1&GPIO3 ) ub1 |= 0x08;
   if( i1&GPIO4 ) ub1 |= 0x10;
   if( i1&GPIO5 ) ub1 |= 0x20;
   if( i1&GPIO6 ) ub1 |= 0x40;
   if( i1&GPIO7 ) ub1 |= 0x80;

   return ub1;
}

// BitIdx = 0, 1, ...7
unsigned int GPIOSetBit( int BitIdx, int L10 )
{
   unsigned int  port;

   disable( );
   if( BitIdx <= 2 ) port = PIODATA0;
   else		     port = PIODATA1;

   if( L10 ) outport( port, inport(port)|DatBit[BitIdx] );
   else      outport( port, inport(port)&~DatBit[BitIdx] );
   enable( );

   return 0;
}

// L10 = 0, 1
void  GPRS_STB( int L10 )
{
   unsigned int  Reg;

   disable( );
   // get current value
   Reg = inport( PIODATA0 );

   if( L10 ) Reg |= 0x2000;
   else      Reg &= 0xdfff;

   outport( PIODATA0, Reg );
   enable( );
}

// return = 0, 1
unsigned int GPRS_PWR( )
{
   unsigned int  Reg;

   // get current value
   Reg = inport( PIODATA0 ) & inport( PIODIR0 );

   if( Reg&0x0008 ) return 1;
   return 0;
}

// L10 = 0, 1
void  GPRS_AUX( int L10 )
{
    unsigned int ui1;

    //check PIO11 config
    if( inport(PIOMODE0)&0x0800 )	// V9, V11 version
    {
       disable( );
       // get current value
       ui1 = inport( PIODATA0 );

       if( L10 ) ui1 |= 0x0800;		// PIO11 as GPRS_AUX
       else      ui1 &= ~0x0800;

       outport( PIODATA0, ui1 );
       enable( );
    }
    else                         	// V8 version
    {
       if( L10 ) outportb( 0x23, 0x03 );
       else      outportb( 0x23, 0x01 );
    }
}

void NB_Delay( unsigned int milliseconds )
{
   unsigned long MULTIPLIER;
   unsigned long stop;
   unsigned int  cur, prev;
   unsigned int  TMR0SIZE;

   TMR0SIZE = inport(TMR0CMPA);
   if( TMR0SIZE==0xD68D )          MULTIPLIER = 1000;
   else                            MULTIPLIER = 1143;

   prev = inport( TMR0CNT );
   stop = prev + ((unsigned long)milliseconds * MULTIPLIER);

   cur = inport( TMR0CNT );
   while( cur < stop )
      {
      if(cur < prev)     /* Check for timer wraparound */
	 {
	 if (stop < TMR0SIZE) break;
	 stop -= TMR0SIZE;
	 }
      prev = cur;
      cur = inport( TMR0CNT );
      }
}


void NB_DelayUS( unsigned int microseconds )
{
   unsigned long stop;
   unsigned int  cur, prev;
   unsigned int  TMR0SIZE;

   TMR0SIZE = inport(TMR0CMPA);
   prev = inport( TMR0CNT );
   stop = prev + (unsigned long)microseconds;

   cur = inport( TMR0CNT );
   while( cur < stop )
      {
      if(cur < prev)     /* Check for timer wraparound */
	 {
	 if (stop < TMR0SIZE) break;
	 stop -= TMR0SIZE;
	 }
      prev = cur;
      cur = inport( TMR0CNT );
      }
}

// timer1's input clock = 1MHz
int SetTMR1( unsigned Divider )
{
   unsigned int i1;

   i1 = Divider / 2;
   outport( 0xff5a, i1 );
   i1 = Divider - i1;
   outport( 0xff5c, i1 );
   return 0;
}

void SysReboot( )
{
   disable( );
   outport( 0xff28, 0x07fd );        // mask all interrupts
   asm db	0xea
   asm dw	0xfff0
   asm dw	0xf000
}

////////////////////////////////////////////////////////
// watchdog duration time = 1exp2(ExpNum)/24.0MHz
// ExpNum = 0: disable WDT
// ExpNum = 25, 26: enable WDT
////////////////////////////////////////////////////////
int   SetWDT( int ExpNum )
{
   unsigned int WDTReg;

   switch( ExpNum )
      {
      case 25: WDTReg = 0xc040; break;          // enable WDT
      case 26: WDTReg = 0xc080; break;          // enable WDT
      default: WDTReg = 0;			// disable WDT
      }

   // cleanup MAX706 before enable it!
   outport( PIODATA0, inport(PIODATA0)^0x0002 );
   outport( WDTCTRL, 0x3333 );		// keyed sequence for writing
   outport( WDTCTRL, 0xCCCC );
   outport( WDTCTRL, WDTReg );
   outportb( 0x2a, 0 );			// enable MAX706

   return ReloadWDT( );
}

int   ReloadWDT( )
{
   // reload MAX706
   outport( PIODATA0, inport(PIODATA0)^0x0002 );

   outport( WDTCTRL, 0x5555 );		// keyed sequence for reading
   outport( WDTCTRL, 0xAAAA );
   if( inport(WDTCTRL)&0x8000 ) return 1;
   return 0;
}

unsigned long NB_DayCnt = 0;
unsigned long NB_PrevTick = 0;

unsigned long NB_clock( )
{
   unsigned long currtick;

   disable( );
   currtick = *((unsigned long far*)(0x0040006Cl));
   enable( );

   if( currtick < NB_PrevTick ) NB_DayCnt += MaxTick;
   NB_PrevTick = currtick;

   currtick = NB_PrevTick + NB_DayCnt;
   return currtick;	//overflow happens after 2730 days since power on!!!
}

void CacheEnable( )
{
   unsigned long MACBuffer;
   unsigned int  loww, highw;

   // for etr232i: 0xb4000 - 0xbe000 => 40KB
   MACBuffer = 0xb4000L;
   // Non-Cache Region0 for MAC descriptor and buffer
   loww = (unsigned int)MACBuffer & 0xffff;
   highw = (unsigned int)(MACBuffer>>16);
   outport(0xfec2, loww);			// NCR0 start low word
   outport(0xfec4, highw);			// NCR0 start high word
   MACBuffer += 0x0a000L;			// Buffer size = 40kb
   loww = (unsigned int)MACBuffer & 0xffff;
   highw = (unsigned int)(MACBuffer>>16);
   outport(0xfec6, loww);			// NCR0 end low word
   outport(0xfec8, highw);			// NCR0 end high word

   // Cache Control Setting
   outport(0xfec0, 0xc100);			// NCR0 enable
}

void  SetCS0AsMem( )
{
	outportb( 0x90, 1 );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -