scankeyboard.c

来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 117 行

C
117
字号
/****************************************************************
**                                                              *
**  FILE         : ScanKeyBoard.C                               *
**                                                              *
**  By : Cyb 2007.01.11                                         *
****************************************************************/

#include "includes.h"
#include "hardware.h"
#include "timetask.h"
#include "errcode.h"
#include "errtask.h"
#include "ScanKeyBoard.h"



static BOOLEAN IsSingleY_Zero(INT32U portv,INT8U y)
{
       INT32U porty;
       
       switch(y)
       {
          case 0:
          porty = PORT_Y0;
          break;
          case 1:
          porty = PORT_Y1;
          break;
          case 2:
          porty = PORT_Y2;
          break;
          case 3:
          porty = PORT_Y3;
          break;
          default:
          break;
       }
       
       if(portv & porty)  
       {
           return FALSE;
       }
       else
       {
           return TRUE;
       }
}

static void Control_PortX(INT8U x)
{
    Init_PIN_AllX();
    
    switch(x)
    {
      case 0:
      *AT91C_PIO_SODR = PIN_X0|PIN_X1|PIN_X2;
      *AT91C_PIO_CODR = PIN_X3;
      break;
      case 1:
      *AT91C_PIO_SODR = PIN_X0|PIN_X1|PIN_X3;
      *AT91C_PIO_CODR = PIN_X2;
      break;
      case 2:
      *AT91C_PIO_SODR = PIN_X0|PIN_X2|PIN_X3;
      *AT91C_PIO_CODR = PIN_X1;
      break;
      case 3:
      *AT91C_PIO_SODR = PIN_X1|PIN_X2|PIN_X3;
      *AT91C_PIO_CODR = PIN_X0;
      break;
      default:
      break;  
    }
}

INT32U ScanKeyBoard(void)
{
      INT8U    i,j;
      INT8U    rececnt;
      INT32U   receporty;
      INT32U   keyvalue;
      
      rececnt = 0;
      
      for(i=0;i<4;i++)
      {
          Control_PortX(i);
          
          receporty = ReadPort_AllY();
          
          for( j=0;j<4;j++)
          {
              if(IsSingleY_Zero(receporty,j))
              {
                  rececnt++;
                  keyvalue = (3-i)*4 + (3-j); 
              } 
          }
      } 
      
      if( rececnt != 0)
      {
          if ( rececnt !=1)
          {
              return 0xEE;
          }
          else
          {
              return  keyvalue;
          }
      }
      else
      {
          return 0xFF;
      }
  
}

⌨️ 快捷键说明

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