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

📄 ps2.h

📁 这是一个用c编的程序
💻 H
字号:
#define uchar unsigned char 
#define uint unsigned int
uchar keyv; 			//键值暂存器
uchar keyram[6];	   	//键值存放缓冲区
uchar intNum;	   		//位计数器
uchar dnum;
bit BF=0;			   	//有键按下标志
bit shift=0;			//切换标志
sbit key_data=P3^4;		//数据线
sbit key_clk=P3^2;		//时钟线
/*********************中断接收程序****************************************/
//说明:键盘向主机发送一个数据,主机是通过中断接收的,而且每来一位数据就中断一次
//所以,传输一位数据要中断11次
void key_scan()   interrupt 0  using 1	//使用外部中断0
{   
	 EX0=0;								//关中断
	if((intNum>0)&&(intNum<9))			//第1-8个数据位						
	{
		keyv=keyv>>1;					//右移一位
		if(key_data)
		keyv=keyv|0x80;					//如果数据为1,键值暂存器最高位置1
	}
	intNum++;							//位计数器
	if(intNum>10)						//当一位数据传输完成
	{	keyram[dnum]=keyv;
		intNum=0;						//位计数器清零	  
		BF=1;						   	//置有键按下标志
		EA=0;
										//关总中断 等待处理
	}									


	EX0=1;								//开中断
}
/*********************ps2命令发送程序*********************************/
void ps2_sentchar(unsigned char sentchar)
{
	uchar i;                               
 	uchar sentbit_cnt=0x00;
 	uchar sentchar_chk=0x00;	//奇校验计数器
	EX0=0;						//禁止中断
	IT0=0; 
  	key_clk= 0;         
 for(i=0;i<200;i++) _nop_();  	//将时钟线拉低并保持100 us抑制通信
 	key_data= 0;       			//起始位 "请求发送"
 	key_clk= 1; 				//释放时钟线
 for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++)
  {   
   while(key_clk) _nop_();         	//等待时钟线变为低	主设备总是在时钟线为低电平时改变数据线的状态,
   key_data = sentchar & 0x01;		//发送数据		    从设备在时钟上升沿读人数据线状态.
   if(key_data)   sentchar_chk++;   //校验计数
   while(!key_clk) _nop_();         //等待时钟线变高
   sentchar>>=1;                    //待发送数据右移一位
  }
 while(key_clk) _nop_();            //等待时钟线变低
 switch(sentchar_chk)				//奇校验
  {
   case 0:
   case 2:
   case 4:
   case 6:key_data=1;break;                      
   case 1:
   case 3:
   case 5:
   case 7:key_data = 0;break;       //奇校验
   default:break;
  }
 	while(!key_clk) _nop_();        //等待时钟线变高
 	while(key_clk) _nop_();         //等待时钟线变低
 	key_data =1;                  	//发送停止位,停止位总为1
 	while(!key_clk) _nop_();        //等待时钟线变高
 	while(key_clk) _nop_();         //等待时钟线变低
 	while(!key_clk) _nop_();        //等待时钟线变高
    key_clk=1;
	key_data=1;						//释放数据线
   	EX0=1;							//开中断
   	IT0=1; 
}
/***********************************************************************************/ 

⌨️ 快捷键说明

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