打印
[ARM入门]

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

[复制链接]
1975|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
418417996|  楼主 | 2013-8-3 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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
大神们来人啊  求好心人帮忙啊

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

使用特权

评论回复
地板
418417996|  楼主 | 2013-8-3 23:43 | 只看该作者
来人吧 难受啊

使用特权

评论回复
5
huangxz| | 2013-8-3 23:46 | 只看该作者
到底是哪个问题啊,别下问那么多啊

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
418417996 + 3 赞一个!
6
418417996|  楼主 | 2013-8-3 23:48 | 只看该作者
huangxz 发表于 2013-8-3 23:46
到底是哪个问题啊,别下问那么多啊

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

使用特权

评论回复
7
huangxz| | 2013-8-3 23:48 | 只看该作者
GPFDAT = GPFDAT | (~(1<<4))
是不对的,应该是
GPFDAT = GPFDAT&(~(1<<4))

使用特权

评论回复
8
huangxz| | 2013-8-3 23:51 | 只看该作者
默认情况下 1<<4 = 0x01ul << 4 = 0000 0000 0000 0010
~(1<<4) = FFFF FFFF FFFF FFEF

使用特权

评论回复
9
418417996|  楼主 | 2013-8-3 23:52 | 只看该作者
huangxz 发表于 2013-8-3 23:48
是不对的,应该是

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

使用特权

评论回复
10
418417996|  楼主 | 2013-8-3 23:56 | 只看该作者
本帖最后由 418417996 于 2013-8-4 00:10 编辑
huangxz 发表于 2013-8-3 23:48
是不对的,应该是

如果 ~(1<<4) = FFFF FFFF FFFF FFEF这样那 GPFDAT = GPFDAT | (~(1<<4))  这个就是错的了 谢谢你的回复  谢谢大神   哪我就知道那个运算是怎么回事了 谢谢啊

使用特权

评论回复
11
418417996|  楼主 | 2013-8-4 00:04 | 只看该作者
huangxz 发表于 2013-8-3 23:48
是不对的,应该是

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

使用特权

评论回复
12
huangxz| | 2013-8-4 00:22 | 只看该作者
418417996 发表于 2013-8-4 00:04
我怎么感觉我写的还是对的呢  我没这么写啊GPFDAT = GPFDAT | (~(1

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

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
418417996 + 3 很给力!
13
418417996|  楼主 | 2013-8-4 13:20 | 只看该作者
huangxz 发表于 2013-8-4 00:22
你写的这个式子本身是没有错的,但是使用起来不是这样用的,因为你是对一位操作嘛 ...

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

使用特权

评论回复
14
huangxz| | 2013-8-4 18:33 | 只看该作者
418417996 发表于 2013-8-4 13:20
请原谅我没看懂你的意思,谢谢你的回答,我还是不知道你所指的是我的程序的那个地方的那个错误啊,谢谢你 ...

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

使用特权

评论回复
15
418417996|  楼主 | 2013-8-4 18:48 | 只看该作者
本帖最后由 418417996 于 2013-8-4 19:21 编辑
huangxz 发表于 2013-8-4 00:22
你写的这个式子本身是没有错的,但是使用起来不是这样用的,因为你是对一位操作嘛 ...

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

使用特权

评论回复
16
huangxz| | 2013-8-4 19:26 | 只看该作者
418417996 发表于 2013-8-4 18:48
经过我想了很久,我知道了我为啥错误了,可能对于一个老手这个问题真是太so easy了,但对于一个小白没人帮 ...

呵呵,不客气

使用特权

评论回复
17
呆板书生| | 2013-8-4 23:24 | 只看该作者
先搞清1 << n 这种运算的结果是什么,你就知道结果了

使用特权

评论回复
18
418417996|  楼主 | 2013-8-5 12:45 | 只看该作者
呆板书生 发表于 2013-8-4 23:24
先搞清1

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

使用特权

评论回复
19
418417996|  楼主 | 2013-8-6 21:46 | 只看该作者
结贴:
通过学习,知道了什么是位操作,很位操作的重要,即不改变其他的位的当前功能··

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:求帮助,求解答,求指导,求大神带,求教育,求终身回忆··

2

主题

55

帖子

0

粉丝