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

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

?? serial.c

?? mcs51,2051,x86系列MCU
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
;; Copyright (C) Intel Corporation 1994
;;          All Rights Reserved.
;;
;; The Software is provided "AS IS."
;;
;; LIMITATION OF LIABILITY:    NEITHER INTEL NOR ITS VENDORS OR AGENTS
;;     SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA,
;;     INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR
;;     CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR
;;     OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/

#include <conio.h>
#include <string.h>
#include <DOS.h>

#include "80386ex.h"
#include "EV386EX.h"
#include "support.h"


/* APB_BLOCK_START = SIO */

/*
   InitSIO:

   Description:
      Initialization routine for Asynchronous Serial I/O Port.

   Parameters:
      Unit     Unit number of the serial port.  0 for SIO port 0, 1 for SIO port 1.
      Mode     Defines Parity, number of data bits, number of stop bits... Reference Serial Line
               Control register for various options
      ModemCntrl  Defines the operation of the modem control lines
      BaudRate Specifies baud rate.  The baud divisor value is calculated based on clocking source
               and clock frequency.  The clocking frequency is set by calling the InitializeLibrary
               function.
      ClockRate   Specifies the serial port clocking rate, for internal clocking = CLK2 for external = COMCLK

   Returns: Error Codes
      E_INVAILD_DEVICE  -- Unit number specifies a non-existing device
      E_OK           -- Initialized OK, No error.

   Assumptions:
        SIOCFG  Has already been configured for Clocking source and Modem control source

      REMAPCFG register has Expanded I/O space access enabled (ESE bit set).
      The processor Port pin are initialized separately.

    Syntax:

       #define SIO_0             0
       #define SIO_8N1           (SIO_8DATA | SIO_1STOPBIT | SIO_NOPARITY)
       #define SIO_MCR_RTS       0x2
       #define SIO_MCR_DTR       0x1
       #define SIO_8DATA         0x3
       #define SIO_1STOPBIT      0x0
       //Clock rate of COMCLK, ie. External clocking
       #define BAUD_CLKIN  1843200L

       int error;

       error = InitSIO(SIO_0,                     // Which Serial Port
                       SIO_8N1,                   // Mode, 8-data, no parity, 1-stop
                       SIO_MCR_RTS+SIO_MCR_DTR,   // Modem line controls
                       9600,                      // Baud Rate
                       BAUD_CLKIN);               // Baud Clocking Rate

   Real/Protected Mode:
      No changes required.

*/

int InitSIO(int Unit, BYTE Mode, BYTE ModemCntrl, DWORD BaudRate, DWORD BaudClkIn)
{
   WORD SIOPortBase;
   WORD BaudDivisor;

      /* Check for valid unit */
   if(Unit > 1)
      return E_INVALID_DEVICE;

      /* Set Port base based on serial port used */
   SIOPortBase = (Unit ? SIO1_BASE : SIO0_BASE);

   /* Initialized Serial Port registers */
      /* Calculate the baud divisor value, based on baud clocking */
   BaudDivisor = (WORD)(BaudClkIn / (16*BaudRate));

       /* Turn on access to baud divisor register */
   _SetEXRegByte(SIOPortBase + LCR, 0x80);
      /* Set the baud rate divisor register, High byte first */
   _SetEXRegByte(SIOPortBase + DLH, HIBYTE(BaudDivisor) );
   _SetEXRegByte(SIOPortBase + DLL, LOBYTE(BaudDivisor) );

      /*** Set Serial Line control register ***/
   _SetEXRegByte(SIOPortBase + LCR, Mode);         /* Sets Mode and reset the Divisor latch */

      /* Set modem control bits */
   _SetEXRegByte(SIOPortBase + MCR, ModemCntrl);

   return E_OK;
}

/*
   SetSIOInterrupt:

   Description:
      Initializes the Interrupt Enable Register (IER) and initializes the interrupt vector table with the
      address of the interrupt function, if provided.  If not provided this function only modifies the IER.

   Parameters:
      Unit          Unit number of the serial port.  0 for SIO port 0, 1 for SIO port 1.
      IntrSources   Which serial port features can cause the interrupt.
      InterruptFnc  Address of interrupt function, will be loaded into the interrupt table.  If
                    NULL no function is loaded.  Use SetInterruptVector to set interrupt routine.
      ISR_Type      Specifies if the interrupt function should be treated as a TRAP_ISR or an
                    INTERRUPT_ISR.  Real Mode only supports INTERRUPT_ISR (parameter is ignored).
                  Protected mode supports both.  If InterruptFnc is NULL parameter is ignored.

   Returns: Error Codes
      E_INVAILD_DEVICE  -- Unit number specifies a non-existing device
      E_OK              -- Initialized OK, No error.

   Assumptions:
      REMAPCFG register has Expanded I/O space access enabled (ESE bit set).
      The processor Port pin are initialized separately.
      ICU is initialized before this is called.
      Compiler supports far and interrupt keywords

   Syntax:

      #define SIO_INTR_NONE   0
      #define SIO_INTR_RBF    0x1
      #define SIO_INTR_TBE    0x2
      #define SIO_INTR_RLS    0x4
      #define SIO_INTR_MS     0x8
      #define INTERRUPT_ISR   1
      #define TRAP_ISR        2

      int error;

      error = SetSIOInterrupt (SIO_0,
                               SIO_INTR_RBF | SIO_INTR_TBE,
                               SIO_ISR,
                               INTERRUPT_ISR);

   Real/Protected Mode
      No changes required.  Uses SetInterruptVector which is mode dependent

*/

int SetSIOInterrupt(int Unit,BYTE IntrSources, void (far interrupt *InterruptFnc)(void), int ISR_Type)
{
   WORD SIOPortBase;
   int  ICUInterruptVector;

      /*** Check for valid unit ***/
   if(Unit > 1)
      return E_INVALID_DEVICE;

   if(InterruptFnc != NULL)
   {
         /*** Calculate which interrupt vector to initialized ***/
         /* Get the base vector number of the Master ICU, SIO 0 & 1 are on the Master */
      ICUInterruptVector = _GetEXRegByte(ICW2M) & 0xf8;  /* Clear bits 0 - 2 */
      ICUInterruptVector += (Unit == 0) ? 4 : 3;  /* Set to IRQ level.  SIO_0 = IRQ4, SIO_1 = IRQ3 */
         /*** Load interrupt function into the interrupt vector table ***/
      SetInterruptVector(InterruptFnc, ICUInterruptVector, ISR_Type);
   }

      /* Set Port base, based on serial port used */
   SIOPortBase = (Unit ? SIO1_BASE : SIO0_BASE);
   _SetEXRegByte(SIOPortBase + IER, IntrSources);

   return E_OK;
}


/*	SerialReadStr

   Description:
      Is a Polled serial port read function that will wait forever or until count characters are
      read from the serial port.

   Parameters:
      Unit        Unit number of the serial port.  0 for SIO port 0, 1 for SIO port 1.
      str         Address of where to place the input data
      count       Number of characters to read before returning.

   Returns: Error Code
      E_OK or Error code status (value of Line Status Register (LSR)

   Assumptions:
      REMAPCFG register has Expanded I/O space access enabled (ESE bit set).
      The processor Port pin are initialized separately.

   Syntax:

      #define SIO_0  0
      #define LENGTH 32

      char String_Read[LENGTH];
      int error;

      error = SerialReadStr (SIO_0,
                             String_Read,
                             LENGTH);

   Real/Protected Mode
      No changes required.

*/


int SerialReadStr(int Unit, char far *str, int count)
{
   WORD ReceivePortAddr;
   WORD StatusPortAddr;
   BYTE Status;
   int i;
   
      /* Set Port base, based on serial port used */
   ReceivePortAddr = (Unit ? RBR1 : RBR0);
   StatusPortAddr =  (Unit ? LSR1 : LSR0);
   
   for(i=0; i < count-1; i++)
   {
         /* Status register is cleared after read, so we must save it's value when read */
      while(!((Status=_GetEXRegByte(StatusPortAddr)) & SIO_RX_BUF_FULL))
         if( Status & SIO_ERROR_BITS )  /* Error Bit set then return NULL */
         {
            str[i+1] = '\0';
            return Status & SIO_ERROR_BITS;
         }
        str[i] = _GetEXRegByte(ReceivePortAddr);
    }
    str[i] = '\0';
    return E_OK;
}
	
/*
   SerialReadChar:
   
   Description:
      Is a Polled serial port read function that will wait forever or until a character has been
      recieved from the serial port.   
   
   Parameters:
      Unit        Unit number of the serial port.  0 for SIO port 0, 1 for SIO port 1.
   
   Returns: 
      BYTE Read from serial port, if zero an error occured.

   Assumptions:
      REMAPCFG register has Expanded I/O space access enabled (ESE bit set).
      The processor Port pin are initialized separately.

   Syntax:
   
      #define SIO_0 0
      
      BYTE character;
      
      character = SerialReadChar (SIO_0);
   
   Real/Protected Mode
      No changes required.
                  
*/


BYTE SerialReadChar(int Unit)
{
   WORD ReceivePortAddr;
   WORD StatusPortAddr;
   WORD Status;
   
      /* Set Port base, based on serial port used */
   ReceivePortAddr = (Unit ? RBR1 : RBR0);
   StatusPortAddr =  (Unit ? LSR1 : LSR0);

      /* Status register is cleared after read, so we must save it's value when read */
   while(!((Status=_GetEXRegByte(StatusPortAddr)) & SIO_RX_BUF_FULL))
      if( Status & SIO_ERROR_BITS )  /* Error Bit set then return NULL */
      {
         return 0;
      }
   
   return _GetEXRegByte(ReceivePortAddr);
}


/*
   SerialWriteChar:
   
   Description:
      Is a Polled serial port write function that will wait forever or until a character has been
      written to the serial port.
               
   Parameters:
      Unit        Unit number of the serial port.  0 for SIO port 0, 1 for SIO port 1.
       ch            Character value to be written out
       
   Returns: 
      None

   Assumptions:
      REMAPCFG register has Expanded I/O space access enabled (ESE bit set).
      The processor Port pin are initialized separately.

   Syntax:
       
       #define SIO_0 0 
       
       char Char_Out = 'a';
       
      SerialWriteChar (SIO_0, Char_Out); 
   
   Real/Protected Mode
      No changes required.

*/


void SerialWriteChar(int Unit, BYTE ch)
{     
   WORD TransmitPortAddr;
   WORD StatusPortAddr;

      /* Set Port base, based on serial port used */
   TransmitPortAddr = (Unit ? TBR1 : TBR0);
   StatusPortAddr =  (Unit ?  LSR1 : LSR0);
   
      /* Wait until buffer is empty */
   while(!(_GetEXRegByte(StatusPortAddr) & SIO_TX_BUF_EMPTY)) ;
   
   _SetEXRegByte(TransmitPortAddr,ch);
}

/*
   SerialWriteStr:
   
   Description:
      Is a Polled serial port write function that will wait forever or until all characters have been
      written to the serial port.  The NUL character ('\0') is used to indicate end of string.     
   
   Parameters:
      Unit        Unit number of the serial port.  0 for SIO port 0, 1 for SIO port 1.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丁香激情综合五月| 欧美怡红院视频| 国产一区二区精品久久| 日本午夜一本久久久综合| 天天av天天翘天天综合网色鬼国产| 中文字幕一区三区| 日韩毛片一二三区| 亚洲色图在线播放| 亚洲黄色性网站| 亚洲午夜私人影院| 轻轻草成人在线| 韩国一区二区三区| 国产一区二区福利| 91麻豆精东视频| 欧美国产成人在线| 欧美日韩国产在线观看| 欧美日韩高清不卡| 91精品国产欧美一区二区成人| 91精品国产91久久久久久最新毛片 | 欧美日韩免费在线视频| 欧美精品日韩一区| 精品欧美一区二区三区精品久久| 欧美v亚洲v综合ⅴ国产v| 国产日韩精品一区二区浪潮av| 国产精品国产馆在线真实露脸| 亚洲欧洲中文日韩久久av乱码| 亚洲精品你懂的| 日韩激情一区二区| 欧美一区二区在线观看| 欧美久久久久中文字幕| 欧美videos大乳护士334| 中文字幕的久久| 亚洲一区二区三区四区五区黄| 日本成人在线视频网站| 国产精品中文欧美| 色乱码一区二区三区88 | 一区二区三区四区蜜桃| 日本中文字幕一区二区视频 | 9191国产精品| 国产视频在线观看一区二区三区| 综合在线观看色| 日本中文字幕不卡| 91在线一区二区三区| 欧美精品18+| 国产精品福利一区二区三区| 天涯成人国产亚洲精品一区av| 国产风韵犹存在线视精品| 欧美性受极品xxxx喷水| 日韩欧美黄色影院| 1024亚洲合集| 久久99精品一区二区三区| 91视频xxxx| 26uuuu精品一区二区| 一级女性全黄久久生活片免费| 经典三级一区二区| 欧美日韩精品欧美日韩精品| 国产精品视频一二三| 石原莉奈在线亚洲三区| 不卡一卡二卡三乱码免费网站| 欧美精品 国产精品| 中文字幕视频一区二区三区久| 久久激情综合网| 欧美性猛交一区二区三区精品| 国产日韩精品一区| 六月丁香婷婷久久| 欧美精品三级在线观看| 17c精品麻豆一区二区免费| 国产一区高清在线| 欧美一区二区国产| 亚洲成人av电影在线| 99re热这里只有精品视频| 久久中文娱乐网| 午夜精品久久久久久久久久| 97se狠狠狠综合亚洲狠狠| 国产日韩欧美综合在线| 日韩电影在线看| 欧美日韩精品欧美日韩精品 | 91麻豆国产精品久久| 精品999久久久| 亚洲午夜在线视频| 91麻豆免费在线观看| 亚洲国产成人在线| 激情欧美一区二区三区在线观看| 欧美亚洲综合网| 一区二区三区国产精华| 色婷婷亚洲一区二区三区| 亚洲欧洲精品一区二区三区| 成人美女视频在线观看18| 欧美电视剧免费全集观看| 日韩精品高清不卡| 91精品麻豆日日躁夜夜躁| 亚洲一区二区三区中文字幕| 色综合色综合色综合| 中文字幕日韩av资源站| 国产成人精品一区二区三区网站观看| 精品成人一区二区三区| 久久99精品国产麻豆婷婷| 日韩女优制服丝袜电影| 久久aⅴ国产欧美74aaa| 精品久久人人做人人爰| 久久国产尿小便嘘嘘| 日韩一卡二卡三卡四卡| 天堂久久一区二区三区| 亚洲成人综合网站| 欧美日韩一区中文字幕| 亚洲成人动漫av| 欧美二区在线观看| 毛片av一区二区| 精品国产乱码久久久久久蜜臀 | 免费在线欧美视频| 日韩手机在线导航| 国产一区二区美女| 中文字幕欧美区| 不卡在线视频中文字幕| 亚洲欧美区自拍先锋| 91麻豆精东视频| 亚洲电影一级片| 91精品国产一区二区三区蜜臀| 奇米影视一区二区三区| 26uuu精品一区二区三区四区在线| 国产精品一线二线三线精华| 中文字幕一区二区三区在线不卡| 99v久久综合狠狠综合久久| 亚洲高清视频在线| 精品国产一区二区三区久久影院| 国产精选一区二区三区| 国产精品不卡在线| 欧美日本国产视频| 韩日av一区二区| 亚洲天堂av一区| 欧美年轻男男videosbes| 另类人妖一区二区av| 国产欧美日韩精品一区| 色综合一区二区三区| 日韩av网站免费在线| 欧美国产激情二区三区| 欧美三级三级三级| 国产一区二区毛片| 一区二区三区av电影| 精品久久人人做人人爱| 99国产精品一区| 另类综合日韩欧美亚洲| 中文字幕一区二区三区精华液 | 婷婷成人综合网| 久久中文字幕电影| 在线欧美日韩国产| 国产在线一区二区| 亚洲高清三级视频| 久久久久久影视| 欧美日韩小视频| 国产mv日韩mv欧美| 亚欧色一区w666天堂| 久久久蜜桃精品| 欧美色窝79yyyycom| 国产精品亚洲第一| 图片区日韩欧美亚洲| 中文字幕免费一区| 欧美二区三区91| 99久久精品国产一区二区三区 | 精品视频在线看| 成人免费电影视频| 久久成人久久爱| 亚洲不卡av一区二区三区| 国产女人水真多18毛片18精品视频| 在线观看一区日韩| 成人午夜激情在线| 久久国产精品第一页| 亚洲成人av一区| 亚洲日本在线视频观看| 久久人人爽爽爽人久久久| 亚洲精品国产第一综合99久久| 欧美精品一区二区在线观看| 欧美影院一区二区| 91在线小视频| 国产aⅴ综合色| 天堂成人免费av电影一区| 亚洲视频小说图片| 国产午夜精品久久久久久久| 欧美一卡二卡在线| 精品视频全国免费看| 91蜜桃视频在线| 波多野结衣91| 国产福利一区二区| 韩国女主播一区| 日韩精品91亚洲二区在线观看| 一区二区三区久久| 亚洲欧美二区三区| 亚洲国产精品黑人久久久| 久久免费看少妇高潮| 精品成a人在线观看| 日韩精品影音先锋| 日韩精品一区二| 欧美片在线播放| 欧美精选午夜久久久乱码6080| 91蝌蚪porny九色| av中文字幕在线不卡| 成人小视频免费在线观看| 国产成人精品一区二| 国产69精品久久久久毛片| 国产毛片一区二区|