书中讲解用开关控制LED的实验,哪位做出来了,帮忙看看?

大家好:
      我用的是TQ2440板子,LED1~4对应GPB5~8,K1~K4对应GPF1,GPF4,GPF2,GPF0.

我比着书上那个思路做了个简化的:四个开关都可以控制LED1的亮灭。
程序如下:
#define GPBCON  (*(volatile unsigned long *)0x56000010)
#define GPBDAT  (*(volatile unsigned long *)0x56000014)
#define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT  (*(volatile unsigned long *)0x56000054)

#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out  (1<<(8*2))

#define GPF1_in  ~(3<<(1*2))
#define GPF4_in  ~(3<<(4*2))
#define GPF2_in  ~(3<<(2*2))
#define GPF0_in  ~(3<<(0*2))

int main(void)
{
unsigned long data;
GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;
GPFCON = GPF1_in & GPF4_in & GPF2_in & GPF0_in;
GPBDAT = 15<<5;(我的板子一上电,四个灯全亮,先把他灭了)

while(1)
{
  data = GPFDAT;

  if(data & (1<<1))          //K1
  {
  GPBDAT = 0x00000020;
  }
  else
  {
  GPBDAT = 0x00000000;
  }

  if(data & (1<<4))        //K2
  {
  GPBDAT = 0x00000020;
  }
  else
  {
  GPBDAT = 0x00000000;
  }

  if(data &(1<<2))          //K3
  {
  GPBDAT = 0x00000020;
  }
  else
  {
  GPBDAT = 0x00000000;
  }

  if(data & (1<<0))        //K4
  {
  GPBDAT = 0x00000020;
  }
  else
  {
  GPBDAT = 0x00000000;
  }
}
return(0);
}

这样,应该是上电之后,灯全灭,不管按下哪个开关,LED1都应该亮才对。
但是实际是:不管按下哪个开关,灯都不亮。


请前辈讲解下。谢谢!