⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 2051单片机的小应用实例
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
    while( !KB_CLK_IN && (KBtimeCnt<KB_TIMEOUT_VAL) )
    {
        KBtimeCnt++;
    }

    while( KB_CLK_IN && (KBtimeCnt<KB_TIMEOUT_VAL) )          //stop bit
    {
        KBtimeCnt++;
    }
    if( !(KB_DATA_IN) )
    {
        KBparityCnt = 0;
        KBtmp       = 0;
        KBtimeCnt   = 0;
        EA = ENABLE;
        return;
    }
    while( !KB_CLK_IN && (KBtimeCnt<KB_TIMEOUT_VAL) )
    {
        KBtimeCnt++;
    }

    if( KBtimeCnt >= KB_TIMEOUT_VAL )
    {                                                   //time out
        KBparityCnt = 0;
        KBtmp       = 0;
        KBtimeCnt   = 0;
        EA = ENABLE;
        return;
    }

    UartSend( KB_HEADER_BYTE );
    UartSend( KB_HEADER_BYTE );
    UartSend( KBtmp );
    KBparityCnt = 0;
    KBtmp       = 0;
    KBtimeCnt   = 0;
    EA = ENABLE;
    return;
}

/****************************** MS  ********************************/
#define MS_TIMEOUT_VAL     0xff00

#define MS_DATA_IS_HIGH    { P34 = 1; }
#define MS_DATA_IS_LOW     { P34 = 0; }
#define MS_DATA_IS_INPUT   { P34 = 1; }
#define MS_DATA_IN         P34

#define MS_CLK_IS_HIGH     { P32 = 1; }
#define MS_CLK_IS_LOW      { P32 = 0; }
#define MS_CLK_IS_INPUT    { P32 = 1; }
#define MS_CLK_IN          P32

void MSInit( void )
{
    IT0     = 0;                //low level triggered
    EX0     = ENABLE;
    MS_DATA_IS_INPUT;
    MS_CLK_IS_INPUT;
}

uint8 MSSendByte( uint8 dat )
{
    uint8  parityCnt = 0;
    uint8  i;
    uint16 timeCnt   = 0;

    if( MS_CLK_IN )
    {
        Delay( 100 );
        if( MS_CLK_IN )
        {
            MS_CLK_IS_LOW;
            Delay( 10 );

            MS_DATA_IS_LOW;
            MS_CLK_IS_INPUT;

            for( i=0; i<8; i++ )
            {
                while( MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
                {
                    timeCnt++;
                }

                if( dat & _BIT8(i) )
                {
                    MS_DATA_IS_HIGH;
                    parityCnt++;
                }
                else
                {
                    MS_DATA_IS_LOW;
                }

                while( !MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
                {
                    timeCnt++;
                }
            }

            while( MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }
            if( parityCnt & 0x01 )
            {
                MS_DATA_IS_LOW;
            }
            else
            {
                MS_DATA_IS_HIGH;
            }
            while( !MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }
            while( MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }

            MS_DATA_IS_INPUT;
            while( MS_DATA_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }

            while( MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }

            while( !MS_DATA_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }
            while( !MS_CLK_IN && (timeCnt<MS_TIMEOUT_VAL) )
            {
                timeCnt++;
            }

            if( timeCnt >= MS_TIMEOUT_VAL )
            {
                return 1;
            }
            else
            {
                return OK;
            }
        }
        else
        {
            return 2;
        }
    }
    else
    {
        return 3;
    }
}

uint8  MSparityCnt = 0;
uint8  MStmp       = 0;
uint8  MSi;
uint16 MStimeCnt   = 0;
#define MOUSE_INIT          0
#define MOUSE_RESET         1
uint8  MSstat = MOUSE_INIT;
void EX0Isr( void ) interrupt 0
{
    RD = 1;
    RD = 0;

    EA = DISABLE;

    if( MS_DATA_IN )                                    //start bit
    {
        MSparityCnt = 0;
        MStmp       = 0;
        MStimeCnt   = 0;
        EA = ENABLE;
        return;
    }
    while( !MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )
    {
        MStimeCnt++;
    }

    for( MSi=0; MSi<8; MSi++ )
    {
        while( MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )   //bit i
        {
            MStimeCnt++;
        }
        if( MS_DATA_IN )
        {
            MStmp |= _BIT8(MSi);
            MSparityCnt++;
        }
        while( !MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )
        {
            MStimeCnt++;
        }
    }

    while( MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )       //parity bit
    {
        MStimeCnt++;
    }
    if( MS_DATA_IN )
    {
        MSparityCnt++;
    }
    if( !(MSparityCnt & 0x01) )
    {                                                       //parity bit error
        MSparityCnt = 0;
        MStmp       = 0;
        MStimeCnt   = 0;
        EA = ENABLE;
        return;
    }
    while( !MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )
    {
        MStimeCnt++;
    }

    while( MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )          //stop bit
    {
        MStimeCnt++;
    }
    if( !(MS_DATA_IN) )
    {
        MSparityCnt = 0;
        MStmp       = 0;
        MStimeCnt   = 0;
        EA = ENABLE;
        return;
    }
    while( !MS_CLK_IN && (MStimeCnt<MS_TIMEOUT_VAL) )
    {
        MStimeCnt++;
    }

    if( MStimeCnt >= MS_TIMEOUT_VAL )
    {                                                   //time out
        MSparityCnt = 0;
        MStmp       = 0;
        MStimeCnt   = 0;
        EA = ENABLE;
        return;
    }

	switch( MSstat )
    {
    case MOUSE_INIT:
        if( MStmp == 0xaa )
        {
            MSstat = MOUSE_RESET;
        }
        break;

    case MOUSE_RESET:
        if( MStmp == 0x00 )
        {
            for( i=0; i<10; i++ )
            {
                if( !( MSSendByte( 0xf4 ) ) )
                {
                    EA = ENABLE;
                    break;
                }
            }
        }
        MSstat = MOUSE_INIT;
        break;

    default:
        MSstat = MOUSE_INIT;
        break;
    }

    UartSend( MS_HEADER_BYTE );
    UartSend( MS_HEADER_BYTE );
    UartSend( MStmp );
    MSparityCnt = 0;
    MStmp       = 0;
    MStimeCnt   = 0;
    EA = ENABLE;
    return;
}

/****************************** UA RT  ********************************/
void UartInit( void )
{
    RxIn        = 0;
    RxOut       = 0;
    TxIn        = 0;
    TxOut       = 0;
    TxEmpty     = TRUE;

    SCON        = 0x50;             //serial port work in mode 3
    TMOD        = 0x21;             //set timer0 work in mode 1, set timer1 work in mode 2

    TH1         = 256-1;            //baud rate 38400 bps
    TL1         = 256-1;

    TR1         = ENABLE;           //start the timer1
    ES          = ENABLE;           //enable serial interrupt
}

uint8 UartSend( uint8 dat )
{
    if ((TxOut - TxIn) == 1 || (TX_BUF_LEN - (TxIn - TxOut) == 1))
    {
        return 1;
    }

    TxBuf[TxIn]  = dat;
    TxIn++; TxIn &= TX_BUF_SUB;
    if ( TxEmpty )
    {
        TI = 1;
    }

    return 0;
}

uint8 UartGet( uint8 *dat )
{
    if( RxIn == RxOut )
    {
        *dat = 0;
        return FAILD;
    }
    else
    {
        EA = DISABLE;
        *dat = RxBuf[RxOut];
        RxOut++; RxOut &= RX_BUF_SUB;
        EA = ENABLE;
        return OK;
    }
}

void UartIsr( void ) interrupt 4
{
    EA = DISABLE;
	LED_PIN = LED_ON;

    if (TI)
    {
        TI = 0;
        if (TxOut != TxIn)
        {
            TxEmpty = FALSE;
            SBUF = TxBuf[TxOut];
            TxOut++; TxOut &= TX_BUF_SUB;
        }
        else
        {
            TxEmpty = TRUE;
        }
    }

    if (RI)
    {
        RI = 0;
        RxBuf[RxIn] = SBUF;
        RxIn++; RxIn &= RX_BUF_SUB;
    }

	LED_PIN = LED_OFF;
    EA = ENABLE;
}

⌨️ 快捷键说明

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