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里的,不管是什么变量

51单片机静态局部变量问题>?
),该变量只在这个函数中有效,在其它函数中无法读取和改变它的值,当跳出这个函数后,它所占用的内存空间将被释放,留给其它局部变量用。如:unsigned char aaa(){ unsigned char b; …… return b;}还有一种变量,就是在函数里面定义,但是加了static前缀的,在离开该函数后他的值任然会...

C51 单片机 局部变量 问题
同样可以得出一个结论,正是因为单片机的RAM有限,才会导致局部变量不清除。对于电脑来说,空间近乎无限的,随时随地你都可以分配空间给变量用。但是51单片机就那么128字节,必须详细策划好如何分配,所以局部变量才有了自己固定的地盘。说到这里,我相信你的问题我已经找到答案了,虽然都是我推测的,但是十...

51单片机,keil编译环境,我定义位变量为局部变量时为什么编译错误?
看你用什么语言写了,如果用汇编的话不用定义,直接用就行了,如:p1.0、p2.2……如果用C编写的话,应该先把头文件加进来,#include<reg51.h>,加进来后,如果不定义端口的话:P1、P1^1,这里的P是大写的……当然也可以自己定义了……如:sbit R_A=P2^0;等等……...

51单片机如何函数调用时局部变量存放
1、首先将51单片机连接在计算机上。2、其次使用计算机打开51单片机的系统设置。3、最后在系统设置中调节为函数调用局部变量存放即可。

51单片机变量 51的单片机变量是怎么个定义法。全局变量,局部变量都放 ...
不能这样定义,这样定义是错的。你这个是赋值,不是定义在0x22单元格里。unsigned char bdata SS _at_ 0x22;只有在Keil编译环境下才可以这样使用。还有,这种语法不适合用C语言,我说的是不适合,不是不能用。C语言里面的指针就是针对这个的,不建议使用 _at_ 进行变量在RAM中固定,这样对程序...

51单片机变量初值。
如果是“C51”,并且使用默认的startup.a51启动文件(未手动修改)的话,那么在运行到main()之前、片内SRAM已经都初始化为0了。

在51或AVR单片机的中断服务程序中,能否定义局部变量?
当然可以!如果是一般的变量,每次进入中断都会按原来的赋予初值!如果加static类型,就可以保持上次断的值,效果相当于全局变量!

static在51单片机中几种用法
1、全局变量对所有子函数都有效,谁都可以修改,可能会超出你的预计范围(就是说,房子虽然是你的,但大家都有钥匙,可以随便进来换换装修,你掌握并不了)2、移植性高,子函数内的静态局部变量,只需要输出子函数即可。但全局变量,要么需要主文件为你定义这个全局变量,要么就会在多个C文件包含你的头...

如果在51单片机的外部RAM中定义变量,需要将变量用xdata修饰,请问这个...
不需要。不论静态动态都可以分配到外部RAM空间的。

这个51单片机程序这样写为什么会错呢,
sbit 定义的是硬件引脚,不是普通的变量,所以只能放在最前面,使其为全局变量,放在main里面成了局部变量,显然是不对的。

相似回答