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

📄 send.c

📁 利用89S51将6*6键盘转换成PS/2协议
💻 C
字号:
#include<head.c>
#define KEYNO_MAX 26  												//只定义了26个英文字母。需要修改
extern unsigned char data last_key;//main_t.c中定义
extern bit last_f;                 //main_t.c中定义
extern unsigned char data delay_count,send_delay;//protocol.c中定义
extern unsigned char data first_delay,old_delay;//protocol.c中定义
typedef unsigned char code *tt;
extern tt code kk[];//code.c中定义
bit second_f;

void delayl(unsigned int z)
{
	unsigned int x,y;
	for(x=z;x>0;x--)
		for(y=1100;y>0;y--);
}
bit send_code(unsigned char _KeyNo,bit flag)
//发送按键扫描码,flag=0发送断开码,flag=1发送接通码,
//返回0表示发送成功,返回1表示发送失败
{
  unsigned char *Key_code;
  if(_KeyNo<=KEYNO_MAX)
    Key_code=kk[_KeyNo];
  else
    return 0;
  if(!flag)              //flag=0,则发送断码,将Key_code调整到指向断码位置.
    while(*(Key_code++));//比如Key_code={_A_M,0,_A_B,0},则while循环直到*Key_code为0才退出,同时Key_code指向_A_B
 	KBACT=0;              //LINK ACT
	delayl(50);
	KBACT=1;
  while(1)
    {
	  if(*Key_code)//*Key_code非0,表明尚有扫描码需要发送
	    {
		 if(send(*(Key_code++)))
		   continue;
	     else 
	       return 0;
	    }
	  else         //发送完成
	    return 1;
    }
}

void send_buf()			//将缓冲区键的接通码或断开码发送给计算机键盘接口
{  
  unsigned char i=buf_length();

  while(i>0)
     {
	   i--;
	   switch(get_head_f())
	     {
		   case 0:		   //这次扫描该键没有按下
		      if(send_code(get_head(),0))   
		       del_head();
		       break;
		   case 1:         //如果缓冲区头地址处的标识为1,表明其对应按键被按下,将其标识置为0,重新插入缓冲区中
		     if(!insert(get_head(),0))
		       {
		         send(0);//插入错误,发送NULL码
			     clr_buf();
		       }
		     else 
	               del_head();
 		       break;
	     }
     }

/*发送last_key对应的按键通码,第一次发送后开启定时器0,将second_f标识设为1,如果按键一直被按住,则经过延缓时间
first_delay后将再次发送扫描码,同时将second_f置0,在此之后将按照拍发速率发送通码(由old_delay决定拍发速率的大小)
*/	 
   if(exist(last_key)!=255)//最后一次扫描到的按键在键盘缓冲区中存在
     {
	 if(last_f==1)//第一次发送扫描码
        {
         last_f=0;
	     second_f=1;
	     send_delay=0;//计数器1中改变该值
	     send_code(last_key,1);
	     set_timer0();//计数器1开始计数,delay_count值递增
 	    }
	 
	 else if(second_f)//第二次发送扫描码,延时由延缓时间决定
	   {
         if(send_delay<first_delay+10)//等待send_delay值超过延缓时间first_delay
		 return ;
	     send_delay=0;
         send_code(last_key,1);
	     second_f=0;
	   }
	 else //第三 -N次发送,延时由拍发速率决定
	  {
        if(send_delay<old_delay+100)//等待send_delay值超过拍发速率old_delay
		 return ;
	    send_delay=0;
	    send_code(last_key,1);
	  }
	  
    }
	
}

⌨️ 快捷键说明

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