keilc51中if中的表达式

在keilc51中为什么if中的表达式为0,程序还是会进入到if里面?
#include "reg52.h"
#include "math.h"
#define KEY P1
#define LED P0
typedef unsigned int uint;
typedef unsigned char uchar;

uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                       0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void delay(double a)
{
    uint b=a*100;
    while(b--);
}

int key_scan()
{
    int n,m;
    for(n=0;n<4;++n)
    {
        KEY=~(0x01<<n);
        if(KEY!=~(0x01<<n))
        {
            delay(10);
            if(KEY!=~(0x01<<n))
            {
                switch(KEY&0xF0)
                {
                    case 0x70:m=4-n;break;
                    case 0xb0:m=8-n;break;
                    case 0xd0:m=12-n;break;
                    case 0xe0:m=16-n;break;
                }
            }
            while(KEY!=~(0x01<<n));
            return m;
        }
    }
    return 0;
}

void smg(int s)
{
    if(s>0)
    {
        LED=duan[s-1];
    }
}

void main()
{
    while(1)
    {
        smg(key_scan());
    }
}

img

img

这个if中的表达式应该是0,但是程序却跳到了delay(10)

下面这句


int n,m;

在前面加上valotile试试


valotile int n,m;

P1读之前得写FF,你最好把for前边的值赋值给另外一个变量用那个变量判断,不要再用KEY也就是P1读取了