打印

[求助]这两个按键扫描代码有逻辑上有什么不同

[复制链接]
1897|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lthirty|  楼主 | 2007-8-12 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一段代码里,想通过按下K1,执行一些命令。开始写了第一种,但不行。
(K1是一个直接按钮,sbit K1 = P1^4,按下后接地)
bit scan_key()
{
           K1 = 0x01;
    if(!K1)
    {
        delayms(10);
        if(!K1)
        {
            K1 = 1;
            while(!K1);
            return(1);
        }
    }
}
,反汇编之后的代码是
    73: bit scan_key() 
    74: { 
    75:         K1 = 0x01; 
C:0x0003    D294     SETB     K1(0x90.4)
    76:         if(!K1) 
C:0x0005    20940E   JB       K1(0x90.4),C:0016
    77:         { 
    78:                 delayms(10); 
C:0x0008    7F0A     MOV      R7,#0x0A
C:0x000A    120017   LCALL    delayms(C:0017)
    79:                 if(!K1) 
C:0x000D    209406   JB       K1(0x90.4),C:0016
    80:                 { 
    81:                         K1 = 1; 
C:0x0010    D294     SETB     K1(0x90.4)
    82:                         while(!K1); 
C:0x0012    3094FD   JNB      K1(0x90.4),C:0012
    83:                         return(1); 
C:0x0015    D3       SETB     C
    84:                 } 
C:0x0016    22       RET
其中第79行的if(!K1)为什么反汇编之后是JB       K1(0x90.4),C:0016。仿真的时候,就是这句代码导致不能执行。
之后改成这样
88: bit scan_key() 
    89: { 
    90:         unsigned char key_s; 
    91:         key_s = 0x01; 
C:0x0003    750801   MOV      0x08,#0x01
    92:         K1 = 0x01; 
C:0x0006    D294     SETB     K1(0x90.4)
    93:         if((key_s & K1) != 0x01) 
C:0x0008    A294     MOV      C,K1(0x90.4)
C:0x000A    E4       CLR      A
C:0x000B    33       RLC      A
C:0x000C    5508     ANL      A,0x08
C:0x000E    6401     XRL      A,#0x01
C:0x0010    6015     JZ       C:0027
    94:         { 
    95:                 delayms(10); 
C:0x0012    7F0A     MOV      R7,#0x0A
C:0x0014    120028   LCALL    delayms(C:0028)
    96:                 if((key_s & K1) != 0x01) 
C:0x0017    A294     MOV      C,K1(0x90.4)
C:0x0019    E4       CLR      A
C:0x001A    33       RLC      A
C:0x001B    5508     ANL      A,0x08
C:0x001D    6401     XRL      A,#0x01
C:0x001F    6006     JZ       C:0027
    97:                 { 
    98:                         K1 = 1; 
C:0x0021    D294     SETB     K1(0x90.4)
    99:                         while(!K1); 
C:0x0023    3094FD   JNB      K1(0x90.4),C:0023
   100:                         return(1); 
C:0x0026    D3       SETB     C
   101:                 } 
   102:         } 
   103: } 
就通过,可以了。
为什么不能通过直接判断K1的数值来判断是否按下,而类似于要通过一个中间变量

相关帖子

沙发
gjg191| | 2007-8-12 21:19 | 只看该作者

dd

那你怎么不用汇编直接写一个!!

使用特权

评论回复
板凳
hotpower| | 2007-8-12 21:25 | 只看该作者

少一句return(0);

bit scan_key()
{
           K1 = 0x01;
    if(!K1)
    {
        delayms(10);
        if(!K1)
        {
            K1 = 1;
            while(!K1);
            return(1);
        }
    }
    return(0);
}

使用特权

评论回复
地板
mannerfh| | 2007-8-12 21:47 | 只看该作者

不懂

   我也出现过这种情况,但没查出原因,希望高手能讲得详细些,谢谢!

使用特权

评论回复
5
jimoom| | 2007-8-13 07:35 | 只看该作者

拉高口线

既然是 K1 是 P1^4

那下面的拉高口线应该是:K1=0X10

使用特权

评论回复
6
lthirty|  楼主 | 2007-8-30 19:55 | 只看该作者

不好意思,一直有事了

实在不好意思,一直有事,所以没来得及回。
试了一下,确实加个 return(0) 就行了。
看反编译,是不是 return(0)的作用就是清进位标志位啊?
那在第二个scan_key函数中是不是最好也加上这一句?

使用特权

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

本版积分规则

10

主题

25

帖子

1

粉丝