ctkdll.c

来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C语言 代码 · 共 329 行

C
329
字号
#include <windows.h>
#include <dos.h>
#include <conio.h>

#include "def.h"
#include "ctkdef.h"

UINT CTCAddr[16]={ CTCA0, CTCA0+1, CTCA0+2, CTCA0+3,
                   CTCA1, CTCA1+1, CTCA1+2, CTCA1+3,
                   CTCA2, CTCA2+1, CTCA2+2, CTCA2+3,
                   CTCA3, CTCA3+1, CTCA3+2, CTCA3+3
                 };
unsigned char CTCCtrl[3]={ 0x36, 0x76, 0xb6 };
/*
#define SIOA0  0x140
#define SIOA1  0x150
#define SIOA2  0x180
#define SIOA3  0x190
#define SIOA4  0x240
#define SIOA5  0x250
#define SIOA6  0x280
#define SIOA7  0x290
*/
UINT SIODataAddr[64]={ SIOA0, SIOA0+1, SIOA0+4, SIOA0+5, SIOA0+8, SIOA0+9, SIOA0+0xc, SIOA0+0xd,
                       SIOA1, SIOA1+1, SIOA1+4, SIOA1+5, SIOA1+8, SIOA1+9, SIOA1+0xc, SIOA1+0xd,
                       SIOA2, SIOA2+1, SIOA2+4, SIOA2+5, SIOA2+8, SIOA2+9, SIOA2+0xc, SIOA2+0xd,
                       SIOA3, SIOA3+1, SIOA3+4, SIOA3+5, SIOA3+8, SIOA3+9, SIOA3+0xc, SIOA3+0xd,
                       SIOA4, SIOA4+1, SIOA4+4, SIOA4+5, SIOA4+8, SIOA4+9, SIOA4+0xc, SIOA4+0xd,
                       SIOA5, SIOA5+1, SIOA5+4, SIOA5+5, SIOA5+8, SIOA5+9, SIOA5+0xc, SIOA5+0xd,
                       SIOA6, SIOA6+1, SIOA6+4, SIOA6+5, SIOA6+8, SIOA6+9, SIOA6+0xc, SIOA6+0xd,
                       SIOA7, SIOA7+1, SIOA7+4, SIOA7+5, SIOA7+8, SIOA7+9, SIOA7+0xc, SIOA7+0xd
                     };
UINT SIOCtrlAddr[64]={ SIOA0+2, SIOA0+3, SIOA0+6, SIOA0+7, SIOA0+0xa, SIOA0+0xb, SIOA0+0xe, SIOA0+0xf,
                       SIOA1+2, SIOA1+3, SIOA1+6, SIOA1+7, SIOA1+0xa, SIOA1+0xb, SIOA1+0xe, SIOA1+0xf,
                       SIOA2+2, SIOA2+3, SIOA2+6, SIOA2+7, SIOA2+0xa, SIOA2+0xb, SIOA2+0xe, SIOA2+0xf,
                       SIOA3+2, SIOA3+3, SIOA3+6, SIOA3+7, SIOA3+0xa, SIOA3+0xb, SIOA3+0xe, SIOA3+0xf,
                       SIOA4+2, SIOA4+3, SIOA4+6, SIOA4+7, SIOA4+0xa, SIOA4+0xb, SIOA4+0xe, SIOA4+0xf,
                       SIOA5+2, SIOA5+3, SIOA5+6, SIOA5+7, SIOA5+0xa, SIOA5+0xb, SIOA5+0xe, SIOA5+0xf,
                       SIOA6+2, SIOA6+3, SIOA6+6, SIOA6+7, SIOA6+0xa, SIOA6+0xb, SIOA6+0xe, SIOA6+0xf,
                       SIOA7+2, SIOA7+3, SIOA7+6, SIOA7+7, SIOA7+0xa, SIOA7+0xb, SIOA7+0xe, SIOA7+0xf
                     };

HWND _far hWndEvent;
WPARAM _far wParamEvent;

CHANNELPARAM FAR *lpChannelP=NULL;
CTKSIO FAR *lpCtkSioP=NULL;

int Freq=0;
int SendMsgCnt=0;

void  interrupt ( *lpfnPrevISR3)();
void  interrupt ( *lpfnPrevISR5)();

extern void interrupt _far IntSvcRtn3(void);
extern void interrupt _far IntSvcRtn5(void);
/*
int FAR PASCAL _export InitOneComm(HWND hWnd, COMMPARA FAR *CommPara,BYTE CommNo);
int FAR PASCAL _export StopComm(COMMPARA FAR *CommPara,BYTE CommNo);
*/
int FAR PASCAL _export InitialCTK(HWND, CHANNELPARAM FAR *, CTKSIO FAR *);

int FAR PASCAL _export StopCTK();
void FAR PASCAL _export InitSIO(int SIONo);
int FAR PASCAL _export GetFrequency();
void FAR PASCAL _export SwitchToMain();
BOOL FAR PASCAL _export IsThisMachineMain();

int FAR PASCAL IsrStart(int iVector);
int FAR PASCAL IsrStop(int iVector);
void Open8259(int iVector);
void Close8259(int iVector);
int InitialSIO(int SIONo);
void InitIRQTimer(void);
void InitBaud(void);
void InitFreq(void);
void wait(int);
int frequency(void);
//----------------------------------------------------------------------------------------
int FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpszCmdLine)
{
  if (wHeapSize >0 ) UnlockData(0);
  return 1;
}

int FAR PASCAL WEP (int nParameter)
{
  return 1;
}

int FAR PASCAL IsrStart(int iVector)
{
  switch(iVector)
     {
     case IRQ3:
          lpfnPrevISR3=getvect(IRQ3);
          setvect(IRQ3, IntSvcRtn3);
          break;
     case IRQ5:
          lpfnPrevISR5=getvect(IRQ5);
          setvect(IRQ5, IntSvcRtn5);
          break;
     }
  return 1;
}

int FAR PASCAL IsrStop(int iVector)
{
  switch(iVector)
     {
      case IRQ3:  setvect(IRQ3, lpfnPrevISR3); break;
      case IRQ5:  setvect(IRQ5, lpfnPrevISR5); break;
     }
  return 1;
}
/*
int FAR PASCAL _export InitOneComm(HWND hWnd, COMMPARA FAR *CommPara,BYTE CommNo)
{
    char    COMMName[5];
    int     err;
    char    COMMStatus[16];
    StopComm(CommPara,CommNo);
    COMMPARA FAR *PARA=CommPara+CommNo;
    sprintf (COMMName,"COM%d",CommNo);
    sprintf (COMMStatus,"%s:%s,%c,%c,%c",COMMName,BAUD[PARA->Baud],VEREFY[PARA->Verefy],DATA[PARA->Datas],STOP[PARA->Stops]);
    PARA->IdCommDRV=OpenComm(COMMName,512,512);
    err=BuildCommDCI(COMMStatus,PARA->Ncb);
    err=SetCommState(PARA->Ncb);
    return 1;
}
int FAR PASCAL _export StopComm(COMMPARA FAR *CommPara,BYTE CommNo)
{
    CloseComm((CommPara+CommNo)->IdCommDRV);
}
*/
int FAR PASCAL _export InitialCTK(HWND hWnd, CHANNELPARAM FAR *lpCha, CTKSIO FAR *lpCTK)
{
  int i;

    if (!lpCTK) return 0;
    lpChannelP = lpCha; 
    lpCtkSioP = lpCTK;
    hWndEvent = hWnd;
    IsrStart(lpCtkSioP->DataRSIrqNo);
    IsrStart(lpCtkSioP->DataProcIrqNo);
	InitIRQTimer();
    InitBaud();
    InitFreq();
	for (i=0; i<lpCtkSioP->SIONum; i++) InitialSIO(i);
	Open8259(lpCtkSioP->DataRSIrqNo);
    Open8259(lpCtkSioP->DataProcIrqNo);
    return 1;
}
int FAR PASCAL _export StopCTK()
{
    IsrStop(lpCtkSioP->DataRSIrqNo);
    IsrStop(lpCtkSioP->DataProcIrqNo);
	Close8259(lpCtkSioP->DataRSIrqNo);
    Close8259(lpCtkSioP->DataProcIrqNo);
    return 1;
}

void FAR PASCAL _export SwitchToMain()
{
    outportb(SwitchMainA, 1);  //将本机设为主机
    wait(64);
}

BOOL FAR PASCAL _export IsThisMachineMain()
{
    BYTE inbyte;
    inbyte=inportb(SwitchPort);
    wait(64);
    if (inbyte & bit0) return TRUE;
      else return FALSE;
}

void FAR PASCAL _export InitSIO(int SIONo)
{
//   InitBaud();
   InitialSIO(SIONo);
}

int FAR PASCAL _export GetFrequency()
{
  SendMsgCnt=0;
  return(Freq);
}

void InitIRQTimer(void)
{
    if (!lpCtkSioP) return;
    disable();
    outportb(IRQCA,0xb6);
    wait(32);
    outportb(IRQCA,0x76);
    wait(32);
//irq3 0x7d0=2000
    outportb(IRQ3A,(BYTE)lpCtkSioP->IntTimer1);        //0xd0
    wait(32);
    outportb(IRQ3A,(BYTE)(lpCtkSioP->IntTimer1>>8));   //0x07
    wait(32);
//irq5 0x80e8=33000
    outportb(IRQ5A,(BYTE)lpCtkSioP->IntTimer2);        //0xe8
    wait(32);
    outportb(IRQ5A,(BYTE)(lpCtkSioP->IntTimer2>>8));   //0x80
    wait(32);
    enable();
}

int InitialSIO(int SIONo)
{
 unsigned char RegisterOrd[7]={ 0,4,6,7,1,5,3 };
 int j;
 
 for ( j=0; j<7; j++)
     {
      outportb(SIOCtrlAddr[SIONo], (BYTE)(lpCtkSioP->SIOWriteReg[SIONo][RegisterOrd[j]]>>8));
      wait(32);
      outportb(SIOCtrlAddr[SIONo], (BYTE)(lpCtkSioP->SIOWriteReg[SIONo][RegisterOrd[j]]));
      wait(32);
     }
  return 1;
}

void InitBaud(void)
{
 int i,j,k;

 for (i=0; i<4; i++)    //initial 64 SIO
  {
  for (j=0; j<3; j++)  
      {
       outportb(CTCAddr[i*4+3],CTCCtrl[j]);
       wait(32);
       outportb(CTCAddr[i*4+j],(BYTE)(lpCtkSioP->BaudRate[i*3+j]));
       wait(32);
       outportb(CTCAddr[i*4+j],(BYTE)(lpCtkSioP->BaudRate[i*3+j]>>8));
       wait(32);
      }
  }
}
/*
#define FreqAddrA1		0x124
#define FreqAddrA2		0x125
#define FreqAddrA3		0x126
#define FreqAddrC		0x127
#define FreqStatusAddr	0x128
#define ClearFreqAddr   0x12c

#define FreqStatusBit   0x2
*/
void InitFreq(void)
{
  outportb(FreqAddrC,0x36);
  wait(32);
  outportb(FreqAddrC,0x76);
  wait(32);
  outportb(FreqAddrC,0xb6);
  wait(32);
  outportb(FreqAddrA1,20);
  wait(32);
  outportb(FreqAddrA1,0);
  wait(32);
  outportb(FreqAddrA2,8);
  wait(32);
  outportb(FreqAddrA2,0);
  wait(32);
  outportb(FreqAddrA3,0);
  wait(32);
  outportb(FreqAddrA3,0);
  wait(32);
  outportb(ClearFreqAddr,0);
}

void Open8259(int iVector)
{
	BYTE	mask;

	disable();
	mask = inportb(0x21);
    mask &= ~(1<<(iVector-8));
    outportb(0x21, mask);
	wait(32);
	outportb(0x20,0x20);
	enable();
}

void Close8259(int iVector)
{
	BYTE	mask;
	disable();
	mask = inportb(0x21);
    mask |= (1<<(iVector-8));
	outportb(0x21,mask);
	enable();
}

void wait(int cnt)
{
 int i;
 for (i=0; i<cnt; i++)
      _asm  {nop}
     
}

int frequency(void)
{
 WORD Cnt=0, Cnt1=0;
 BYTE status;
 status = inportb(FreqStatusAddr);
 if (status & FreqStatusBit)
	{
	 Cnt1=(WORD)inportb(FreqAddrA3);
     wait(64);
	 Cnt=(WORD)inportb(FreqAddrA3);
     Cnt = Cnt*256 + Cnt1;
     Cnt ^= 0xffff;
	 if(Cnt)  Freq = (double)230400000/(double)Cnt;
	 outportb(FreqAddrC,0xb6);
	 wait(64);
	 outportb(FreqAddrA3,0);
	 wait(64);
	 outportb(FreqAddrA3,0);
	 wait(64);
	 outportb(ClearFreqAddr,0);
    }
 return  Freq;//jgx
}

⌨️ 快捷键说明

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