关于将两个8位数赋值给一个16位数的疑问

[复制链接]
 楼主| 可不慎乎 发表于 2024-4-10 17:28 | 显示全部楼层 |阅读模式
本帖最后由 可不慎乎 于 2024-4-10 17:51 编辑



51单片机,kile4工程,单片机通过I2C向AT24C02发送数据并读取。
无符号整型左移8位不是全部溢出了吗?还怎么赋值给Data?Data=AT24C02_ReadByte(0);//AT24C02_ReadByte(0)是一个函数返回一个8位unsigned char的数
Data|=(AT24C02_ReadByte(1)<<8);

unsigned char AT24C02_ReadByte(unsigned int WordAddress)//向AT24C02读
{
        unsigned int Data;
        I2C_Start();//开始条件
        I2C_SendByte(AT24C02_ADDRESS);        //主机I2C发送从机地址和写指令
        I2C_ReceiveAck();        //主机接收应答
        I2C_SendByte(WordAddress);//主机发送字地址
        I2C_ReceiveAck();        //接收应答
      
        I2C_Start();
        I2C_SendByte(AT24C02_ADDRESS|0x01);//主机发送从机地址和读指令
        I2C_ReceiveAck();        //接收应答,且从机获得SDA线权
        Data=I2C_ReceiveByte();        //读一个字节的返回值赋给Data
        I2C_SendAck(1);//发送应答1
        I2C_Stop();
        return Data;
}

void I2C_SendByte(unsigned char Byte)
{
        unsigned char i=0;
        for(i=0;i<=7;i++)
        {
                //起始条件保证scl为低电平(组合都是:起始、发/收、应答?)3种数据帧
                I2C_SDA=Byte&(0x80>>i);//将Byte由低到高给SDA
                I2C_SCL=1;//置高立马置低能不能读到数据?看时序i2c读数用时和单片机io口转换电平用时
                I2C_SCL=0;
        }
}





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
地瓜patch 发表于 2024-4-10 19:59 来自手机 | 显示全部楼层
移位,先赋值高八位,左移八位,再或低八位
coody 发表于 2024-4-10 22:43 | 显示全部楼层
Data  |=  (u16)AT24C02_ReadByte(1)<<8;
567 发表于 2024-4-10 22:59 | 显示全部楼层
【回复】无符号整型左移8位不是全部溢出了吗?
整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

keil c51默认开启此选项,亦可关闭。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部