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

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

?? uartintc.c

?? build a modbus client/server for use on the Protocessor (from FieldServer Technologies) Tools Req
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*******************************************************************************

                                   sioapi.c

********************************************************************************

   Written by:   Shaheen Mahomed

   nSoft Developement.

********************************************************************************

 Version

  0.00aA  17 Jun 04 SSM  Began using pic18 uart code from MPLab Maestro
  0.00aB  14 Aug 04 BDW  Patching in data handeling
  0.00aD  15 Sep 04 BDW  Making build compatible with new Protocessors
  0.00aI  11 Oct 04 BDW  Increasing SIO buffer sizes

*******************************************************************************/


#if defined ( P18F6720 )
  #include <p18f6720.h>
#elif defined (P18F6520)
  #include <p18f6520.h>
#else
  #error must defined P18F6X20 compiler option
#endif

#include <fst.h>

#include <sioapi.h>
#include "UARTIntC.h"

#include <led.h>

#include <delays.h>

#define TMR2_PERIOD_REGISTER  156  // timer2 period register
UINT32 mseconds = 0;

/*Interrupt service routine*/
VOID high_isr(VOID);

// serial interrupt taken as low priority interrupt
#pragma code uart_int_service = 0x08
VOID uart_int_service(VOID)
{
   _asm
   goto high_isr
   _endasm

}
#pragma code

#pragma interrupt high_isr save=section(".tmpdata")
VOID high_isr(VOID)
{

   if ( PIR1bits.TMR2IF )
      {
      mseconds++;
      PIR1bits.TMR2IF = 0;
      }

   UARTIntISR();

}


// status flags of receive and transmit buffers
#pragma udata sio_0 = 0xa00
tx_status tx_vUARTIntStatus1;
#pragma udata sio_1 = 0xb00
rx_status rx_vUARTIntStatus1;
#pragma udata sio_2 = 0xc00
tx_status tx_vUARTIntStatus2;
#pragma udata sio_3 = 0xd00
rx_status rx_vUARTIntStatus2;


/*********************************************************************
 * Function:            VOID UARTIntInit(VOID)
 * PreCondition:        None
 * Input:               None
 * Output:              None
 * Side Effects:        None
 * Stack Requirements:  1 level deep
 * Overview:            This function initialises UART peripheral.This
 *                      function need to be called before using
 *                      UARTIntPutChar and UARTIntGetChar functions to
 *                      send and receive the characters.
 ********************************************************************/
VOID UARTIntInit ( UINT iport)
{

   tx_status *tx_vUARTIntStatus ;
   rx_status *rx_vUARTIntStatus ;
   mCheckPortHandle(iport);

   if (iport==(UINT)P6720SER1)
      {
      tx_vUARTIntStatus = &tx_vUARTIntStatus1 ;
      rx_vUARTIntStatus = &rx_vUARTIntStatus1 ;
      }
   else
      {
      tx_vUARTIntStatus = &tx_vUARTIntStatus2 ;
      rx_vUARTIntStatus = &rx_vUARTIntStatus2 ;
      }

   // Intialising the status variables and circular buffer
   // variables .
   tx_vUARTIntStatus->UARTIntTxBufferFull = 0;
   tx_vUARTIntStatus->UARTIntTxBufferEmpty = 1;
   tx_vUARTIntStatus->vUARTIntTxBufDataCnt = 0;
   tx_vUARTIntStatus->vUARTIntTxBufWrPtr = 0;
   tx_vUARTIntStatus->vUARTIntTxBufRdPtr = 0;

   rx_vUARTIntStatus->UARTIntRxBufferFull = 0;
   rx_vUARTIntStatus->UARTIntRxBufferEmpty = 1;
   rx_vUARTIntStatus->UARTIntRxError = 0;
   rx_vUARTIntStatus->UARTIntRxOverFlow = 0;
   rx_vUARTIntStatus->vUARTIntRxBufDataCnt = 0;
   rx_vUARTIntStatus->vUARTIntRxBufWrPtr = 0;
   rx_vUARTIntStatus->vUARTIntRxBufRdPtr = 0;

   if ( iport == (UINT)P6720SER1 )
      {
      /* Initialising BaudRate value */
      TXSTAbits.BRGH = BRGH_VAL;
      mSetUARTPort ( iport, DEFAULT_UART_BAUDRATE, 0) ;

      /* Setting priority */
      IPR1bits.TXIP = 1;
      IPR1bits.RCIP = 1;

      /* Enabling Transmitter or Receiver */
      TXSTAbits.TXEN = 1;
      RCSTAbits.CREN = 1;

      /* Enabling Serial Port */
      RCSTAbits.SPEN = 1;

      /* Enable the TX and RX. Interrupt */
      PIE1bits.RCIE = 1;

      /* Initialising TX/RX port pins */
      DDRCbits.RC6 = 0;
      DDRCbits.RC7 = 1;

      /*Setting RTS pin as output, and low */
      PORTCbits.RC5 = 0 ;
      DDRCbits.RC5  = 0;
      }
   else
      {
      /* Initialising BaudRate value */
      TXSTA2bits.BRGH = BRGH_VAL;
      mSetUARTPort ( iport, DEFAULT_UART_BAUDRATE, 0) ;

      /* Setting priority */
      IPR3bits.TX2IP = 1;
      IPR3bits.RC2IP = 1;

      /* Enabling Transmitter or Receiver */
      TXSTA2bits.TXEN = 1;
      RCSTA2bits.CREN = 1;

      /* Enabling Serial Port */
      RCSTA2bits.SPEN = 1;

      /* Enable the TX and RX. Interrupt */
      PIE3bits.RC2IE = 1;

      /* Initialising TX/RX port pins */
      DDRGbits.RG1 = 0;
      DDRGbits.RG2 = 1;

      /*Setting RTS pin as output, and low */
      PORTGbits.RG3 = 0 ;
      DDRGbits.RG3  = 0;
      }

   /*Enable priority interrupts*/
   RCONbits.IPEN = 1;

   /* Setting Global interrupt pins */
   INTCONbits.GIEH = 1;
   INTCONbits.GIEL = 1;


}


/*********************************************************************
 * Function:            BYTE UARTIntPutString(BYTE*)
 * PreCondition:        UARTIntInit()function should have been called.
 * Input:               BYTE pointer
 * Output:              BYTE
 *                            1 - string is successfully
 *                                added to transmit buffer.
 *                            0 - transmit buffer is full and the
 *                                character could not be added to
 *                                transmit buffer.
 *
 * Side Effects:        None
 * Stack Requirements:  1 level deep
 * Overview:            This function puts the data in to transmit
 *                      buffer. Internal implementation wise ,
 *                      it places the argument data in transmit buffer
 *                      and updates the data count and write pointer
 *                      variables.
 *
 ********************************************************************/
BYTE UARTIntPutString(UINT iport, BYTE *stCharData, UINT length)
{

   tx_status *tx_vUARTIntStatus ;

   UINT i;
   BYTE bytetosend;

   mCheckPortHandle(iport);

   if (iport==(UINT)P6720SER1)
      {
      tx_vUARTIntStatus = &tx_vUARTIntStatus1 ;
      }
   else
      {
      tx_vUARTIntStatus = &tx_vUARTIntStatus2 ;
      }


   // Check if TX_BUFFER already full
   if ( tx_vUARTIntStatus->UARTIntTxBufferFull )
      {
      //todo : Flag an error,
      return CD_ERROR ;
      }

   //critical code , disable interrupts

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.TXIE = 0;
#if ( ENABLE_SER1_RS485 == 'Y' )
      Delay1KTCYx (1) ;   // at 10 Mhz, 1000 instruction cycles delay for 0.4 ms.
      mSetRS485_RTSHigh ( P6720SER1 ) ;
#endif
      }
   else if ( iport == (UINT)P6720SER2 )
      {
      PIE3bits.TX2IE = 0;
#if ( ENABLE_SER2_RS485 == 'Y' )
      Delay1KTCYx (1) ;   // at 10 Mhz, 1000 instruction cycles delay for 0.4 ms.
      mSetRS485_RTSHigh ( P6720SER2 ) ;
#endif
      }

   // Put data in TX_BUFFER
   for ( i=0; i < length; i++ )
      {
      tx_vUARTIntStatus->vUARTIntTxBuffer[tx_vUARTIntStatus->vUARTIntTxBufWrPtr] = stCharData[i];
      tx_vUARTIntStatus->UARTIntTxBufferEmpty = 0;
      tx_vUARTIntStatus->vUARTIntTxBufDataCnt ++;
      if ( tx_vUARTIntStatus->vUARTIntTxBufDataCnt == (BYTE)TX_BUFFER_SIZE )
         {
         tx_vUARTIntStatus->UARTIntTxBufferFull = 1;
         break; // Else we will overrun our buffers
         }

      tx_vUARTIntStatus->vUARTIntTxBufWrPtr++;
      if ( tx_vUARTIntStatus->vUARTIntTxBufWrPtr == (BYTE)TX_BUFFER_SIZE )
         {
         tx_vUARTIntStatus->vUARTIntTxBufWrPtr = 0;
         }
      }


   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.TXIE = 1;
      }
   else if ( iport == (UINT)P6720SER2 )
      {
      PIE3bits.TX2IE = 1;
      }

   return 1;
}


/*********************************************************************
 * Function:          BYTE UARTIntGetTxBufferEmptySpace(VOID)
 * PreCondition:        UARTIntInit()function should have been called.
 * Input:               None
 * Output:              BYTE
 *                               0  - There is no empty space in
 *                                     transmit buffer.
 *                            number - the number of bytes of empty
 *                                     space in transmit buffer.
 *
 *
 * Side Effects:        None
 * Stack Requirements:  1 level deep
 * Overview:            This function returns the number of bytes
 *                      of free space left out in transmit buffer at
 *                      the calling time of this function. It helps
 *                      the user to further write data in to transmit
 *                      buffer at once, rather than checking transmit
 *                      buffer is full or not with every addition of
 *                      data in to the transmit buffer.
 ********************************************************************/

BYTE UARTIntGetTxBufferDataSize(UINT iport)
{

   mCheckPortHandle(iport);

   if (iport==(UINT)P6720SER1)
      {
      return tx_vUARTIntStatus1.vUARTIntTxBufDataCnt ;
      }
   else
      {
      return tx_vUARTIntStatus2.vUARTIntTxBufDataCnt ;
      }

}

/*********************************************************************
 * Function:            BYTE UARTIntGetChar(BYTE*)
 * PreCondition:        UARTIntInit()function should have been called.
 * Input:               BYTE*
 * Output:              BYTE
 *                            0 - receive buffer is empty and the
 *                                character could not be read from
 *                                the receive buffer.
 *                            1 - single character is successfully
 *                                read from receive buffer.
 * Side Effects:        None
 * Stack Requirements:  1 level deep
 * Overview:            This function reads the data from the receive
 *                      buffer. It places the data in to argument and
 *                      updates the data count and read pointer
 *                      variables of receive buffer.
 *
 ********************************************************************/
BYTE UARTIntGetChar(UINT iport)
{
   rx_status *rx_vUARTIntStatus ;

   BYTE rxchar;
   mCheckPortHandle(iport);


   if (iport==(UINT)P6720SER1)
      {
      rx_vUARTIntStatus = &rx_vUARTIntStatus1 ;
      }
   else
      {
      rx_vUARTIntStatus = &rx_vUARTIntStatus2 ;
      }

   if ( rx_vUARTIntStatus->UARTIntRxBufferEmpty )
      return 0;

   //critical code, disabling interrupts here keeps the
   //access pointer values proper.

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.RCIE = 0;
      }
   else if ( iport == (UINT)P6720SER2 )
      {
      PIE3bits.RC2IE = 0;
      }

   rx_vUARTIntStatus->UARTIntRxBufferFull = 0;
   rxchar = rx_vUARTIntStatus->vUARTIntRxBuffer[rx_vUARTIntStatus->vUARTIntRxBufRdPtr];
   rx_vUARTIntStatus->vUARTIntRxBufDataCnt--;
   if ( rx_vUARTIntStatus->vUARTIntRxBufDataCnt == (UINT)0 )
      {
      rx_vUARTIntStatus->UARTIntRxBufferEmpty = (UINT)1;
      }
   rx_vUARTIntStatus->vUARTIntRxBufRdPtr++;
   if ( rx_vUARTIntStatus->vUARTIntRxBufRdPtr == (BYTE)RX_BUFFER_SIZE )
      {
      rx_vUARTIntStatus->vUARTIntRxBufRdPtr = 0;
      }

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.RCIE = 1;
      }
   else if ( iport == (UINT)P6720SER2 )
      {
      PIE3bits.RC2IE = 1;
      }

   return rxchar;
}

/*********************************************************************
 * Function:            BYTE UARTIntGetRxBufferDataSize(VOID)
 * PreCondition:        UARTIntInit()function should have been called.
 * Input:               None
 * Output:              BYTE
 *                                      number - the number of bytes
 *                                           of data in receive buffer.
 * Side Effects:        None
 * Stack Requirements:  1 level deep
 * Overview:            This function returns the number of bytes
 *                      of data available in receive buffer at
 *                      the calling time of this function. It helps
 *                      the user to read data from receive buffer
 *                      at once, rather than checking receive buffer
 *                      is empty or not with every read of data from
 *                      receive buffer.
 ********************************************************************/
BYTE UARTIntGetRxBufferDataSize(UINT iport)
{

   mCheckPortHandle(iport);

   if (iport==(UINT)P6720SER1)
      {
      return rx_vUARTIntStatus1.vUARTIntRxBufDataCnt ;
      }
   else
      {
      return rx_vUARTIntStatus2.vUARTIntRxBufDataCnt ;
      }
}


/*********************************************************************
 * Function:            VOID UARTIntISR(VOID)
 * PreCondition:        UARTIntInit() function should have been called.
 * Input:               None
 * Output:              None
 * Side Effects:        None
 * Stack Requirements:  2 level deep
 * Overview:            This is the Interrupt service routine which is
 *                      called in the user application's ISR portion.
 *                      This function actually sends the data from
 *                      transmit buffer to USART and updates the data
 *                      count and read pointer variables of transmit
 *                      buffer. For the receive portion, it reads the
 *                      data from USART and places the data in to
 *                      receive buffer (if no errors occured) and
 *                      updates data count and write pointer variables
 *                      of receive buffer. If the receive buffer is
 *                      full and it receives more data error flag is
 *                      set.If frame errors(FERR) occur it sets the
 *                      error flag. If over flow errors(OERR) occurs,
 *                      it clears and sets the CREN bit, so that
 *                      USART can receive further data.
 ********************************************************************/
VOID UARTIntISR(VOID)
{
   BYTE chTemp;

   tx_status *tx_vUARTIntStatus = &tx_vUARTIntStatus1 ;
   rx_status *rx_vUARTIntStatus = &rx_vUARTIntStatus1 ;

   //------------------------------------------------------------
   //
   // TX Interrupts
   //
   if ( PIR1bits.TXIF & PIE1bits.TXIE )
      {
      if ( !tx_vUARTIntStatus->UARTIntTxBufferEmpty )
         {
         TXREG = tx_vUARTIntStatus->vUARTIntTxBuffer[tx_vUARTIntStatus->vUARTIntTxBufRdPtr];
         //if ( parity )
         //   {
         //   addParityBit(0, vUARTIntStatus->vUARTIntTxBuffer[vUARTIntStatus->vUARTIntTxBufRdPtr]);
         //   }

         tx_vUARTIntStatus->UARTIntTxBufferFull = 0;
         tx_vUARTIntStatus->vUARTIntTxBufDataCnt--;
         if ( tx_vUARTIntStatus->vUARTIntTxBufDataCnt == (UINT)0 )
            {
            tx_vUARTIntStatus->UARTIntTxBufferEmpty = 1;
            }
         tx_vUARTIntStatus->vUARTIntTxBufRdPtr++;
         if ( tx_vUARTIntStatus->vUARTIntTxBufRdPtr >= (BYTE)TX_BUFFER_SIZE )
            {
            tx_vUARTIntStatus->vUARTIntTxBufRdPtr = 0;
            }
         }
      else
         {
         PIE1bits.TXIE = 0;
#if ( ENABLE_SER1_RS485 == 'Y' )
         while ( TXSTAbits.TRMT == (BYTE)0 );
         Delay1KTCYx (1) ;   // at 10 Mhz, 1000 instruction cycles delay for 0.4 ms.
         mSetRS485_RTSLow ( P6720SER1 );
#endif
         }
      }


   //------------------------------------------------------------
   //
   // RX Interrupts
   //
   if ( PIR1bits.RCIF & PIE1bits.RCIE )
      {
      if ( RCSTAbits.FERR )
         {   /* FERR error condition */
         chTemp = RCREG;
         rx_vUARTIntStatus->UARTIntRxError = 1;
         }
      else if ( RCSTAbits.OERR )
         {   /* OERR error condition */
         RCSTAbits.CREN = 0;
         RCSTAbits.CREN = 1;
         chTemp = RCREG;
         rx_vUARTIntStatus->UARTIntRxError = 1;
         }
      else if ( rx_vUARTIntStatus->UARTIntRxBufferFull )
         {
         chTemp = RCREG;
         rx_vUARTIntStatus->UARTIntRxOverFlow = 1;
         }
      else if ( !rx_vUARTIntStatus->UARTIntRxBufferFull )
         {
         rx_vUARTIntStatus->UARTIntRxOverFlow = 0;
         rx_vUARTIntStatus->UARTIntRxBufferEmpty = 0;
         rx_vUARTIntStatus->vUARTIntRxBuffer[rx_vUARTIntStatus->vUARTIntRxBufWrPtr] = RCREG;
         rx_vUARTIntStatus->vUARTIntRxBufDataCnt ++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产伦精品一区二区三区在线观看| 色综合天天在线| 99re6这里只有精品视频在线观看| 欧美色大人视频| 国产亚洲一区二区三区四区| 日韩电影免费在线观看网站| 色综合天天狠狠| 国产日韩精品一区二区浪潮av| 亚洲123区在线观看| 99视频一区二区| 国产女主播在线一区二区| 日本欧美一区二区在线观看| 在线免费不卡电影| 中文字幕欧美三区| 国内精品视频一区二区三区八戒 | 国产精品第13页| 久久综合综合久久综合| 欧美久久一二区| 一区二区三区在线视频播放| 成人午夜电影久久影院| 久久蜜桃av一区二区天堂| 男女性色大片免费观看一区二区| 91黄色免费看| 一区二区三区免费观看| 色女孩综合影院| 亚洲乱码国产乱码精品精98午夜| av电影天堂一区二区在线观看| 中文字幕乱码久久午夜不卡 | 欧美成人精品1314www| 亚洲成av人片在线| 欧美丝袜第三区| 午夜精品福利久久久| 欧美私人免费视频| 丝袜美腿亚洲色图| 欧美一级欧美一级在线播放| 免播放器亚洲一区| 精品日韩99亚洲| 国产一区二区在线观看免费 | 最新日韩av在线| 色综合久久天天综合网| 亚洲精品伦理在线| 欧美日韩国产一区| 另类小说欧美激情| 国产色婷婷亚洲99精品小说| 国产成人免费xxxxxxxx| 中文字幕一区二区在线观看| 欧美在线你懂的| 免费一级片91| 国产欧美视频一区二区| gogogo免费视频观看亚洲一| 一区二区三区欧美久久| 91精品在线免费观看| 国产专区综合网| **性色生活片久久毛片| 欧美日韩国产美女| 国产综合久久久久影院| 国产精品成人一区二区艾草| 欧美日韩在线播放一区| 国产在线精品一区二区不卡了 | 成人网男人的天堂| 日韩毛片视频在线看| 欧美精品在线一区二区三区| 国产综合色精品一区二区三区| 一区二区中文字幕在线| 欧美片在线播放| 国产91丝袜在线播放| 亚洲综合激情小说| 久久久久国产成人精品亚洲午夜 | 国产成人免费网站| 亚洲电影欧美电影有声小说| 久久精品视频免费| 欧美日韩一级二级| 成人午夜电影久久影院| 日韩和欧美一区二区| 中文字幕一区二区三区蜜月| 日韩欧美国产一区二区在线播放| av不卡在线播放| 精品一区二区三区的国产在线播放 | 久久久国际精品| 欧美性xxxxxxxx| 成人丝袜高跟foot| 免费在线观看日韩欧美| 亚洲免费在线看| 精品成a人在线观看| 欧美日韩国产另类一区| 91在线你懂得| 福利一区二区在线| 九一九一国产精品| 日韩avvvv在线播放| 亚洲日本va午夜在线影院| 久久久久久免费网| 欧美成人三级电影在线| 欧美日韩国产一级二级| 色综合久久综合网| 91在线看国产| 波多野结衣在线一区| 国产一区二区不卡| 久久成人麻豆午夜电影| 午夜a成v人精品| 亚洲国产视频a| 亚洲蜜臀av乱码久久精品蜜桃| 欧美激情一区二区三区不卡| 精品国产99国产精品| 欧美一区三区四区| 欧美高清你懂得| 欧美另类videos死尸| 在线观看视频91| 91福利视频在线| 在线视频一区二区三| 91精品福利在线| 欧美中文字幕不卡| 欧美色欧美亚洲另类二区| 欧美伊人精品成人久久综合97 | 亚洲精品成a人| 亚洲卡通欧美制服中文| 亚洲日本在线观看| 亚洲激情第一区| 亚洲国产精品一区二区www在线| 一区二区三区免费网站| 亚洲国产婷婷综合在线精品| 午夜成人免费电影| 免费国产亚洲视频| 国产在线视频不卡二| 丁香另类激情小说| 99re66热这里只有精品3直播| 99精品在线观看视频| 欧洲亚洲精品在线| 777午夜精品免费视频| 欧美大片一区二区三区| 久久久精品中文字幕麻豆发布| 精品久久五月天| 成人av免费在线| 大白屁股一区二区视频| 成人国产精品免费网站| 在线免费观看日本一区| 制服丝袜亚洲色图| 欧美精品一区二区不卡| 最新中文字幕一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲一区二区三区不卡国产欧美| 婷婷中文字幕综合| 国产成人激情av| av不卡免费电影| 91精品国产高清一区二区三区蜜臀| 2023国产精品自拍| 亚洲人成小说网站色在线| 日韩高清一区二区| 床上的激情91.| 美女脱光内衣内裤视频久久网站| 亚洲一区在线观看免费观看电影高清 | 亚洲精品在线观看网站| 综合久久久久综合| 日本亚洲一区二区| 成人av网址在线观看| 91精品国产手机| 国产精品看片你懂得| 日韩精品乱码免费| 不卡一区在线观看| 91精品国产品国语在线不卡| 国产精品久久久久aaaa樱花| 青青草原综合久久大伊人精品优势| 成人国产精品免费观看| 日韩欧美成人激情| 一区二区三区精品| 成人免费av网站| 亚洲精品在线免费播放| 天堂蜜桃91精品| 一本久道久久综合中文字幕| 26uuu亚洲综合色欧美| 亚洲va欧美va人人爽午夜| 成人久久久精品乱码一区二区三区 | 国产嫩草影院久久久久| 亚洲精品乱码久久久久久日本蜜臀| 捆绑调教一区二区三区| 色噜噜狠狠成人中文综合| 久久蜜桃一区二区| 免费欧美日韩国产三级电影| 91福利在线看| 国产精品进线69影院| 国产一区二区在线观看视频| 91精品国产一区二区三区| 亚洲一区二区三区不卡国产欧美| 成人app软件下载大全免费| 久久美女艺术照精彩视频福利播放 | 国产一区二区三区精品视频| 欧美绝品在线观看成人午夜影视| 国产精品国产成人国产三级| 成人一区在线观看| 久久久不卡影院| 国产在线麻豆精品观看| 精品欧美久久久| 毛片av一区二区三区| 欧美一区二区三区白人| 日本女人一区二区三区| 欧美猛男超大videosgay| 亚洲高清三级视频| 欧美日韩一本到| 五月综合激情网| 欧美一级在线免费| 免费成人结看片|