涛声2012 发表于 2012-11-9 19:49:22

大家看看 ,这个是不是51单片机开发环境KEIL的一个BUG

昨天晚上设计了一个带按键控制的时钟,程序很小,当时很好用,没问题。

但今天,又加上电,按键按了几次后就好像是无效了。但数码管还是没问题的,正常显示。

部分代码如下:

uchar KeyScan(void)
{
        uchar keyvalue=0;
        static   key_state=0;//检查了代码后,发现这里没有定义变量类型,但KEIL4没有任何报错,或警告;修改后加上uchar,重新编译下载,问题解决;
        switch(key_state)
        {
                case 0:
                        P3=0xf0;DelayXus(2);
                        if(P3!=0xf0) key_state=1;
                        break;
                case 1:
                        P3 = 0x7F;   //S4 S5 S6 S7第一列
                        switch(P3)
                        {
                        case 0x7E: keyvalue = 1;break;
                        case 0x7D: keyvalue = 5;break;
                        case 0x7B: keyvalue = 9;break;
                        case 0x77: keyvalue = 13;break;
                        default: break;   
                        }
                        P3 = 0xBF;   //S8 S9 S10 S11        第二列
                        switch(P3)
                        {
                        case 0xBE: keyvalue = 2;break;
                        case 0xBD: keyvalue = 6;break;
                        case 0xBB: keyvalue = 10;break;
                        case 0xB7: keyvalue = 14;break;
                        default: break;
                        }
                        P3 = 0xDF; //S12 S13 S14 S15        第三列
                        switch(P3)
                        {
                        case 0xDE: keyvalue = 3;break;
                        case 0xDD: keyvalue = 7;break;
                        case 0xDB: keyvalue = 11;break;
                        case 0xD7: keyvalue = 15;break;
                        default: break;                          
                        }
                        P3 = 0xEF; //S16 S17 S18 S19           第四列
                        switch(P3)
                        {
                        case 0xEE: keyvalue = 4;break;
                        case 0xED: keyvalue = 8;break;
                        case 0xEB: keyvalue = 12;break;
                        case 0xE7: keyvalue = 16;break;
                        default: break;
                        }
                        if(keyvalue==0) key_state=0;
                        else key_state=2;
                        break;
                case 2:
                        P3=0xf0;DelayXus(2);
                        if(P3==0xf0) key_state=0;
                        break;
        }
        return keyvalue;
}

大家不妨一试,这里,我想很有可能是static让KEIL4怎么了吧。

涛声2012 发表于 2012-11-12 12:19:44

devcang 发表于 2012-11-11 23:55 static/image/common/back.gif
和版本的有关,可能是 带符号的32位整形。如果是什么修饰都不写,看编译器,有的会警告:warning: data d ...


Build target '目标 1'
compiling 测量温度 新.c...
linking...
Program Size: data=64.4 xdata=0 code=1078
creating hex file from "数字温度计DS18B20测量温度"...
"数字温度计DS18B20测量温度" - 0 Error(s), 0 Warning(s).

这个是没加uchar的编译结果;

Build target '目标 1'
compiling 测量温度 新.c...
linking...
Program Size: data=63.4 xdata=0 code=1064
creating hex file from "数字温度计DS18B20测量温度"...
"数字温度计DS18B20测量温度" - 0 Error(s), 0 Warning(s).


这个是加上uchar的编译结果;这个是正确的;

比较下来Program Size: 一项不同;
不知各位,有何高见?

devcang 发表于 2012-11-10 14:03:02

有个默认的类型,这样的问题是编译器的问题。

涛声2012 发表于 2012-11-11 20:50:12

devcang 发表于 2012-11-10 14:03 static/image/common/back.gif
有个默认的类型,这样的问题是编译器的问题。

有个默认的类型?

什么类型呢?

20112672 发表于 2012-11-11 22:44:36

static去掉后试了么???

devcang 发表于 2012-11-11 23:55:29

本帖最后由 devcang 于 2012-11-11 23:57 编辑

涛声2012 发表于 2012-11-11 20:50 static/image/common/back.gif
有个默认的类型?

什么类型呢?

和版本的有关,可能是 带符号的32位整形。如果是什么修饰都不写,看编译器,有的会警告:warning: data definition has no type or storage class。

zjk 发表于 2012-11-12 08:57:34

警告肯定会有的,估计LZ当时看没错只有警告就没在意

涛声2012 发表于 2012-11-12 12:13:34

20112672 发表于 2012-11-11 22:44 static/image/common/back.gif
static去掉后试了么???

static去掉,只剩key_state=0;吗?

这个,会报错;

还是剩下uchar key_state=0;
这样编译通过,但不和原意;

涛声2012 发表于 2012-11-12 12:14:49

zjk 发表于 2012-11-12 08:57 static/image/common/back.gif
警告肯定会有的,估计LZ当时看没错只有警告就没在意

哈哈,怎么会呢,就是什么都没有的,不信你试试,我用的KEIL4版本;
页: [1]
查看完整版本: 大家看看 ,这个是不是51单片机开发环境KEIL的一个BUG