OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2655|回复: 2

eeprom中读写一个有符号数

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-4-26
在线时间
0 小时
发表于 2018-9-28 22:20:43 | 显示全部楼层 |阅读模式
1金钱
        本人最近在做一个制冷器程序,将要设置的温度通过按键操作写入AT24C02,然后将设置的温度读出来与DS18B20的读出来的数据进行比较,如果DS18B20的温度高于设置温度则进行降温操作。遇到一个问题,将AT24C256读出的数据与DS18B20读出的数据进行比较时发现比较结果不对。  以下是本人程序:

/* 输出控制及报警函数*/
void Control_Out(void)//用第一个ds18b20检测制冷腔温度,控制继电器
{
        s16 T_Buf;
        s16 Get_Temp;
        Get_Temp=DS18B201_Get_Temp();
        T_Buf=AT24CXX_ReadOneByte(0);//从AT24C256的0x0000地址读出1个字节数据       
        if(Get_Temp>=T_Buf)
        {
                D_CTRL=0;//继电器吸合
                Relay_Flag=1;//继电器吸合标志
        }       
        else
        {
                D_CTRL=1;
                Relay_Flag=0;
        }
}
我想请问如何将一个有符号数(s16类型)写入eeprom的,原子哥的程序只能写入或读出无符号数(u8 AT24CXX_ReadOneByte(u16 ReadAddr)和void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)),我将原子哥的程序改为:
s16 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        s16 temp=0;                                                                                                                                                               
        IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);           //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr/256);//发送高地址
        }
        else
                IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据          
        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA1);           //进入接收模式                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//产生一个停止条件            
        return temp;
}


void AT24CXX_WriteOneByte(u16 WriteAddr, s16 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr/256);//发送高地址
        }else
        {
                IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
        }         
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);     //发送字节                                                          
        IIC_Wait_Ack();                                
    IIC_Stop();//产生一个停止条件
        delay_ms(10);         
}

这样改完之后还是不行,求各位大神帮我看看哪里出错了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-9-28 22:51:40 | 显示全部楼层
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2018-9-29 13:29:53 | 显示全部楼层
没看你的程序,只能说往EEPROM里写的你不要管它是有符号还是没有符号。
写进去的就是N位的1或者0,是有符号也好,没符号也好,对于EEPROM来说不重要。
重要的是,你把他读出来之后,存进去是有符号,读出来给也要给有符号的变量赋值。
就是这样,喵。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 06:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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