裸奔程序之查询方式检测按键

       开发环境:ADS1.2

       实验实现功能:TQ2440开发板上按下某个键后对应的LED被点亮,如:按下key1点亮led1。下面是main.c程序

—————————————————————————————————————

#include "2440addr.h"


#define KEY1  (0<<2)
#define KEY2  (0<<8)
#define KEY3  (0<<4)
#define KEY4  (0<<0)

#define  LED1_ON   (rGPBDAT &=~(1<<5))
#define  LED1_OFF (rGPBDAT |=(1<<5) )
#define  LED2_ON   (rGPBDAT &=~(1<<6))
#define  LED2_OFF (rGPBDAT |=(1<<6))
#define  LED3_ON   (rGPBDAT &=~(1<<7))
#define  LED3_OFF (rGPBDAT |=(1<<7))
#define  LED4_ON   (rGPBDAT &=~(1<<8))
#define  LED4_OFF (rGPBDAT |=(1<<8))


void Led_Init(void)
{
        rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16));    //对GPBCON[10:17]清零
        rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16));       //设置GPB5~8为输出
        rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8));              //设置GPB5~8的上拉功能
        rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8);                 //关闭LED
}

void Key_Init(void)
{
       rGPFCON &=~((3<<0)|(3<<2)|(3<<4)|(3<<8));         //使rGPFCON相应的位清零
       rGPFCON |=KEY1|KEY2|KEY3|KEY4;                    //设置为输入
       rGPFDAT |=(1<<0)|(1<<1)|(1<<2)|(1<<4);              //相应端口设置为高电平
}

int Key_Scan(void)
{
      int keynum=0;
      if((rGPFDAT & (1<<1))==0)  //按键1按下
      {
            keynum=1;
     }
     if((rGPFDAT & (1<<4))==0)  //按键2按下
     {
           keynum=2;
     }
     if((rGPFDAT & (1<<2))==0)  //按键3按下
     {
          keynum=3;
     }
     if((rGPFDAT & (1<<0))==0)  //按键4按下
     {
          keynum=4;
     }
     return keynum;
}

int main( )
{
       Led_Init();
       Key_Init();
       while(1)
       {
              switch(Key_Scan())
               {
                       case 1:Led_Init();   LED1_ON;   break;
                       case 2:Led_Init();   LED2_ON;   break;
                       case 3:Led_Init();   LED3_ON;   break;
                       case 4:Led_Init();   LED4_ON;   break;
                       default : break;
               }
}
    return 0;
}
—————————————————————————————————————

      #include "2440addr.h"   这个在上LED详解已经介绍过,这里不再详述;

      我们首先来看看TQ公司的按键设计是怎样的:

裸奔程序之查询方式检测按键_第1张图片

 

 

     从这里,我们可以看到,K1~K4分别接到核心板的EINT1、EINT4、EINT2、EINT0,对应的GPIO口为如下所示:

 

 

       所以我们要控制的IO口为GPF1、GPF4、GPF2、GPF0这四个寄存器。我们首先分析main函数,进入main函数后,首先调用Led_Init();函数,这个函数就是我们LED详解里面讲过的设置GPBCON对应位为输出,GPBUP对应位为上拉有效,GPBDAT对应位写入1关闭全部LED。

      接着调用Key_Init(); 我们进入Key_Init();函数看看:
      void Key_Init(void)
     {
              rGPFCON &=~((3<<0)|(3<<2)|(3<<4)|(3<<8));         //使rGPFCON相应的位清零
              rGPFCON |=KEY1|KEY2|KEY3|KEY4;                    //设置为输入
              rGPFDAT |=(1<<0)|(1<<1)|(1<<2)|(1<<4);                //相应端口设置为高电平
      }
     首先是设置GPFCON对应位为输入,因为我们要检查按键是否按下,当然是设置为输入而不是输出啦。如果是输入的话,我们不用理是否上拉这个寄存器。接着,将GPFDAT对应为设置为高电平,因为我们要一旦按下某个键之后,对应的GPFDAT就为0。其实TQ公司设计按键的电路时候已经将对应的按键IO设置为上拉,即初始化为高电平。
     接着我们进入while(1)死循环,用一个switch语句,检测哪个按键被按下。我们进入int Key_Scan(void);这个函数看看:
      int Key_Scan(void)
     {
             int keynum=0;
             if((rGPFDAT & (1<<1))==0)   //按键1按下
            {
                    keynum=1;
            }
            if((rGPFDAT & (1<<4))==0)   //按键2按下
            {
                   keynum=2;
            }
            if((rGPFDAT & (1<<2))==0)   //按键3按下
            {
                  keynum=3;
            }
            if((rGPFDAT & (1<<0))==0)   //按键4按下
            {
                 keynum=4;
            }
          return keynum;
    }
     这个函数就是检测GPFDAT 对应位是否为0,如果为0就返回对应位的值,比如:rGPFDAT[1]位为0,则返回1,表示K1被按下,其他同理。
    在switch里面如果检测到返回值为1,则先初始化LED,接着点亮LED1,同理其他亦是如此。如果返回值不是1、2、3、4就跳出switch语句。最后main函数也是返回0。
————————————————————————————————————
    按键程序到这里就讲解完毕啦。大笑

 

你可能感兴趣的:(IO)