找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7224|回复: 10
收起左侧

关于24c02储存一个多位数的问题

[复制链接]
ID:41871 发表于 2012-6-18 17:20 | 显示全部楼层 |阅读模式

在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吧,
知道的朋友都别吝啬,多指点指点

回复

使用道具 举报

ID:27916 发表于 2012-6-19 09:18 | 显示全部楼层
CHAR貌似是一个8BIT的数据吧,不会出现9999的数据呢
回复

使用道具 举报

ID:27916 发表于 2012-6-19 09:20 | 显示全部楼层
如果有大于2BITE的数据,你可以用除法和求余来得到高低位
回复

使用道具 举报

ID:41871 发表于 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];
让我保存他们的每一位?是这样吗

回复

使用道具 举报

ID:41871 发表于 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];
     //主循环中添加其他需要一直工作的程序
 
  }
}

回复

使用道具 举报

ID:41871 发表于 2012-6-25 16:21 | 显示全部楼层
就这么沉了?
回复

使用道具 举报

ID:215565 发表于 2017-6-28 17:43 | 显示全部楼层
大神可以把 I2C.H  发我一下吗
回复

使用道具 举报

ID:137676 发表于 2017-6-28 19:33 | 显示全部楼层
楼主你好!
IRcvStr(0xae,0,&num1,1);   
IRcvStr(0xad,0,&num2,1);
楼主的i2c设备有几个啊!
0xae,我猜想应该是i2c设备地址,也就是说你向第一个设备写数据后,又向第二个设备写数据,
如果第一个数据能读取,那么第二个估计就不行了吧!
回复

使用道具 举报

ID:137676 发表于 2017-6-29 00:50 | 显示全部楼层
zacharias 发表于 2017-6-28 17:43
大神可以把 I2C.H  发我一下吗

希望对你有所帮助。

IIC.zip

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

iic

回复

使用道具 举报

ID:188808 发表于 2017-6-29 14:34 | 显示全部楼层
建议拆分成高八位和低八位分别存储在不同地址
回复

使用道具 举报

ID:168911 发表于 2020-6-12 21:36 来自手机 | 显示全部楼层
我有24c02可以储存多组多位断电时储存,平常计数不储存,突然断电时储存一下,因为24c02有读写次数,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表