打印

S3C2440怎样判断口线输入?

[复制链接]
1291|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
arm2009wzm|  楼主 | 2013-8-14 08:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用8根IO线(4X4)做面板按钮,4输出4输入,部分程序如下:
        Bufkey = 0x0;                                                    //  按钮标志缓冲区清除
        rGPFDAT |= 0xfd;                                              // 其中一输出口线为低
        if ((rGPFDAT&0x20)==0) Bufkey &= Key_0;      // 如果以输入口线为低,则置位相应的按钮标志位
        if ((rGPFDAT&0x40)==0) Bufkey &= Key_1;     
        if ((rGPFDAT&0x80)==0) Bufkey &= Key_2;     
        ......


反汇编后却成了:
第一句:
        [0xe51f108c]   ldr      r1,0x30004264 ; = #0x31001634
        [0xe3a00000]   mov      r0,#0
        [0xe5810040]   str      r0,[r1,#0x40]

第二句:
        [0xe3a00456]   mov      r0,#0x56000000
        [0xe5901054]   ldr      r1,[r0,#0x54]
        [0xe38110fd]   orr      r1,r1,#0xfd
        [0xe5801054]   str      r1,[r0,#0x54]

后三句:
        [0xe5901054]   ldr      r1,[r0,#0x54]
        [0xe2011020]   and      r1,r1,#0x20
        [0xe5901054]   ldr      r1,[r0,#0x54]
        [0xe2011040]   and      r1,r1,#0x40
        [0xe5901054]   ldr      r1,[r0,#0x54]
        [0xe2011080]   and      r1,r1,#0x80
.......

对于后三句的结果,我百思不得其解。C编译器怎么把语句编译成这样的结果。

相关帖子

沙发
arm2009wzm|  楼主 | 2013-8-14 09:20 | 只看该作者
晕啊!!!
发请求帮助的帖子不到10分钟,自己再看了一下程序,稍微修改了一下(把其中的与 & 改成或 | ):
        if ((rGPFDAT&0x20)==0) Bufkey |= Key_0;      // 如果以输入口线为低,则置位相应的按钮标志位
        if ((rGPFDAT&0x40)==0) Bufkey |= Key_1;     
        if ((rGPFDAT&0x80)==0) Bufkey |= Key_2;     
        ......

汇编后竟成了
[0xe51f008c]   ldr      r0,0x30004264 ; = #0x31001634
[0xe3a01000]   mov      r1,#0
[0xe5801040]   str      r1,[r0,#0x40]
[0xe3a02456]   mov      r2,#0x56000000
[0xe5921054]   ldr      r1,[r2,#0x54]
[0xe38110fd]   orr      r1,r1,#0xfd
[0xe5821054]   str      r1,[r2,#0x54]
[0xe5921054]   ldr      r1,[r2,#0x54]
[0xe3110020]   tst      r1,#0x20
[0x1a000001]   bne      0x30004318  ; (ReadKey + 0x30)
[0xe3a01001]   mov      r1,#1
[0xe5801040]   str      r1,[r0,#0x40]
[0xe5921054]   ldr      r1,[r2,#0x54]
[0xe3110040]   tst      r1,#0x40
[0x1a000002]   bne      0x30004330  ; (ReadKey + 0x48)
[0xe5901040]   ldr      r1,[r0,#0x40]
[0xe3811002]   orr      r1,r1,#2
[0xe5801040]   str      r1,[r0,#0x40]
[0xe5921054]   ldr      r1,[r2,#0x54]
[0xe3110080]   tst      r1,#0x80
[0x1a000002]   bne      0x30004348  ; (ReadKey + 0x60)

程序这样就对了。
这差别也太大了点。看来我的C语言水平太差了(也许C编译器太聪明了),还是汇编程序熟悉一点。
有待努力提高C语言水平。


对了,顺便问一下各位,怎样删除自己的帖子或修改帖子。毕竟才发的帖子。

使用特权

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

本版积分规则

10

主题

29

帖子

0

粉丝