📄 main.c
字号:
}
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 + -