为什么 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;
}
} 请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到
你外部其他函数有给key_count赋值吧,那不就应该外全局吗
你的程序变量被code了,还能修改变量的值? bias 发表于 2015-6-12 23:17
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到
当外部变量用 楼主,const同时又code是什么节奏? qq开始学单片机 发表于 2015-6-13 00:06
楼主,const同时又code是什么节奏?
const是不是有些多余? wind_zlc 发表于 2015-6-13 00:26
const是不是有些多余?
如果是51,用code就行了,如果是其他单片机,用const
qq开始学单片机 发表于 2015-6-13 00:48
如果是51,用code就行了,如果是其他单片机,用const
ok,受教了{:smile:} bias 发表于 2015-6-12 23:17
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到
只是用于消抖,就是只在此函数中用的 qq开始学单片机 发表于 2015-6-13 00:06
楼主,const同时又code是什么节奏?
用不用const一样,?调试时加上忘改回了,上面所有的回复都没回到问题的实质 staticunsigned int key_count其它 函数不能访问吧!! 看起来都没问题,只是片段,可能和另外的程序有关,比如调用了DB[]的程序。不过这种显示小数点的方法,倒是不错。另外,key_count非0即1,用int实在是浪费啊。 个人习惯,我不习惯用
static
而习惯上会吧key放到返回值中。 没看到问题。不过静态变量需要先初始化。 key_count用bit就可以了吧。 xiaobendan 发表于 2015-6-13 08:25
看起来都没问题,只是片段,可能和另外的程序有关,比如调用了DB[]的程序。不过这种显示小数点的方法,倒是 ...
板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。 static 占用了太多空间,同全局变量一样, RAM 用光了导至的死机吧 biansf2001 发表于 2015-6-13 08:36
没看到问题。不过静态变量需要先初始化。
staticunsigned int key_count=0;也试过了。
板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。
把unsigned int key_count=0;提到程序外部变为全局变量就正常,同样在前面加下static就会死机。 spacekey 发表于 2015-6-13 10:55
static 占用了太多空间,同全局变量一样, RAM 用光了导至的死机吧
编译通过,RAM大根100左右,xdata大概200左右,程序大概4K左右。 单片机RAM是128 xdata 是256 ROM是8K。 dyjhy 发表于 2015-6-13 11:00
编译通过,RAM大根100左右,xdata大概200左右,程序大概4K左右。 单片机RAM是128 xdata 是256 ROM是8 ...
用软调试看看程序跑哪儿了 dyjhy 发表于 2015-6-13 10:56
staticunsigned int key_count=0;也试过了。
板了上电,所有都正常,只要按下按键就会死机,我把key_s ...
为什么非要用int类型? 只是分配一个变量就死机,可能还是和RAM分配有关,我在用15W408S,我试试 刚才在函数中加了你那句,为了消灭警告信息,又在下面的按键处理中加了if(key_count<9)key_count++;
编译后data = 122.7,xdata = 0,code = 3502
没问题啊
另外,你这段程序不管按键不按键都是要执行的吧,尤其是变量分配的问题,只保留变量分配,没有其他程序时,编译后的程序是啥样? 还是软件仿真一下吧。
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 xiaobendan 发表于 2015-6-13 11:43
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 ...
晚上回家试试,谢谢! xiaobendan 发表于 2015-6-13 11:43
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 ...
问题找到了,静态变是初始一下就好了, static unsigned char key_count=0;
但是为什么会这样呢,原因还是想不通。不初始化默认不是0吗,code 不加时程序运行很正常的。 14楼早说过了,以为你试过了。
这次用char了。
启动函数里面是有吧data清零的,不知道是否可以。
我昨天实验时也没有初始化,也没发现问题。
页:
[1]