51单片机静态局部变量问题>?

刚在论坛上看了一篇名为51单片机编程技巧的文章,上面说静态变量最好放在CODE里,可是如果 放在CODE里给变量付初值以后那是不是这个静态变量的值就能在再改变了,因为是CODE的,只能写不能改写或读出,求解。

变量的分类名词我也搞不太清楚,放在程序存储器中的变量(静态变量?常量?),它的值是不可以在程序执行过程中改变的。比如一个数码管译码表:unsigned char code /*数码管字符表*/a[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xb6,0xe0,0xfe,0xf6}; a数组只能被读取,而不能重新赋值。定义在函数外面的变量(全局变量?),任何函数都可以读取改变它的值,它会永远占用内存空间。如:unsigned char a;void main(void){ unsigned char b; b=a; a=3; ……}void sss(void){ …… a=6; ……}定义在一个函数里面没加static前缀的变量(局部变量?),该变量只在这个函数中有效,在其它函数中无法读取和改变它的值,当跳出这个函数后,它所占用的内存空间将被释放,留给其它局部变量用。如:unsigned char aaa(){ unsigned char b; …… return b;}还有一种变量,就是在函数里面定义,但是加了static前缀的,在离开该函数后他的值任然会保留(一直占用内存空间)。给个例子给你:/*串口接收中断 */
void serial_int(void) interrupt 4
{
static unsigned char i=0;
static unsigned char num=0;
static unsigned char rx_hlf=0;

unsigned char rx_dat;

if(TI) TI=0;
else if (RI) {
rx_dat=SBUF;
RI=0;
switch (num)
{
case 0: if(rx_dat==':') num=1; break; case 1: if(rx_hlf){
rx_long += asc_to_hex(rx_dat);
rx_hlf = 0;
num=2;
}
else {
rx_long = asc_to_hex(rx_dat)<<4;
rx_hlf = 1;
}
break; case 2: if(rx_hlf){
rx_buff[i] += asc_to_hex(rx_dat);
rx_hlf = 0;
if(++i>rx_long) {
num=0;
i=0;
rx_finish=1;
}
}
else {
rx_buff[i] = asc_to_hex(rx_dat)<<4;
rx_hlf = 1;
}
break; default: num=0; break;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-31
静态变量是可以改变的,只是它的生命周期并不是因函数结束等而结束,而是跟整个程序的结束而结束!

其实放那都一样...又不是静态常量!
第2个回答  2013-03-30
放在CODE里面当然就不能改变了啊,可能你记错了吧
第3个回答  2013-03-30
静态变量就是不改变的变量啊,只读的。例如数码管的段位表示。定死了就不会变了。本回答被网友采纳
第4个回答  2013-03-31
单片机ram少,所以常量应尽量放rom里。但变量都是必须放ram里的,不管是什么变量