418417996 发表于 2013-8-3 23:23

求解答,一个按键点亮LED的问题

本帖最后由 418417996 于 2013-8-3 23:35 编辑

#define GPFCON (*(volatile unsigend long*)0x56000050)
#define GPFDAT (*(volatile unsigend long*)0x56000054)
#define GPGCON (*(volatile unsigend long*)0x56000060)
#define GPGDAT (*(volatile unsigend long*)0x56000064)


void delay()
{
      int i,j;
      for(i=1000;i<0;i--)
                for(j=1000;j<0;j--);
}

int main()
{
      GPFCON =(1<<(4*2)) ;//gpf4 位输出
      GPFCON = ~(3<<(0*2));//gpf0 位输入
      
      unsigend long temp ;
      
      while(1)
      {
                temp = GPFDAT ;
                if((temp & 0X1) == 0)//如果gpf0 位低电平 代表按键按下执行
                {
                        GPFDAT = GPFDAT & (~(1<<4)); // GPFDAT的第四位给个 0 点亮LDE
                        delay();
                        GPFDAT = GPFDAT | (1<<4);
                        delay();
                        GPFDAT = GPFDAT & (~(1<<4));
                        delay();
                        GPFDAT = GPFDAT | (1<<4);
                }
      }
      
      return 0;
}
就是 GPF0口的按键 然后 按下是低电平 然后执行if里面的 GPF4口的点亮LED
下到板子上一点反应没有,我感觉是我给数给的有问题,具体的流程应该没问题。

还有我想知道GPFDAT = GPFDAT | (~(1<<4))
这句话的具体是不是这样的       先~(1<<4) 得到 0x1111 11e1然后在和 GPFDAT 原先里面的默认值 去|运算   
如果不是的话 是得到 ~(0001 0000) = 1110 1111 在去和GPFDAT 原先里面的默认值 去|运算
或者是什么呢?
求大神帮帮忙 求求了 真心想知道啊~~!!





418417996 发表于 2013-8-3 23:24

大神们来人啊求好心人帮忙啊

418417996 发表于 2013-8-3 23:34

418417996 发表于 2013-8-3 23:24 static/image/common/back.gif
大神们来人啊求好心人帮忙啊

还有我想知道GPFDAT = GPFDAT | (~(1<<4))
这句话的具体是不是这样的       先~(1<<4) 得到 0x1111 11e1然后在和 GPFDAT 原先里面的默认值 去|运算   如果不是的话是 得到 ~(0001 0000) = 1110 1111 在去和GPFDAT 原先里面的默认值 去|运算
求大神帮帮忙

418417996 发表于 2013-8-3 23:43

来人吧 难受啊

huangxz 发表于 2013-8-3 23:46

到底是哪个问题啊,别下问那么多啊

418417996 发表于 2013-8-3 23:48

huangxz 发表于 2013-8-3 23:46 static/image/common/back.gif
到底是哪个问题啊,别下问那么多啊

就这俩 问题最重要的是第二个那个运算的怎么运算的啊 谢谢

huangxz 发表于 2013-8-3 23:48

GPFDAT = GPFDAT | (~(1<<4))是不对的,应该是GPFDAT = GPFDAT&(~(1<<4))

huangxz 发表于 2013-8-3 23:51

默认情况下 1<<4 = 0x01ul << 4 = 0000 0000 0000 0010
~(1<<4) = FFFF FFFF FFFF FFEF

418417996 发表于 2013-8-3 23:52

huangxz 发表于 2013-8-3 23:48 static/image/common/back.gif
是不对的,应该是

那这个是怎么个算法啊 谢谢你谢谢你
GPFDAT = GPFDAT | (~(1<<4))
这句话的具体是不是这样的       先~(1<<4) 得到 0x1111 11e1然后在和 GPFDAT 原先里面的默认值 去|运算   如果不是的话是 得到 ~(0001 0000) = 1110 1111 在去和GPFDAT 原先里面的默认值 去|运算

418417996 发表于 2013-8-3 23:56

本帖最后由 418417996 于 2013-8-4 00:10 编辑

huangxz 发表于 2013-8-3 23:48 static/image/common/back.gif
是不对的,应该是
如果 ~(1<<4) = FFFF FFFF FFFF FFEF这样那 GPFDAT = GPFDAT | (~(1<<4))这个就是错的了 谢谢你的回复谢谢大神 哪我就知道那个运算是怎么回事了 谢谢啊

418417996 发表于 2013-8-4 00:04

huangxz 发表于 2013-8-3 23:48 static/image/common/back.gif
是不对的,应该是

我怎么感觉我写的还是对的呢我没这么写啊GPFDAT = GPFDAT | (~(1<<4))

huangxz 发表于 2013-8-4 00:22

418417996 发表于 2013-8-4 00:04 static/image/common/back.gif
我怎么感觉我写的还是对的呢我没这么写啊GPFDAT = GPFDAT | (~(1

你写的这个式子本身是没有错的,但是使用起来不是这样用的,因为你是对一位操作嘛

418417996 发表于 2013-8-4 13:20

huangxz 发表于 2013-8-4 00:22 static/image/common/back.gif
你写的这个式子本身是没有错的,但是使用起来不是这样用的,因为你是对一位操作嘛 ...

请原谅我没看懂你的意思,谢谢你的回答,我还是不知道你所指的是我的程序的那个地方的那个错误啊,谢谢你的耐心解答

huangxz 发表于 2013-8-4 18:33

418417996 发表于 2013-8-4 13:20 static/image/common/back.gif
请原谅我没看懂你的意思,谢谢你的回答,我还是不知道你所指的是我的程序的那个地方的那个错误啊,谢谢你 ...

因为你对一位操作,所以你的操作数里面只能有一位为1(or)或者0(and)

418417996 发表于 2013-8-4 18:48

本帖最后由 418417996 于 2013-8-4 19:21 编辑

huangxz 发表于 2013-8-4 00:22 static/image/common/back.gif
你写的这个式子本身是没有错的,但是使用起来不是这样用的,因为你是对一位操作嘛 ...
经过我想了很久,我知道了我为啥错误了,可能对于一个老手这个问题真是太so easy了,但对于一个小白没人帮助下真的挺不容易, 正如huangxz他回答所说的,我的目的是位操作给这个两个寄存器赋值,就是我写的这两行错误的语句,他在执行的时候先执行的//gpf4 位输出 然后执行的//gpf0 位输入这条执行完了之后 会把 //gpf4 位输出 给清除掉变成了 //gpf4 位为输入:
所以应该是这样
GPFCON |=(1<<(4*2)) ;//gpf4 位输出
GPFCON &= ~(3<<(0*2));//gpf0 位输入
没有经过实验,如果有时间我去学下ADS怎么用,然后我把上面两种情况都输入进去,然后观察一下那两个寄存器的值,这样就更好了···
再次感谢 huangxz 回答我,谢谢

huangxz 发表于 2013-8-4 19:26

418417996 发表于 2013-8-4 18:48 static/image/common/back.gif
经过我想了很久,我知道了我为啥错误了,可能对于一个老手这个问题真是太so easy了,但对于一个小白没人帮 ...

呵呵,不客气

呆板书生 发表于 2013-8-4 23:24

先搞清1 << n 这种运算的结果是什么,你就知道结果了

418417996 发表于 2013-8-5 12:45

呆板书生 发表于 2013-8-4 23:24 static/image/common/back.gif
先搞清1

恳请你告诉我一下啊1<<n 之后是什么结果呢??举个例子吧
unsigned int temp= GPFDAT;
if(temp & (1<<0))
{};
这个表达式里面 的temp&(1<<0) 应该是什么样的呢?
是 temp & 0000 0000 0000 0001 这样?
麻烦了 谢谢

418417996 发表于 2013-8-6 21:46

结贴:
通过学习,知道了什么是位操作,很位操作的重要,即不改变其他的位的当前功能··
页: [1]
查看完整版本: 求解答,一个按键点亮LED的问题