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

📄 etr232i.cpp

📁 英创386模块的RS485控制协议和函数,还有例程
💻 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		TMR0SIZE	0xF533
#define		MULTIPLIER	1143L

struct GPIOPos
{
   unsigned int RegIdx;
   unsigned int PosIdx;
};

struct GPIOPos Tab[8] = { { 0, 0 },  { 0, 10 }, { 0, 15 }, { 1, 9 },
			  { 1, 10 }, { 1, 11 }, { 1, 12 }, { 1, 13 } };

// Valid bits: Dir[0], Dir[1], ... Dir[7]
// Dir[i] = 0: output
// Dir[i] = 1: input (default setting)
unsigned char GPIODirCfg( unsigned char Dir )
{
   unsigned int i1, i2, i3;
   unsigned int DirReg[2], ModeReg[2];

   // get current setting:
   ModeReg[0] = inport( PIOMODE0 );
   DirReg[0] = inport( PIODIR0 );
   ModeReg[1] = inport( PIOMODE1 );
   DirReg[1]= inport( PIODIR1 );

   for( i1=0; i1<8; i1++ )
      {
      i2 = 1<<Tab[i1].PosIdx;
      i3 = 1<<i1;
      if( Dir&i3 )		// set as input
	 {
	 ModeReg[Tab[i1].RegIdx] &= ~i2;
	 DirReg[Tab[i1].RegIdx] |= i2;
	 }
      else			// set as output
	 {
	 ModeReg[Tab[i1].RegIdx] |= i2;
	 DirReg[Tab[i1].RegIdx] &= ~i2;
	 }
      }

   outport( PIOMODE0, ModeReg[0] );
   outport( PIODIR0, DirReg[0] );
   outport( PIOMODE1, ModeReg[1] );
   outport( PIODIR1, DirReg[1] );
   return 0;
}

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

   disable( );
   // default value
   DatReg[0] = inport(PIODATA0);
   DatReg[1] = inport(PIODATA1);

   for( i1=0; i1<8; i1++ )
      {
      i2 = 1<<Tab[i1].PosIdx;
      i3 = 1<<i1;
      if( Value&i3 )		// set as 1
	 DatReg[Tab[i1].RegIdx] |= i2;
      else			// set as 0
	 DatReg[Tab[i1].RegIdx] &= ~i2;
      }

   outport( PIODATA0, DatReg[0] );
   outport( PIODATA1, DatReg[1] );
   enable( );
}

// return input status
unsigned char GPIORead( )
{
   unsigned int  i1, i2, i3, i4;
   unsigned int  DatReg[2];
   unsigned char ub1;

   // current value
   DatReg[0] = inport( PIODATA0 ) & inport( PIODIR0 );
   DatReg[1] = inport( PIODATA1 ) & inport( PIODIR1 );

   i4 = 0;
   for( i1=0; i1<8; i1++ )
      {
      i2 = 1<<Tab[i1].PosIdx;
      i3 = 1<<i1;
      if( DatReg[Tab[i1].RegIdx]&i2 )   // set as 1
	 i4 |= i3;
      else				// set as 0
	 i4 &= ~i3;
      }

   return (unsigned char)i4;
}

// BitIdx = 0, 1, ...7
unsigned int GPIOSetBit( int BitIdx, int L10 )
{
   unsigned int  i1, i2;
   unsigned int  DatReg[2];

   disable( );
   // current value
   DatReg[0] = inport( PIODATA0 );
   DatReg[1] = inport( PIODATA1 );

   i2 = 1<<Tab[BitIdx].PosIdx;
   if( L10 ) DatReg[Tab[BitIdx].RegIdx] |= i2;
   else      DatReg[Tab[BitIdx].RegIdx] &= ~i2;

   if( Tab[BitIdx].RegIdx == 0 )  outport( PIODATA0, DatReg[0] );
   else                           outport( PIODATA1, DatReg[1] );
   enable( );

   return 0;
}

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

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

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

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

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

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

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

// L10 = 0, 1
void  GPRS_AUX( int L10 )
{
   if( L10 ) outportb( 0x23, 0x03 );
   else      outportb( 0x23, 0x01 );
}

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

   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 );
      }
}

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

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

void SysReboot( )
{
   disable( );
   outport( 0xff28, 0x07fd );        // mask all interrupts
   asm db	0xea
   asm dw	0xfff0
   asm dw	0xf000
}
unsigned int WDTReg = 0;
////////////////////////////////////////////////////////
// watchdog duration time = 1exp2(ExpNum)/24.0MHz
// ExpNum = 0: disable WDT
// ExpNum = 25, 26: enable WDT
////////////////////////////////////////////////////////
int   SetWDT( int ExpNum )
{
   switch( ExpNum )
      {
      case 25: WDTReg = 0xc040; break;          // enable WDT
      case 26: WDTReg = 0xc080; break;          // enable WDT
      default: WDTReg = 0;			// disable WDT
      }

   outport( WDTCTRL, 0x3333 );		// keyed sequence for writing
   outport( WDTCTRL, 0xCCCC );
   outport( WDTCTRL, WDTReg );

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

int   ReloadWDT( )
{
//   outport( WDTCTRL, 0x3333 );		// keyed sequence for writing
//   outport( WDTCTRL, 0xCCCC );
//   outport( WDTCTRL, WDTReg );

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

⌨️ 快捷键说明

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