dyjhy 发表于 2015-6-12 22:49:16

为什么 static 和 code 同时存在就程序死

本帖最后由 dyjhy 于 2015-6-13 10:49 编辑

下面两段内容中,红色表示的, code 和static不能同时存在,如果同时存在程序就死机,只要去掉任何一个程序都能正常运行。不知道为什么?
                                                当然,static去掉的话,那一行要移到外面作全局变量,按键才会有效。


补充一下:板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。

/*7段共阴字形码表*/
const unsigned char code DB[]={   0x3F ,       /*0-----0*/
                                                       0x06 ,/*1-----1*/
                                                       0x5B ,/*2-----2*/
                                                       0x4F ,       /*3-----3*/
                                                       0x66 ,       /*4-----4*/
                                                       0x6D ,       /*5-----5*/
                                                       0x7D ,/*6-----6*/
                                                       0x07 ,/*7-----7*/
                                                       0x7F ,       /*8-----8*/
                                                       0x6F ,/*9-----9*/
                                                       0x77 ,/*A-----10*/
                                                       0x7C ,       /*B-----11*/
                                                       0x39 ,/*C-----12*/
                                                       0x5E ,       /*D-----13*/
                                                       0x79 ,/*E-----14*/
                                                       0x71 ,/*F-----15*/
       
                                                       0xBF ,       /*0.-----16显示小数点就是原数+16*/
                                                       0x86 ,/*1.-----17*/
                                                       0xDB ,/*2.-----18*/
                                                       0xCF ,       /*3.-----19*/
                                                       0xE6 ,       /*4.-----20*/
                                                       0xED ,       /*5.-----21*/
                                                       0xFD ,/*6.-----22*/
                                                       0x87 ,/*7.-----23*/
                                                       0xFF ,       /*8.-----24*/
                                                       0xEF ,/*9.-----25*/
                                                       
       
                                                       0x00 ,       /*关闭-----26*/
                                                       0x73 ,/*P-----27*/
                                                       0x3E ,/*U-----28*/
                                                       0x6E ,/*Y-----29*/
                                                       0x76 ,/*H-----30*/
                                                       0x38 ,   /*L-----31*/
                                                       0x40         /*'-'-----32*/                                        
                                               }          ;

void key_scan (void)//
{
staticunsigned int key_count;//SW1按键判断计数。
        if(SW1==0&&key_count==0)
        {
                sw1_time=0;
                key_count=1;                                  
               
        }
        if(SW1&&key_count) //按键放开
        {
                key_count=0;
                if(sw1_time>10000) key=3;
                else if(sw1_time>5000) key=2;
                else if(sw1_time>20) key=1;
        }
}

bias 发表于 2015-6-12 23:17:11

请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到


你外部其他函数有给key_count赋值吧,那不就应该外全局吗

117433525 发表于 2015-6-12 23:51:32

你的程序变量被code了,还能修改变量的值?

qq开始学单片机 发表于 2015-6-13 00:04:23

bias 发表于 2015-6-12 23:17
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到



当外部变量用

qq开始学单片机 发表于 2015-6-13 00:06:52

楼主,const同时又code是什么节奏?

wind_zlc 发表于 2015-6-13 00:26:07

qq开始学单片机 发表于 2015-6-13 00:06
楼主,const同时又code是什么节奏?

const是不是有些多余?

qq开始学单片机 发表于 2015-6-13 00:48:32

wind_zlc 发表于 2015-6-13 00:26
const是不是有些多余?

如果是51,用code就行了,如果是其他单片机,用const

wind_zlc 发表于 2015-6-13 00:50:31

qq开始学单片机 发表于 2015-6-13 00:48
如果是51,用code就行了,如果是其他单片机,用const

ok,受教了{:smile:}

dyjhy 发表于 2015-6-13 06:46:58

bias 发表于 2015-6-12 23:17
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到



只是用于消抖,就是只在此函数中用的

dyjhy 发表于 2015-6-13 06:51:02

qq开始学单片机 发表于 2015-6-13 00:06
楼主,const同时又code是什么节奏?

用不用const一样,?调试时加上忘改回了,上面所有的回复都没回到问题的实质

黄晨0410 发表于 2015-6-13 08:12:41

staticunsigned int key_count其它 函数不能访问吧!!

xiaobendan 发表于 2015-6-13 08:25:13

看起来都没问题,只是片段,可能和另外的程序有关,比如调用了DB[]的程序。不过这种显示小数点的方法,倒是不错。另外,key_count非0即1,用int实在是浪费啊。

xiaobendan 发表于 2015-6-13 08:29:40

个人习惯,我不习惯用
static
而习惯上会吧key放到返回值中。

biansf2001 发表于 2015-6-13 08:36:22

没看到问题。不过静态变量需要先初始化。

Denglucky4457 发表于 2015-6-13 08:57:46

key_count用bit就可以了吧。

dyjhy 发表于 2015-6-13 10:50:27

xiaobendan 发表于 2015-6-13 08:25
看起来都没问题,只是片段,可能和另外的程序有关,比如调用了DB[]的程序。不过这种显示小数点的方法,倒是 ...

板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。

spacekey 发表于 2015-6-13 10:55:07

static 占用了太多空间,同全局变量一样, RAM 用光了导至的死机吧

dyjhy 发表于 2015-6-13 10:56:28

biansf2001 发表于 2015-6-13 08:36
没看到问题。不过静态变量需要先初始化。

staticunsigned int key_count=0;也试过了。

板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。

把unsigned int key_count=0;提到程序外部变为全局变量就正常,同样在前面加下static就会死机。

dyjhy 发表于 2015-6-13 11:00:23

spacekey 发表于 2015-6-13 10:55
static 占用了太多空间,同全局变量一样, RAM 用光了导至的死机吧

编译通过,RAM大根100左右,xdata大概200左右,程序大概4K左右。   单片机RAM是128 xdata 是256   ROM是8K。

xiaobendan 发表于 2015-6-13 11:18:09

dyjhy 发表于 2015-6-13 11:00
编译通过,RAM大根100左右,xdata大概200左右,程序大概4K左右。   单片机RAM是128 xdata 是256   ROM是8 ...

用软调试看看程序跑哪儿了

xiaobendan 发表于 2015-6-13 11:19:00

dyjhy 发表于 2015-6-13 10:56
staticunsigned int key_count=0;也试过了。

板了上电,所有都正常,只要按下按键就会死机,我把key_s ...

为什么非要用int类型?

xiaobendan 发表于 2015-6-13 11:22:20

只是分配一个变量就死机,可能还是和RAM分配有关,我在用15W408S,我试试

xiaobendan 发表于 2015-6-13 11:34:52

刚才在函数中加了你那句,为了消灭警告信息,又在下面的按键处理中加了if(key_count<9)key_count++;
编译后data = 122.7,xdata = 0,code = 3502
没问题啊
另外,你这段程序不管按键不按键都是要执行的吧,尤其是变量分配的问题,只保留变量分配,没有其他程序时,编译后的程序是啥样?

zzz123456 发表于 2015-6-13 11:39:45

还是软件仿真一下吧。

xiaobendan 发表于 2015-6-13 11:43:18

变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果

dyjhy 发表于 2015-6-13 11:54:39

xiaobendan 发表于 2015-6-13 11:43
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 ...

晚上回家试试,谢谢!

dyjhy 发表于 2015-6-13 21:07:50

xiaobendan 发表于 2015-6-13 11:43
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 ...

问题找到了,静态变是初始一下就好了, static unsigned char key_count=0;

但是为什么会这样呢,原因还是想不通。不初始化默认不是0吗,code 不加时程序运行很正常的。

xiaobendan 发表于 2015-6-15 07:39:29

14楼早说过了,以为你试过了。
这次用char了。
启动函数里面是有吧data清零的,不知道是否可以。
我昨天实验时也没有初始化,也没发现问题。
页: [1]
查看完整版本: 为什么 static 和 code 同时存在就程序死