📄 ps2.c
字号:
*/
pc_kb_buf[0] = pc_kb_buf[1];
pc_kb_buf[1] = pc_kb_buf[2];
pc_kb_buf[2] = pc_kb_buf[3];
pc_kb_buf[3] = pc_kb_buf[4];
pc_kb_buf[4] = pc_kb_buf[5];
pc_kb_buf[5] = pc_kb_buf[6];
pc_kb_buf[6] = pc_kb_buf[7];
pc_kb_buf[7] = pc_kb_buf[8];
pc_kb_buf[8] = pc_kb_buf[9];
pc_kb_buf[9] = 0;
if(pc_kb_bufcnt>0)
pc_kb_bufcnt--;
}
/*F**************************************************************************
* NAME:
*----------------------------------------------------------------------------
* PARAMS: None
*
* return: None
*
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
*****************************************************************************/
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//||||||||||||||||| for mouse ||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/*F**************************************************************************
* NAME: rd_pc_mc
*----------------------------------------------------------------------------
* PARAMS: None
*
* return: True or fail
*
*----------------------------------------------------------------------------
* PURPOSE: read one byte data from pc, suppose the start status has been
* betected by main
*----------------------------------------------------------------------------
*****************************************************************************/
bool rd_pc_mc(void)
{
u8 x,temp;
bit p = 1,p_temp;
temp = 0;
MC_CKM = 1; // Output Clock
MC_DAM = 0; // Input Data
// read 8bit data
for(x=0;x<8;x++)
{
dly_20us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_10us(); // dly_20us // 因为下面的语句要使用20+条汇编,要占用时间,so用dly10us差不多了
if(MC_DA == 1)
{
//p = ~p;
if(p) p = 0;
else p = 1;
temp |= 0x01<<x;
}
else
{
temp &= ~(0x01<<x);
}
}
// read parity bit
dly_20us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_20us();
if(MC_DA == 1)
{
p_temp = 1;
}
else
{
p_temp = 0;
}
// read stop bit
dly_20us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_20us();
if(MC_DA == 0)
{
MC_CKM = 0;
return fail;
}
// ack
dly_10us();
dly_5us();
MC_DAM = 1;
MC_DA = 0;
dly_5us();
MC_CKM = 1;
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_5us();
MC_DA = 1;
MC_DAM = 0;
MC_CKM = 0;
// check parity
if (p == p_temp)
{
rd_pc_mc_buf[0] = temp;
MC_CKM = 0;
return true;
}
else
{
MC_CKM = 0;
return fail;
}
}
/*F**************************************************************************
* NAME: bool wr_pc_mc
*----------------------------------------------------------------------------
* PARAMS: None
*
* return: True or fail
*
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
*****************************************************************************/
bool wr_pc_mc(u8 data)
{
#pragma rambank 1
u8 x,val;
bit p;
#pragma rambank off
val = data;
p = 1;
if(val == 0x28)
{
NOP;
}
// check if the bus is busy
if(MC_CK == 0)
{
dly_20us();
if(MC_CK == 0)
{
return fail;
}
}
dly_40us();
dly_5us();
if(MC_CK == 0)
{
return fail;
}
if(MC_DA == 0)
{
return fail;
}
// --- start transmit --- //
MC_CKM = 1;
MC_DAM = 1;
// tx start bit
MC_DA = 0;
dly_20us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_20us();
// tx 8bit data
for(x=0;x<8;x++)
{
//if( (data&(0x01<<x)) == 1 ) // 小心!
//if( val&(0x01<<x))
if(val&0x01)
{
//p = ~p;
if(p) p = 0;
else p = 1;
MC_DA = 1;
}
else
{
MC_DA = 0;
}
dly_10us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_20us();
// test if host driven the ck
MC_CKM = 0;
if(MC_CK == 0)
{
MC_DAM = 0;
return fail;
}
MC_CKM = 1;
val = val>>0x01;
}
// tx parity bit
if( p )
{
MC_DA = 1;
}
else
{
MC_DA = 0;
}
dly_20us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
dly_20us();
MC_CKM = 0;
if(MC_CK == 0)
{
MC_DAM = 0;
return fail;
}
MC_CKM = 1;
// stop bit
MC_DA = 1;
dly_20us();
MC_CK = 0;
dly_40us();
MC_CK = 1;
MC_CKM = 0;
dly_20us();
MC_DAM = 0;
//dly_40us();
//dly_10us();
dly_100us();
dly_100us();
dly_100us();
dly_100us();
dly_100us();
dly_100us();
return true;
}
/*F**************************************************************************
* NAME: pc_mc_prc
*----------------------------------------------------------------------------
* PARAMS: None
*
* return: None
*
*----------------------------------------------------------------------------
* PURPOSE:
* 处理从PC收到的数据
*----------------------------------------------------------------------------
*****************************************************************************/
void pc_mc_prc(void)
{
u8 data;
data = rd_pc_mc_buf[0];
if(mc_mode == WRAP)
{
if(data == 0xff)
{
mc_mode = STREAM;
pc_mc_bufcnt = 0; // clear buffer
add_pc_mc_buf(0xfa);
add_pc_mc_buf(0xaa);
add_pc_mc_buf(0x00);
f_mc_enb = 0;
return;
}
else if( data == 0xec)
{
add_pc_mc_buf(0xfa);
mc_mode = STREAM;
return;
}
else
{
add_pc_mc_buf(data);
return;
}
}
if( data == 0xfe ) // resend
{
return;
}
if( data == 0xf4 )
{
add_pc_mc_buf(0xfa);
f_mc_enb = 1;
}
else if( data == 0xf5 )
{
add_pc_mc_buf(0xfa);
f_mc_enb = 0;
}
else if( data == 0xf2 )
{
add_pc_mc_buf(0xfa);
add_pc_mc_buf(0x03); // 0x03
}
else if(data == 0xff)
{
pc_mc_bufcnt = 0; // clear buffer
add_pc_mc_buf(0xfa);
add_pc_mc_buf(0xaa);
add_pc_mc_buf(0x00);
f_mc_enb = 0;
}
else if ( data == 0xe9 ) // request status
{
add_pc_mc_buf(0xfa);
add_pc_mc_buf(0x00);
add_pc_mc_buf(0x02);
add_pc_mc_buf(0x64);
}
else if( data == 0xee )
{
pc_mc_bufcnt = 0; // clear buffer
add_pc_mc_buf(0xfa);
mc_mode = WRAP;
}
else if(rd_pc_mc_buf[1] == 0xf3)
{
add_pc_mc_buf(0xfa);
s_rate = data;
}
else // 暂时不处理其它的数据,只回应
{
add_pc_mc_buf(0xfa);
}
rd_pc_mc_buf[1] = data; // 暂存收到的数据以便下一次分析
}
/*F**************************************************************************
* NAME: add_pc_mc_buf
*----------------------------------------------------------------------------
* PARAMS: data to be add
*
* return: None
*
*----------------------------------------------------------------------------
* PURPOSE:
* add a byte data to buffer, counter++ automatic
*----------------------------------------------------------------------------
*****************************************************************************/
void add_pc_mc_buf( u8 data )
{
pc_mc_buf[pc_mc_bufcnt] = data;
pc_mc_bufcnt++;
if(pc_mc_bufcnt == 10) //
{
//pc_mc_bufcnt = 7;
rm_pc_mc_buf();
}
}
// 从缓冲区删除最前面那一个byte
void rm_pc_mc_buf(void)
{
/* u8 x;
// 编译出错,为什么?
for(x=0;x<7;x++)
{
pc_mc_buf[x] = pc_mc_buf[x+1];
}
pc_mc_buf[7] = 0;
*/
pc_mc_buf[0] = pc_mc_buf[1];
pc_mc_buf[1] = pc_mc_buf[2];
pc_mc_buf[2] = pc_mc_buf[3];
pc_mc_buf[3] = pc_mc_buf[4];
pc_mc_buf[4] = pc_mc_buf[5];
pc_mc_buf[5] = pc_mc_buf[6];
pc_mc_buf[6] = pc_mc_buf[7];
pc_mc_buf[7] = 0;
if(pc_mc_bufcnt>0)
{
pc_mc_bufcnt--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -