单片机按钮2

来源:互联网 发布:高斯过程 知乎 编辑:程序博客网 时间:2024/05/16 15:32

////========================================================

// PA2-PA5  PC3-PC5作为引脚

//行扫描法:从PA2开始逐行置低电压

//双键扫描:K1 K5 K9为同一列PA2控制,如果为同一列,例如K1 K5同时按下,PC5 PC4 PC3的电压为 100 此时PA5 PA4 PA3 PA2 1110

//如果只是K1按下,PC5 PC4 PC3的电压为 110 此时PA5 PA4 PA3 PA2 1110

void GetKeyStatus()
{
 u8 i,j, k=0;
 u8 tmp,sccode,recode;
 u8 TmpCode,TmpPreCode = 0;
 u8 KeyCode[4] = 0;
 u8 ComplexFlag = 0;

 

//设置单片机输入输出,此为芯片仿真所用,在板子上调试
 PAOutputMode();
 PCInputModePush();

 

 


 xPORT_A=xPORT_A&(~0x3C); //0x3C(111100)
 Wait_ms(10);
 tmp=xPORT_C;
 tmp=tmp&0x38; //00111000
 if(0x38 != tmp)
 { 
  Wait_ms(10); // Eliminating shiver
  
  if(0x38 != (tmp & 0x38))
  { 
   Wait_ms(30);
   sccode = ~0x04; //从PA2开始扫描
   while(0x3C != (sccode & 0x3C))
   {
   
    xPORT_A = sccode;
    tmp = xPORT_C;
    tmp = tmp & 0x38 ; 
    if(0x38 != tmp)
    {
     recode = ((sccode & 0x3C) >> 2) & 0x0f | 0xf0; //PA: xxxx 00 >>2 = xxxx  11111101
     TmpCode =  (~((tmp << 1) & 0xf0 | 0x0f)) & 0x7f | (~recode);    //Mode:xxx(pc) xxxx(pa)
     if(TmpPreCode != TmpCode)
     {
      KeyCode[k] = TmpCode;
      k++;
      TmpPreCode = TmpCode; 
     }
    }
    sccode = (sccode << 1)|0x01; 
   }
   
      }
  for(i=0,j = 0;i<(sizeof(KeyCode) /sizeof(u8)); i++)
  {  
   
   if(0 != KeyCode[i])
   {
    KeyNo[j] = fnKeycode(KeyCode[i]);
    j++;
   }
   
  }
  if(j < 2 &&  0x0B >= KeyNo[0])//00:Sigle Button 01:Multi Button
  {
    KeyCode[0] = '0';
   KeyCode[1] = '0';
   KeyCode[2] = KeyNo[0];
  }
  else
  {  
   KeyCode[0] = '0';
   KeyCode[1] = '1';
   if( 0x0B < KeyNo[0])
   {
    KeyCode[2] = KeyNo[0] & 0xF0;
    KeyCode[3] = KeyNo[0] & 0x0F;
   }
   else
   {
    KeyCode[2] = KeyNo[1] ;
    KeyCode[3] = KeyNo[2] ;
   } 
  }

 }
   

}

 


u8 fnKeycode(u8 key)
{
 switch(key)
 {
  case 0x11: 
      key = 0x01;
      break;
  case 0x12: 
      key = 0x02;
      break;
  case 0x14: 
      key = 0x03;
      break;
  case 0x18: 
      key = 0x04;
      break;
  case 0x21: 
      key = 0x05;
      break;
  case 0x22: 
      key = 0x06;
      break;
  case 0x24: 
      key = 0x07;
      break;
  case 0x28: 
      key = 0x08;
      break;
  case 0x41: 
      key = 0x09;
      break;
  case 0x42: 
      key = 0x0A;
      break;
  case 0x44: 
      key = 0x0B;
      break;
   
//===Fuction Keytable===//
  case 0x31:
   key  = 0x15; //K1+K5=15
   break;
  case 0x51:
   key = 0x19;    //K1+K9=19
   break;
  case 0x61:
   key = 0x59;   //K5+K9=59
   break;
  case 0x32:
   key = 0x26; //k2+k6
   break;
  case 0x52:
   key = 0x2A; //k2+ka
   break;
  case 0x62:
   key = 0x6A;//k6+ka
   break;
  case 0x34:
   key =0x37; //k3+k7
    break;
  case 0x54:
   key =0x3B;// k3+kb
   break;
  case 0x64:
   key = 0x7B; //k7+kb
   break;
  case 0x38:
   key = 0x48;  //k4+k8
   break;
  default:
      key = 0x00;
      break;
    }
    return key;
}    

0 0
原创粉丝点击