标题: 关于24c02储存一个多位数的问题 [打印本页]

作者: whp1124    时间: 2012-6-18 17:20
标题: 关于24c02储存一个多位数的问题

在DOFLY的教学中有一个关于“记忆上次上次开机状态“的程序:
教学源代码如下:
#include <reg52.h>               
#include "i2c.h"
#include "delay.h"
#include "display.h"

sbit KEY_ADD=P3^3;  //定义按键输入端口
sbit KEY_DEC=P3^4;

/*-----------------------------------------------
                     主函数
------------------------------------------------*/ 
main()
{
 unsigned char num=0;
 Init_Timer0();

 IRcvStr(0xae,0,&num,1);                               
               
 KEY_ADD=1; //按键输入端口电平置高
 KEY_DEC=1;
while (1)         //主循环
  {
 
  if(!KEY_ADD)  //如果检测到低电平,说明按键按下
    {
  DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY_ADD)     //再次确认按键是否按下,没有按下则退出
    {
        while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
        {
     if(num<999)    //加操作
            {
           num++;
              ISendStr(0xae,0,&num,1);  //写入24c02
              DelayMs(10);
             }

    }
    }
 }

 if(!KEY_DEC)  //如果检测到低电平,说明按键按下
    {
  DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY_DEC)     //再次确认按键是否按下,没有按下则退出
    {
        while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待
        {
        if(num>0)  //减操作
           {
           num--;
              ISendStr(0xae,0,&num,1);  //写入24c02
              DelayMs(10);
             }

    }
    }
 }
 TempData[0]=dofly_DuanMa[num/100];   
 TempData[1]=dofly_DuanMa[(num%100)/10];
 TempData[2]=dofly_DuanMa[(num%100)%10];
     //主循环中添加其他需要一直工作的程序
 
  }
}
里面unsigned char num=0;的范围是0-255,我如果要保存一个大于255的数,比如9999,那该怎么改呢,我看过别的论坛上有的人说要把9999拆成2个99保存,我想一个char型的数据怎么拆,有没有高手指点下,有没有直接能改成int型保存的可能,不过24C02一个地址单元好像只能保存0-255吧,
知道的朋友都别吝啬,多指点指点


作者: 青苹果    时间: 2012-6-19 09:18
CHAR貌似是一个8BIT的数据吧,不会出现9999的数据呢
作者: 青苹果    时间: 2012-6-19 09:20
如果有大于2BITE的数据,你可以用除法和求余来得到高低位
作者: whp1124    时间: 2012-6-19 11:11

楼上的斑竹的意思是 TempData[0]=dofly_DuanMa[num/100];   
 TempData[1]=dofly_DuanMa[(num%100)/10];
 TempData[2]=dofly_DuanMa[(num%100)%10];
让我保存他们的每一位?是这样吗


作者: whp1124    时间: 2012-6-22 14:22

我把int型拆分成2个CHAR还是不行,不知道是写不进去还是读不出来,帮我看看错在哪了
#include <reg52.h>               
#include "i2c.h"
#include "delay.h"
#include "display.h"

sbit KEY_ADD=P3^3;  //定义按键输入端口
sbit KEY_DEC=P3^4;

/*-----------------------------------------------
                     主函数
------------------------------------------------*/ 
main()
{   
 unsigned int num;
 unsigned char num1;
 unsigned char num2;
 num1=num/256;
 num2=num%256;
 num=num1*256+num2;
 Init_Timer0();

 IRcvStr(0xae,0,&num1,1);  
 IRcvStr(0xad,0,&num2,1);                             
               
 KEY_ADD=1; //按键输入端口电平置高
 KEY_DEC=1;
while (1)         //主循环
  {
 
  if(!KEY_ADD)  //如果检测到低电平,说明按键按下
    {
  DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY_ADD)     //再次确认按键是否按下,没有按下则退出
    {
        while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
        {
     if(num<9999)    //加操作
            {
           num++;
              ISendStr(0xae,0,&num1,1);  //写入24c02
     ISendStr(0xde,0,&num2,1);
              DelayMs(10);
             }

    }
    }
 }

 if(!KEY_DEC)  //如果检测到低电平,说明按键按下
    {
  DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY_DEC)     //再次确认按键是否按下,没有按下则退出
    {
        while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待
        {
        if(num>0)  //减操作
           {
           num--;
              ISendStr(0xae,0,&num1,1);  //写入24c02
      ISendStr(0xde,0,&num2,1);
              DelayMs(10);
             }

    }
    }
 }
 TempData[0]=dofly_DuanMa[num/100];   
 TempData[1]=dofly_DuanMa[(num%100)/10];
 TempData[2]=dofly_DuanMa[(num%100)%10];
     //主循环中添加其他需要一直工作的程序
 
  }
}


作者: whp1124    时间: 2012-6-25 16:21
就这么沉了?
作者: zacharias    时间: 2017-6-28 17:43
大神可以把 I2C.H  发我一下吗
作者: 黑黑—坤    时间: 2017-6-28 19:33
楼主你好!
IRcvStr(0xae,0,&num1,1);   
IRcvStr(0xad,0,&num2,1);
楼主的i2c设备有几个啊!
0xae,我猜想应该是i2c设备地址,也就是说你向第一个设备写数据后,又向第二个设备写数据,
如果第一个数据能读取,那么第二个估计就不行了吧!
作者: 黑黑—坤    时间: 2017-6-29 00:50
zacharias 发表于 2017-6-28 17:43
大神可以把 I2C.H  发我一下吗

希望对你有所帮助。

IIC.zip

1.15 KB, 下载次数: 22, 下载积分: 黑币 -5

iic


作者: shuchao007    时间: 2017-6-29 14:34
建议拆分成高八位和低八位分别存储在不同地址
作者: 老当益壮    时间: 2020-6-12 21:36
我有24c02可以储存多组多位断电时储存,平常计数不储存,突然断电时储存一下,因为24c02有读写次数,




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1