打印

向24C02写数据问题

[复制链接]
3712|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcustudypeace|  楼主 | 2012-7-28 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在学习51单片机,在向24C02写数据的函数中有一个强制类型转换(单字节写入方式),我查了一些资料,有的有,有的没有,这个强制类型转换需要吗?加上和去掉有什么区别,哪种更好?请高手指教。void WriteCurrent(unsigned char y)//向当前地址写入,y为要写入的数据
{
    unsigned char i;
    for(i = 0; i < 8; i++)
// 循环移入8个位
   {
       SDA = (bit)(y&0x80);   //通过按位“与”运算将最高位数据送到S

                            // 这个强制类型转换需要吗?  

_nop_();            //等待一个机器周期
        SCL = 1;            //在SCL的上升沿将数据写入AT24Cxx
        _nop_();            //等待一个机器周期
        _nop_();             //等待一个机器周期

SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲

y <<= 1;           //将y中的各二进位向左移一位

   }
}

相关帖子

沙发
liang7143| | 2012-7-28 16:38 | 只看该作者
类型转换必然的
加不加 (bit) 只是一个显性和隐形的问题

使用特权

评论回复
板凳
ningling_21| | 2012-7-28 16:41 | 只看该作者
有需要...
拿着*币去美国买东西,LZ说需不需要转换?

当然也可以改写一下,就不需要了:
if((y&0x80)==0x80) SDA=1;
else SDA=0;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
mcustudypeace + 1
地板
lover9| | 2012-7-28 16:42 | 只看该作者
如LS所言,其实这样写也可以:
if(y&0x80) SDA = 1;
else SDA = 0;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
mcustudypeace + 1
5
dqyubsh| | 2012-7-28 16:46 | 只看该作者
软件模拟的IIC吧,看见这事我就头疼。怎么学51就一定要遭这份罪吗?

使用特权

评论回复
6
wukunshan| | 2012-7-28 19:46 | 只看该作者
SDA = (bit)(y&0x80);   这样的强制转换是错误的,SDA永远是0;正确的写法如3楼所说。

使用特权

评论回复
7
darlin520| | 2012-7-28 23:33 | 只看该作者
凑凑热闹,支持6楼的。。。。

使用特权

评论回复
8
mcustudypeace|  楼主 | 2012-7-29 09:26 | 只看该作者
按六楼说法,如果y=1001 1111,y&0x80=1000 0000,转换为bit型(即SDA = (bit)(y&0x80)) 为什么是0?请指教。

使用特权

评论回复
9
darlin520| | 2012-7-29 17:33 | 只看该作者
看最后一位吧,我只是想当然,仅供参考。。

使用特权

评论回复
10
darlin520| | 2012-7-29 20:10 | 只看该作者
不好意思,俺误导人了,哈哈,。。。

使用特权

评论回复
11
darlin520| | 2012-7-29 20:22 | 只看该作者
我知道楼主意思了,按楼主的思想这么写是可以的,楼主是想依次取出y的最高位吧

使用特权

评论回复
12
Q哥123774812| | 2012-7-29 21:28 | 只看该作者
SDI = (date & 0x8000) >> 15;
我这样写,IAR编译器没问题。(74HC595写)

使用特权

评论回复
13
wangzj638571| | 2012-7-29 22:46 | 只看该作者
void Send_Byte(uchar byte)
{
int i;
TRISC3 = 0;
TRISC4 = 0;
for (i=0;i<8;i++)
  {
  if(byte & 0x80)   
    SDA = 1;   
  else   
    SDA = 0;
  SCL = 1;
  Delay(50);
  SCL = 0;
  byte = byte << 1;
  }
}

使用特权

评论回复
14
ayb_ice| | 2012-7-30 09:05 | 只看该作者
SDA = (bit)(y&0x80);   这样的强制转换是错误的,SDA永远是0;正确的写法如3楼所说。
wukunshan 发表于 2012-7-28 19:46


谁说的,建议你去KEIL上试试

使用特权

评论回复
15
mcustudypeace|  楼主 | 2012-7-30 16:08 | 只看该作者
11# darlin520

使用特权

评论回复
16
mcustudypeace|  楼主 | 2012-7-30 16:13 | 只看该作者
是这种写法好
if(y&0x80) SDA = 1;
else SDA = 0;
还是
SDA=(bit)(y&0x80);
这种好?这两种都能得出正确结果。

使用特权

评论回复
17
3htech| | 2012-7-30 16:21 | 只看该作者
个人以为:代码应尽量显示的表达出来。以后自己看的时候(大部分情况都是自己看)所以我认为下面是最好的
if(0x80 == (y&0x80))
{
    SDA=1;
}
else
{
    SDA=0;
}

从编程规范上来说,if,else语句应加括号(哪怕只有一条语句)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

39

帖子

0

粉丝