亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? driver.c

?? 研華工控卡PCL836的一些例程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
//--------------------------------------------------------------------------d
//
//     PCL-836 Driver
//
//--------------------------------------------------------------------------
#include <dos.h>
#include <stdio.h>
#include <bios.h>
#include <conio.h>
#include <stdlib.h>
#include "..\driver.h"

// Global variables
USHORT usBaseAddr[10] = {0,0,0,0,0,0,0,0,0,0};  // save base address location
USHORT usPreState[10][2];     // digital output previous state
USHORT usFirstCount[10][6];   // first read counter value for event counter
ULONG  ulOverflow[10][6];     // overflow flag for event counter
USHORT usPreCount[10][6];     // previous count state for event counter
USHORT usFoutCtrReg[10];      // frequency output control register
USHORT usModeCtrReg[10][6];   // control clock input mode control register

// Function prototypes
ULONG DoSection(USHORT ,USHORT, USHORT ,USHORT);
ULONG DiSection(USHORT, USHORT, USHORT *);
ULONG GetDoStatus(USHORT, USHORT, USHORT *);

//-------------------------------------------------------------------
// Function    : DeviceOpen
// PURPOSE     : Retrieves the parameters pertaining to the device
//               operation from Global Variable , and store it for
//               quick reference. This function must be called
//               before any other functions
// Parameters  : DeviceNumber (IN), BaseAddr(OUT)
// Return      : NULL (success)
//				 ErrorCode (failure)
// Call/Called procedure cross reference :
// Call        Called		     Explanation
//------------------------------------------------------------------
ULONG DeviceOpen(USHORT DeviceNumber, USHORT BaseAddr)
{
    USHORT usIndex;
    // Is DeviceNumber out of range ?
    if (DeviceNumber > MaxBoardNumber)
        return ((ULONG) InvalidDeviceNumber);

    // Is BaseAddr valid ?
    if (BaseAddr == NULL)
        return ((ULONG) InvalidBaseAddr);

    // Is BaseAddr in use ?
    if (usBaseAddr[DeviceNumber] != NULL)
        return ((ULONG) DeviceIsBusy); // If you have this error, you
                                       // can call DeviceClose to reset it.

    // everything is OK then initiate some Global variables by DeviceNumber
    usPreState[DeviceNumber][0] = 0;   // for digital output port 0
    usPreState[DeviceNumber][1] = 0;   // for digital output port 1

    for (usIndex=0 ; usIndex < MaxCounterNumber ; usIndex++)
    {
        // use by event counter
        usFirstCount[DeviceNumber][usIndex] = 0;
        ulOverflow[DeviceNumber][usIndex]   = 0;
        usPreCount[DeviceNumber][usIndex]   = 0;
        usFoutCtrReg[DeviceNumber]          = 0;
        usModeCtrReg[DeviceNumber][usIndex] = 0;
    }

    // set Global variable by DeviceNumber
    usBaseAddr[DeviceNumber] = BaseAddr;

    // return success
    return ((ULONG) NULL);
}

//------------------------------------------------------------------
// Function    : DeviceClose
// PURPOSE     : Resets Device by DeviceNumber.
// Parameters  : DeviceNumber (IN)
// Return      : NULL (success)
//				 ErrorCode (failure)
// Call/Called procedure cross reference :
// Call        Called		     Explanation
// CounterReset
//------------------------------------------------------------------
ULONG DeviceClose(USHORT DeviceNumber)
{
    USHORT usIndex;
    // Is DeviceNumber out of range ?
    if (DeviceNumber > MaxBoardNumber)
        return ((ULONG) InvalidDeviceNumber);

    // Is BaseAddr valid ?
    if (usBaseAddr[DeviceNumber] == NULL)
        return ((ULONG) LostBaseAddr);

    // Reset counters by DeviceNumber
    for (usIndex=0 ; usIndex < MaxCounterNumber ; usIndex++)
        CounterReset(DeviceNumber, usIndex);

    // Reset Golbal variable
    usBaseAddr[DeviceNumber] = 0;

    return ((ULONG) NULL);
}

//------------------------------------------------------------------
// Function    : CounterConfig
// PURPOSE     : This function config the counter mode of specified counter
//               (default is positive edge without filter)
// Parameters  : DeviceNumber(IN), counter(IN), CounterEdge(IN)
//               MaxInFreq(IN)
//               312K is high limitation of MaxInFreq.
// Return      : NULL (success)
//				 ErrorCode (failure)
// Call/Called procedure cross reference :
// Call        Called		     Explanation
//------------------------------------------------------------------
extern ULONG CounterConfig(USHORT DeviceNumber, USHORT counter,
                           USHORT CounterEdge, FLOAT MaxInFreq)
{
    USHORT usCount;
    USHORT usCtrByte, usLowByte, usHighByte;
    ULONG  retCode;
    FLOAT  fFout;

    // Is DeviceNumber out of range ?
    if (DeviceNumber > MaxBoardNumber)
        return ((ULONG) InvalidDeviceNumber);

    // Is BaseAddr valid ?
    if (usBaseAddr[DeviceNumber] == NULL)
        return ((ULONG) LostBaseAddr);

    // check input param correct ?
    if (counter > MaxCounterNumber)
        return((ULONG) InvalidCounterChannel);

    // check MaxInFreq is out of range ?
    if (MaxInFreq > (FLOAT)312000.0)
        return((ULONG) InvalidFreqRange);

    usModeCtrReg[DeviceNumber][counter] = 0x00;

    if (CounterEdge == 1)   // this mode is negative edge
        usModeCtrReg[DeviceNumber][counter] = 0x04;

    if (MaxInFreq != (FLOAT)0.0)
    {
       // set control with digital filter
       usModeCtrReg[DeviceNumber][counter] |= 0x01;

       // set filter wide
       fFout = MaxInFreq*8*2;

       retCode = FreqOutStart(DeviceNumber, counter, fFout);
       if (retCode != 0L)
          return(retCode);
    }

    return ((ULONG) 0);
}

//------------------------------------------------------------------
// Function    : CounterPulseStart
// PURPOSE     : Configures the specified counter for pulse
//               output and starts the counter.
// Parameters  : DeviceNumber(IN), counter(IN),
//               period(IN)  in ms
//               UpCycle(IN) in ms
// Return      : NULL (success)
//				 ErrorCode (failure)
// Call/Called procedure cross reference :
// Call        Called		     Explanation
//------------------------------------------------------------------
ULONG CounterPulseStart(USHORT DeviceNumber,USHORT counter,
    FLOAT period, FLOAT UpCycle)
{
    USHORT usBase;
    DWORD  divisor;
    USHORT usCtrByte, usLowByte, usHighByte;
    FLOAT  fUserHz;
    FLOAT fFout;
    USHORT usCount0, usCount3;
    ULONG retCode;

    // Is DeviceNumber out of range ?
    if (DeviceNumber > MaxBoardNumber)
        return ((ULONG) InvalidDeviceNumber);

    // Is BaseAddr valid ?
    if (usBaseAddr[DeviceNumber] == NULL)
        return ((ULONG) LostBaseAddr);

    // check input param correct ?
    if (counter > MaxPWMNumber)
        return((ULONG) InvalidCounterChannel);

    // check Period is out of range ?
    if ((period  > (FLOAT)10000)   || (UpCycle > (FLOAT)10000) ||
        (period == 0)              || (UpCycle == 0)            ||
        (UpCycle >= period))
        return((ULONG) InvalidInputParam);

    // get base address
    usBase = usBaseAddr[DeviceNumber];

    /* configure counter for external clocking */
    outportb(usBase+counter+18, 0x03);

    // configures counter 0 and counter 3 (for PWM channel 0)
    // configures counter 1 and counter 4 (for PWM channel 1)
    // configures counter 2 and counter 5 (for PWM channel 2)

    fUserHz = (FLOAT)((FLOAT)1.0/period)*1000;

    if (fUserHz > (FLOAT)2500000.0)  // check out of 2.5Mhz
        return((ULONG) InvalidFreqRange);

    // FOUT select
    if (fUserHz >= (FLOAT)F100HZ)
        fFout = (FLOAT)5000000.0;
    else if (fUserHz >= (FLOAT)F10HZ)
        fFout = (FLOAT)500000.0;
    else if (fUserHz >= (FLOAT)F1HZ)
        fFout = (FLOAT)50000.0;
    else if (fUserHz >= (FLOAT)F0_1HZ)
        fFout = (FLOAT)5000.0;

    usCount3 = (USHORT)(fFout/fUserHz);

   // FOUT enable
   retCode = FreqOutStart(DeviceNumber, counter, fFout);
   if (retCode != 0L)
        return(retCode);

   // set counter 3 (or 4, 5)
   usCtrByte = (counter%3) << 6;
   usCtrByte |= 0x34;
   usLowByte = (USHORT)(usCount3 & 0x000000FF);
   usHighByte = (USHORT)((usCount3 &  0x0000FF00) >> 8);

   outportb(usBase+counter+21, 0x02);        /* set internal clock */
   outportb(usBase+15, usCtrByte);
   outportb(usBase+counter+12, usLowByte);       /* write low byte */
   outportb(usBase+counter+12, usHighByte);      /* write high byte */

   // set counter 0 (or 1, 2)
   usCount0 = usCount3*((FLOAT)(period-UpCycle)/period);

   usCtrByte = (counter%3) << 6;
   usCtrByte |= 0x3a;
   usLowByte = (USHORT)(usCount0 & 0x000000FF);
   usHighByte = (USHORT)((usCount0 &  0x0000FF00) >> 8);

   outportb(usBase+counter+18, 0x03);        /* set internal clock */
   outportb(usBase+11, usCtrByte);
   outportb(usBase+counter+8, usLowByte);       /* write low byte */
   outportb(usBase+counter+8, usHighByte);      /* write high byte */


    return 0L;
}

//------------------------------------------------------------------
// Function    : FreqOutStart
// PURPOSE     : Configures the specified counter for frequency output
//               and starts the counter. (internal base clock is 10MHZ)
// Parameters  : DeviceNumber(IN), counter(IN), fout(IN)
//               fout range is from 153HZ to 5MHZ
// Return      : NULL (success)
//				 ErrorCode (failure)
// Call/Called procedure cross reference :
// Call        Called		     Explanation
//------------------------------------------------------------------
ULONG FreqOutStart(USHORT DeviceNumber, USHORT counter, FLOAT fout)
{
    USHORT usBase, usCount;
    USHORT usCtrByte, usLowByte, usHighByte;
    FLOAT  fBalance;

    // Is DeviceNumber out of range ?
    if (DeviceNumber > MaxBoardNumber)
        return ((ULONG) InvalidDeviceNumber);

    // Is BaseAddr valid ?
    if (usBaseAddr[DeviceNumber] == NULL)
        return ((ULONG) LostBaseAddr);

    // check input param correct ?
    if (counter > MaxCounterNumber)
        return((ULONG) InvalidCounterChannel);

    // get base address
    usBase = usBaseAddr[DeviceNumber];

    // check input fout is out of range ?
    if (( fout > (float)5000000.0) ||  ( fout < (float)153.0))
        return((ULONG) InvalidFreqRange);

    fBalance = (float)10000000.0f / fout;
    usCount = (USHORT) fBalance;

    if (((FLOAT)fBalance*10 - (FLOAT)usCount*10) > 4)
        usCount ++;

    usLowByte = (USHORT)(usCount & 0x000000FF);
    usHighByte = (USHORT)((usCount &  0x0000FF00) >> 8);

    usCtrByte = (counter%3) << 6;
    usCtrByte |= 0x36;

    if (counter < 3)
    {
       outportb(usBase+3, usCtrByte);     // Mode 3
       outportb(usBase+counter, usLowByte);       /* write low byte */
       outportb(usBase+counter, usHighByte);      /* write high byte */
    }
    else
    {
       outportb(usBase+7, usCtrByte);     // Mode 3
       outportb(usBase+(counter%3)+4, usLowByte);  /* write low byte */
       outportb(usBase+(counter%3)+4, usHighByte); /* write high byte */
    }

    // enable frequency output control reg.
    usCtrByte = 0x01;
    usCtrByte = usCtrByte << counter;
    usFoutCtrReg[DeviceNumber] |= usCtrByte;

    outportb(usBase+24, usFoutCtrReg[DeviceNumber]);

    return 0L;
}

//------------------------------------------------------------------
// Function    : FreqOutStop
// PURPOSE     : This function stop the Frequency out of specified counter
// Parameters  : DeviceNumber(IN), counter(IN)
// Return      : NULL (success)
//				 ErrorCode (failure)
// Call/Called procedure cross reference :
// Call        Called		     Explanation
//------------------------------------------------------------------
ULONG FreqOutReset(USHORT DeviceNumber, USHORT counter)
{
    USHORT usBase, usCtrByte;

    // Is DeviceNumber out of range ?
    if (DeviceNumber > MaxBoardNumber)
        return ((ULONG) InvalidDeviceNumber);

    // Is BaseAddr valid ?
    if (usBaseAddr[DeviceNumber] == NULL)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合色8888| 一区二区在线免费观看| 国产欧美在线观看一区| 亚洲卡通欧美制服中文| 蜜桃视频在线一区| 91色九色蝌蚪| 精品福利av导航| 亚洲图片欧美色图| www.爱久久.com| 久久综合五月天婷婷伊人| 亚洲一区二区三区在线看| 成人蜜臀av电影| 日韩三级视频中文字幕| 亚洲午夜国产一区99re久久| 国产a视频精品免费观看| 91精品欧美久久久久久动漫| 亚洲色图在线视频| 国产成人a级片| 精品嫩草影院久久| 日韩av高清在线观看| 在线观看区一区二| 亚洲日本电影在线| 成人一级片网址| 久久久久久毛片| 久久精品国产精品亚洲综合| 欧美卡1卡2卡| 亚洲va欧美va人人爽午夜| 日本精品一区二区三区高清| 中文成人综合网| 成人av动漫在线| 亚洲国产精品激情在线观看 | 在线一区二区三区| 亚洲欧美一区二区视频| 国产电影精品久久禁18| www激情久久| 韩国一区二区在线观看| 日韩免费视频一区| 狠狠色伊人亚洲综合成人| 精品播放一区二区| 韩国毛片一区二区三区| 精品第一国产综合精品aⅴ| 日韩成人一区二区| 日韩欧美激情一区| 国产精品自拍在线| 国产欧美久久久精品影院| 国产福利电影一区二区三区| 国产日韩一级二级三级| 成人黄色大片在线观看| 中文字幕亚洲综合久久菠萝蜜| 不卡av电影在线播放| 亚洲欧洲精品一区二区精品久久久| 成人免费观看男女羞羞视频| 中文字幕一区二区三区在线观看| 不卡区在线中文字幕| 亚洲人午夜精品天堂一二香蕉| 在线一区二区三区| 青娱乐精品视频| 久久色视频免费观看| 成人黄色片在线观看| 亚洲精品成人天堂一二三| 欧美日韩精品一区二区三区蜜桃| 人人爽香蕉精品| 国产亚洲精品bt天堂精选| 97成人超碰视| 午夜精品影院在线观看| 精品国产免费一区二区三区香蕉| 国产·精品毛片| 亚洲综合区在线| 欧美成人福利视频| 成人精品高清在线| 午夜电影网亚洲视频| 欧美精品一区二区三区视频| 91亚洲男人天堂| 美女精品一区二区| 中文字幕成人av| 欧美一区二区二区| www.综合网.com| 奇米一区二区三区av| 中文字幕在线不卡视频| 日韩一区二区在线播放| 不卡电影免费在线播放一区| 日韩国产精品久久久久久亚洲| 久久精品亚洲一区二区三区浴池| 欧美在线不卡一区| 国产不卡高清在线观看视频| 天天av天天翘天天综合网色鬼国产| 久久蜜桃一区二区| 欧美三级电影网| www.日韩精品| 久久99深爱久久99精品| 亚洲国产另类av| 国产精品国产三级国产a| 精品国产免费久久| 欧美猛男男办公室激情| 99久久精品国产一区二区三区 | 日韩成人午夜电影| 亚洲女同一区二区| 国产视频一区在线播放| 日韩美女天天操| 欧美理论电影在线| 在线免费观看日本欧美| 91蝌蚪国产九色| 国产一区二区看久久| 日韩精品91亚洲二区在线观看| 亚洲视频一区在线| 国产精品久久久久影院亚瑟| 国产欧美一区在线| 久久青草欧美一区二区三区| 日韩欧美美女一区二区三区| 欧美挠脚心视频网站| 色94色欧美sute亚洲线路一久| 成人免费观看男女羞羞视频| 国产高清不卡一区二区| 精品一区二区免费| 精品影视av免费| 日韩制服丝袜av| 日韩成人午夜精品| 日韩电影在线免费看| 日韩激情在线观看| 首页国产欧美久久| 日韩在线卡一卡二| 日韩av网站在线观看| 日韩av在线免费观看不卡| 日本欧美一区二区| 久久精品99久久久| 国产美女精品一区二区三区| 蜜臀va亚洲va欧美va天堂| 美女mm1313爽爽久久久蜜臀| 久久精品国产**网站演员| 久久国产麻豆精品| 国产成人精品亚洲日本在线桃色| 国产不卡视频在线播放| 99久久亚洲一区二区三区青草| av日韩在线网站| 欧美色精品天天在线观看视频| 欧美日韩一区三区| 日韩一二在线观看| 国产亚洲制服色| 亚洲日本电影在线| 亚洲成人自拍偷拍| 精品亚洲欧美一区| 成人精品国产一区二区4080| 日本电影亚洲天堂一区| 欧美巨大另类极品videosbest | 国产在线一区观看| 成人中文字幕电影| 欧美性生活一区| 日韩精品一区二区三区swag| 久久久电影一区二区三区| 亚洲欧洲成人av每日更新| 亚洲成人午夜电影| 久草精品在线观看| 99久久精品免费看| 日韩一卡二卡三卡国产欧美| 久久你懂得1024| 一区二区三区91| 极品美女销魂一区二区三区| 99精品视频免费在线观看| 欧洲一区二区av| 久久亚区不卡日本| 亚洲人精品午夜| 久草精品在线观看| 91福利精品视频| 国产调教视频一区| 偷拍一区二区三区四区| 国产99精品视频| 欧美人动与zoxxxx乱| 国产精品系列在线| 久久国产精品露脸对白| 色偷偷88欧美精品久久久| 精品人在线二区三区| 一区二区三区欧美| 国产不卡一区视频| 日韩视频不卡中文| 夜夜揉揉日日人人青青一国产精品 | 日本一区二区视频在线| 五月天激情综合| 色综合久久综合网97色综合| 精品国产免费人成在线观看| 亚洲一区二区五区| zzijzzij亚洲日本少妇熟睡| 欧美xxx久久| 视频在线在亚洲| 欧美色手机在线观看| 1000精品久久久久久久久| 国产一区二区女| 日韩免费视频一区二区| 日韩综合小视频| 欧美日韩亚洲高清一区二区| 亚洲人成网站影音先锋播放| 国产999精品久久久久久| 日韩免费观看高清完整版在线观看| 亚洲一区二区在线观看视频| 成人av在线网| 国产精品午夜春色av| 国产精品亚洲午夜一区二区三区 | 中文字幕制服丝袜一区二区三区| 国内欧美视频一区二区 | 91浏览器在线视频| 欧美国产精品久久|