在一段代码里,想通过按下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的数值来判断是否按下,而类似于要通过一个中间变量 |