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

📄 ps2_bin.c

📁 ps2的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
//函数:ex0()
//功能:外部中断0服务程序
//输入:
//输出:
//描述:
/*********************************************************/
void ex0() interrupt 0 using 3
{        //时钟线变低
         unsigned char bitCount;
         unsigned char KeyCode = 0;
         if(KeyCodeSum < MAXBUFFER) KeyCodeBuff[KeyCodeSum] = 0;
        for(bitCount = 8; bitCount != 0; bitCount --)   // 把起始位算入
   {
    WAITFORKEYBOARDPULSE;     // 等待一个有效的下跳沿
    KeyCode  >>= 1;      // 按照PS2格式,数据低位在前
    scl  = 1;
    sda  = 1;
    if(sda == 1)
  {
      KeyCode |= 0x80; // 得到有效的数据位
     }
   }
   WAITFORKEYBOARDPULSE;     // 等待按键发送效验位
   WAITFORKEYBOARDPULSE;     // 等待按键发送终止位
   while(!scl);         // 等待键盘把时钟线拉高
        switch(KeyCode)
        {

        case CODE_POST:
               KeyBoardConnectFlag = 1;
               break;
        case CODE_ACK:    //键盘应答
           //    Order(LedStatus);
               break;
        case CODE_ECHO:   //键盘的echo回应码 
               break;
        case 0xFE:
               break;             
        case CODE_BREAK:  //键盘发送的是断码
               KeyUpFlag = 1;			  			  
               break;
			   
        case CODE_EXTEND: //键盘发送的是扩展码
              if(KeyExtendFlag == 0)//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               {       // KeyFlag = 1; 
                       KeyExtendFlag = 1;
					   KeyCodeSum=0x00;
                        KeyCodeBuff[KeyCodeSum] = KeyCode;
                        KeyCodeSum+=1;
					
               }         
               break;

        case CODE_PAUSE:  //键盘发送的是Pause键的键码
               KeyPauseFlag = 1;
			   //KeyFlag = 1;
			  KeyCodeSum=0x00;
               KeyCodeBuff[KeyCodeSum] = KeyCode;
               if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
			   
               break;  
     		   /*
        case CODE_NUMLOCK:
               if(KeyPauseFlag == 1 || (KeyMakeCodeFlag == 0 && KeyUpFlag))
               {
                        //KeyFlag = 1; //如果是Pause键的键码(E1+14+77)则77代表键码结束直接发送
						
                        if(KeyMakeCodeFlag == 0) //Pause键发送的键码是(F0+77)
                        {
                                KeyCodeBuff[KeyCodeSum] = CODE_PAUSE;
                                if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
                                KeyCodeBuff[KeyCodeSum] = 0x14;
                                if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
                        }
						
						KeyCodeBuff[KeyCodeSum] = KeyCode;
                        KeyUpFlag = 0;
                        KeyMakeCodeFlag = 0;
                        KeyPauseFlag = 0;
                        break;
               } 
               
        case CODE_CAPSLOCK:
		//KeyFlag = 1;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//	KeyCodeSum=0x00;
		KeyCodeBuff[KeyCodeSum] = KeyCode;
		if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
		break;
                     
        case CODE_SCROLLLOCK:     //发送的是三个LED控制键通码
		      // KeyFlag = 1;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               KeyLedLockFlag = 1;
			   //KeyCodeSum=0x00;
			   KeyCodeBuff[KeyCodeSum] = KeyCode;
			   if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
			   break;
  */                                                 
        default:          //键盘发送的是通码
		
               if(KeyUpFlag ==1)//KeyUpFlag ==
               {                  //发送的是断码之后的通码
			 
                        KeyFlag = 1;             //有正常键被按下
                        KeyUpFlag = 0;           //键弹起标志
                        KeyMakeCodeFlag = 0;     //键通码标志
						KeyExtendFlag = 0;
						if(KeyCode==0x12)KeyCodeBuff[0x03]= 0x00; //断码之后的通码为0X12说明按键码全部接收完毕/
						else
						{
					//	KeyCodeBuff[0x02]= 0x00; //断码之后的通码不为0X12就是普通扩展键清无用的字节
						}
						KeyCodeSum=0x00;
						
						  /*
                        if(KeyPauseFlag == 1)    //Pause键被按下发送的键码是(E1+F0+14)                                    
                        {
                                KeyPauseFlag = 0;
                                KeyCodeBuff[KeyCodeSum] = KeyCode;
                                if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
								else
								{
								KeyCodeSum=0x00;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
								    }
                                break;
                        }
						
						
						if(KeyExtendFlag == 1)
			   {
			    	
                    
                    if((KeyCodeSum > 0x02)) 
					{
					KeyCodeSum=0x00;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
					KeyExtendFlag = 0;
					}
					else
					{
					//KeyCodeSum+=1;
					KeyCodeBuff[KeyCodeSum] = KeyCode;
					KeyCodeSum++;
					}
                   
			   
			   }
	/*
                        if(KeyLedLockFlag == 1)
                        {
                                KeyLedLockFlag = 0;
                                switch(KeyCode)
                                {
                                case CODE_CAPSLOCK:
                                        if(LedStatus & CAPSLOCK_EN)
                                        {
                                                LedStatus &= CAPSLOCK_DIS;
                                        }
                                        else
                                        {
                                                LedStatus |= CAPSLOCK_EN;
                                        }        
                                        break;
                                case CODE_NUMLOCK:
                                        if(LedStatus & NUMLOCK_EN)
                                        {
                                                LedStatus &= NUMLOCK_DIS;
                                        }
                                        else
                                        {
                                                LedStatus |= NUMLOCK_EN;
                                        }
                                        break;
                                case CODE_SCROLLLOCK:
                                        if(LedStatus & SCROLLLOCK_EN)
                                        {
                                                LedStatus &= SCROLLLOCK_DIS;
                                        }
                                        else
                                        {
                                                LedStatus |= SCROLLLOCK_EN;
                                        }   
     							//	    KeyCodeBuff[KeyCodeSum] = KeyCode;
                                        break;
                                }
                                Order(0xED); //设置Led
                                
                                //Order(LedStatus);
                                //LedLock(LedStatus);
                        }  */             
               }
			   
			   
               else               //通码
               {        
			   		//	KeyCodeSum=0x00;
                        KeyCodeBuff[KeyCodeSum] = KeyCode;
                        if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
                     //   KeyMakeCodeFlag  = 1;
               }         	   	 
        }
		                
}
/*********************************************************/
//函数:KeyScan()
//功能:扫描键盘
//输入:
//输出:键值
//描述:
/*********************************************************/
/*
void KeyScan()
{
unsigned char KeyCode;
KeyCode = ReadPS2();
if(KeyCode == CODE_BREAK)
{

  KeyFlag = 1;
}
else
{
  KeyCodeBuff[KeyCodeSum] = KeyCode;
                KeyCodeSum++;
}
}
*/
/*********************************************************/
//函数:ReadPS2()
//功能:扫描键盘
//输入:
//输出:键值
//描述:
/*********************************************************/\

unsigned char ReadPS2()
{
unsigned char KeyCode;  //键盘键值
unsigned char bitCount; //位数
while(scl);   // 等待键盘把时钟第一次拉低

   for(bitCount = 8; bitCount != 0; bitCount --)   // 把起始位算入
   {
    WAITFORKEYBOARDPULSE;     // 等待一个有效的下跳沿
    KeyCode  >>= 1;      // 按照PS2格式,数据低位在前
    scl  = 1;
    sda  = 1;
    if(sda == 1)
  {
      KeyCode |= 0x80; // 得到有效的数据位
     }
   }
   WAITFORKEYBOARDPULSE;     // 等待按键发送效验位
   WAITFORKEYBOARDPULSE;     // 等待按键发送终止位
   while(!scl);         // 等待键盘把时钟线拉高
        if(KeyCode == CODE_POST)
                KeyBoardConnectFlag = 1;
    return(KeyCode);         // 返回按键扫描
}

/*********************************************************/
//函数:Order()
//功能:向键盘发送命令
//输入:命令
//输出:?
//描述:
/*********************************************************/
void Order(unsigned char orderByte)
{
unsigned char cnt;
   unsigned char check;

        //DINT;   //关闭总中断,发送命令到键盘
        
   scl = 0;
   sda = 1;
   for(cnt = 0xff; cnt != 0; cnt --);  // 拉低时钟与数据并延时

   sda = 0;
   scl = 1;
   for(cnt = 8; cnt != 0; cnt --)
{   // 发送八位数据,循环八次

    while(scl);
             if(orderByte & 0x01)
  {
      sda  = 1;      // 根据低位设定输出数据
      check ++;       // 如果输出一个1,效验记录数据加一
     }
     else
     {
      sda  = 0;
     }
    orderByte >>= 1;       // 命令字调整
    while(!scl);       // 输出脉冲
   }
   while(scl);
   if(check % 2)
{       // 如果输出过偶数个脉冲
     sda = 0;       // 效验数据位置1
    }
else
{
     sda = 1;       // 否则数据位置0
    }
   while(!scl);
   while(scl);
   sda  = 1;
   while(!scl);       // 发送终止位
   sda  = 1;
   scl  = 1;
   while((scl) | (sda));     // 等待ACK握手信号
        while(!scl);              //等待scl变高
        //EINT;  //开总中断
}
/*********************************************************/
//函数:void LedLock()
//功能:三个键盘的控制
//输入:三个键盘灯的控制
//输出:三个灯的状态
//描述:
/*********************************************************/
/*
void LedLock(unsigned char LedLock)
{
        Order(0xED);  //控制命令字
        Order(LedLock);
}
/*********************************************************/
//函数:KickDog()
//功能:喂狗
//输入:
//输出:?
//描述:
/*********************************************************/

/*********************************************************/
//函数:Delay()
//功能:延时
//输入:延时时间设定值
//输出:?
//描述:
/*********************************************************/
void Delay(unsigned char Times)
{
unsigned char n;
n = 120;
for(;Times>0;Times--)
{
  for(;n>0;n--)
   ;
}
}

⌨️ 快捷键说明

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