编程那些事儿(持续更新中)

    现在在用STC12C5A60S2单片机做32*128的LED点阵,各种纠结的问题是遇到不少的。当然,其实大都是一些常识性的错误,但是这些对于初学者而言,如果没有人指导,自己又不喜欢去看书,很难找到错误的原因。我就遇到一些,现在逐渐总结出来。

//问题代码一(eeprom数据写入程序):
unsigned char i;	
for(i=0;i<256;i++)	//将数据写入eeprom中
  {	     
     Byte_Program(eeprom_address+i,0x5a);	
  }

这是一段EEPROM的写入程序,此单片机EEPROM的第一扇区地址为00H--1FFH。然后发现数据老是写不进去,而把循环变量改为i<255后才可以写进去,可是我的数据有256字节啊。。。当时为这个问题纠结了很久很久。聪明的你是不是一下子找到了问题所在呢?对,就是i的声明问题。要知道unsigned char型变量的范围是0-255哦亲!i永远不可能自增到256的,判断条件失效,所以根本无法跳出for循环(其实不是没写进去,而是后面的eeprom读程序根本执行不到,一直在这个for里兜圈圈,至于写没写进去俺就不知道啦)。

ok,改成下面的就行了:

//修改后代码(eeprom数据写入程序)
unsigned int i;	
for(i=0;i<256;i++)	//将数据写入eeprom中
  {		  
     Byte_Program(eeprom_address+i,0x5a);	
  }

接着上程序~

//问题代码二(eeprom扇区擦除程序):
 unsigned int eeprom_address;   
 Sector_Erase(eeprom_address);      //擦除将该eeprom_address所在的扇区整个擦除
  for(i=0;i<=255;i++)                        //将数据写入eeprom中
    {
        Byte_Program(eeprom_address+i,0x5a);        
    }

咦我写的数据每次居然还不一样耶真是好玩。之后那又是怎样一阵疯狂的查找错误不断调试刻骨铭心的历程啊!

看出有什么问题了吗? 哎,要是没看出来你跟我一起去面壁思过吧。以后一定要记住记住:申明地址变量时一定一定,要赋初值!要不然谁TM知道系统给的是什么初值?然后运气好给的初值在00H-0FFH之间(eeprom第一扇区的地址区间),然后可以顺利擦除该扇区,运气不好的话系统随机给的地址不在这个区间中(注:eeprom的擦除是按扇区擦除的,只需要你给出扇区中的任何一个地址,即可擦除整个扇区),需要擦除的扇区就没有擦除,自然有可能写不进去了。

//修改后代码(eeprom扇区擦除程序)
 unsigned int eeprom_address=0; 
 Sector_Erase(eeprom_address); //擦除将该eeprom_address所在的扇区整个擦除
 for(i=0;i<=255;i++) //将数据写入eeprom中 
  { 
        Byte_Program(eeprom_address+i,0x5a); 
  }

关于赋初值的问题再多说一点:

《你必须知道的495个C语言问题》(Steve Summit著)有这么一段(第18页):

具有静态生存期的未初始化变量(包括数组和结构)——即在函数外声明的变量和静态存储类型的变量确保初始值为零,就像程序员键入了‘=0’或‘={0}’一样。因此,这些变量如果是指针就会被初始化为正确类型的空指针,如果是浮点数则会被初始化为0.0。

具有自动(automatic)生存期的变量(即非静态存储类型的局部变量)如果没有显式地初始化,则包含的是垃圾内容。对垃圾内容不能作任何有用的假定。

用malloc和realloc动态分配的内存也可能包含垃圾数据,因此必须由调用者正确地初始化。用calloc获得的内存全为零,但这对指针和浮点值不一定有用。

简单点理解,似乎是全局变量默认是0(据说在linux下全局变量默认值不是0.),局部变量默认的就不是0,数组和结构体也一样。

C菜鸟们,让我们进一步探索——神马是静态生存期和自动生存期?

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值