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 + -
显示快捷键?