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

📄 ps2_fullfill.c

📁 单片机的PS/2接口程序! 我花了好大功夫写成的两个读写PS2设备的接口程序! 现在介绍PS24 书太少了!给大家借鉴啊!
💻 C
字号:

//-------------单片机向PS/2设备发送数据程序代码如下:

void ps2_sentchar(unsigned char sentchar)
{
	unsigned char sentbit_cnt  = 0x00;
	unsigned char sentchar_chk = 0x00;
	
	EX1 =0; 
	
	//------------发起一个传送,发起始位
	PS2_CLK = 0;
	delay1us(100);
	PS2_DIO = 0;						//起始位	
	PS2_CLK = 1;
	
	//------------发送DATA0-7
	for(sentbit_cnt = 0; sentbit_cnt < 8; sentbit_cnt++)
	{
		while(PS2_CLK)_nop_();			//等待时钟线变为低
		
		PS2_DIO = sentchar & 0x01;		//发送数据
		if(PS2_DIO)sentchar_chk++;		//计算校验
		
		while(!PS2_CLK)_nop_();			//等待时钟线变高
		sentchar >>= 1;					//待发送数据右移一位
	}
	
	//-------------发送校验位	
	while(PS2_CLK)_nop_();				//等待时钟线变为低
	switch(sentchar_chk)
	{
	case  0:
	case  2:
	case  4:
	case  6: PS2_DIO = 1; break;		//奇校验
	case  1:
	case  3:
	case  5:
	case  7: PS2_DIO = 0; break;		//奇校验
	default: break;
	}
	while(!PS2_CLK)_nop_();			//等待时钟线变高
	while(PS2_CLK)_nop_();			//等待时钟线变为低
	
	//-------------发送停止位,停止位总为1
	PS2_DIO = 1; 							
	while(!PS2_CLK)_nop_();			//等待时钟线变高
	while(PS2_CLK)_nop_();			//等待时钟线变为低
	
	//----------接收ACK
	if(PS2_DIO) error(); 				//ACK信号由键盘发出,总为低电平
	while(!PS2_CLK)_nop_();				//等待时钟线变高
	
	EX1 = 1;
}

//---------------单片机由PS/2键盘接收数据程序:外部中断0设置为下降沿触发

void int0() interrupt 0 using 3
{
	EX1=0;
	
	switch(ps2_revchar_cnt)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
	case 6:
	case 7:
	case 8:
			mcu_revchar <<= 1;
	        if(PS2_DIO)
	        	mcu_revchar |= 0x01;
	        ps2_revchar_cnt++;
	        break;
	case 0:
			ps2_revchar_cnt++;
			break;							//开始位,
	case 9:
			ps2_revchar_cnt++;
			break;							//校验位,可添加校验程序
	case 10:
			_nop_();						//停止位
			ps2_revchar_cnt=0;
	       	revchar_flag=1;					//置接收到数据标志位
			break;
	default:
			break;
	}
	
	EX1=1;
}

⌨️ 快捷键说明

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