打印

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

[复制链接]
1816|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 可不慎乎 于 2024-4-10 17:51 编辑


12-1 AT24C02数据存储.rar (46.03 KB)
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

粉丝