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

📄 ps2.c

📁 利用AVR 单片机实现 PS2键盘标 程序
💻 C
📖 第 1 页 / 共 2 页
字号:
*/
	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 + -