C51有二句看不懂,求老大指点一下,谢谢

[复制链接]
6084|23
 楼主| tyw 发表于 2007-2-1 15:16 | 显示全部楼层 |阅读模式
这是北京金木雨给的一段13.5M读写模块的通讯程序(89C52CPU),有二句看不懂
望各位指点一下(红字部分),谢谢


#include <reg52.h>   // 包含52寄存器函数reg52.h
#include <intrins.h> // 包含内部函数intrins.h
sbit SDA = P1^0;     // 定义SDA为P1.0口
sbit SCL = P1^1;     // 定义SCL为P1.1口
                           // 对于11.0592MHz用这一行
#define NOPS _nop_();      // 定义NOPS=nop,等待1个时钟周期,在intrins.h中


/*****************************************************************************
* 宣告发送一个字节函数: send a byte over IIC bus
* 发送一个字节
*****************************************************************************/
void I2CSendByte(unsigned char cSendByte)  // cSendByte为待发送字节
{
unsigned char data i = 8; // 定义i为直接寻址内部RAM,并赋值i=8
while (i--)         // 计数器 i减1,≠"0"时,做下面循环
{
  SCL = 0;          // 时钟脚 ̄_
  SDA = (bit)(cSendByte & 0x80);// 屏蔽出待发送字节的D7位
  cSendByte += cSendByte; // 
  NOPS
  SCL = 1;
}
SCL = 0;
}
xiaopet 发表于 2007-2-1 15:26 | 显示全部楼层

回复:C51有二句看不懂,求老大指点一下,谢谢

SDA = (bit)(cSendByte & 0x80)
其实SDA就是取cSendByte的最高位,
cSendByte += cSendByte 这个不太确定,我想是理解成这样:cSendByte=cSendByte+cSendByte
不知道对不对?
 楼主| tyw 发表于 2007-2-1 15:41 | 显示全部楼层

谢谢指教

看不懂程序在做什么
汇编中,SDA送入cSendByte的最高位后,cSendByte应该环移一位,再这样循环8次把一字节串行送出去,而cSendByte=cSendByte+cSendByte这个动作就不能理解了
306970351 发表于 2007-2-1 15:41 | 显示全部楼层

cSendByte += cSendByte;

是左移一位的意思
xwj 发表于 2007-2-1 15:45 | 显示全部楼层

晕,这都看不懂啊???

SDA = (bit)(cSendByte & 0x80);// 屏蔽出待发送字节的D7位
SDA = 就是先计算 (cSendByte & 0x80);--只有D7为1才会不为0,D7为0 时结果为0;
再(bit)把字节强制转换为位--当值为0 是结果为0 ,非0时结果为1
--最终结果也就是取D7位赋给SDA啦


cSendByte += cSendByte; //
--等效与cSendByte = cSendByte + cSendByte; // 
--等效与cSendByte = cSendByte *2; // 
--等效与cSendByte = (cSendByte <<1)&0B11111110; // 
--实际上就是cSendByte <<= 1; // 啦...
 楼主| tyw 发表于 2007-2-1 15:50 | 显示全部楼层

谢谢小跳鸟,3069

俺十几年前的Turbo C都忘得差不多了拉,哈哈
xwj 发表于 2007-2-1 15:51 | 显示全部楼层

郁闷...tyw 你干了什么啊???

也没建你怎么灌水啊?
怎么不知不觉你就第8名抢走了。。。

55555555555555...
俺咋就变成老9了呢???
diannaoza 发表于 2007-2-1 16:38 | 显示全部楼层

有8,9不错了

我们都在898989后了
mc9s08aw60 发表于 2007-2-1 16:58 | 显示全部楼层

等效与cSendByte = cSendByte *2; //

 楼主| tyw 发表于 2007-2-1 17:51 | 显示全部楼层

哈哈,做了点题,胜过灌一年水了拉,惭愧得很哦

loggerjy 发表于 2007-2-1 18:24 | 显示全部楼层

支持xwj

joson 发表于 2007-2-1 18:33 | 显示全部楼层
甄蔡组合 发表于 2007-2-1 18:39 | 显示全部楼层

写法上的小技巧

其实就是做个加法运算呗 !!也可以说是左移一位
hotpower 发表于 2007-2-1 18:45 | 显示全部楼层

tyw真能灌水~~~没见过红杏出墙???

  SDA = (bit)(cSendByte & 0x80);// 屏蔽出待发送字节的D7位
  cSendByte += cSendByte; // 

因式分解就是:
CY = cSendByte.7;//当然不能这样写了,意思就是这样~~~
SDA = CY;
cSendByte <<= 1;

实际注解也倒塌了你~~~
应该为:
  SDA = (bit)(cSendByte & 0x80);// 取出待发送字节的D7位

若:SDA = (bit)(cSendByte & 0x01);
即取出待发送字节的D0位 
相关链接:http://www.baidu.com/s?ie=gb2312&bs=%BA%EC%D0%D3%B3%F6%C7%BD&sr=&z=&cl=3&f=8&wd=C51%BA%EC%D0%D3%B3%F6%C7%BD&ct=0
happystar 发表于 2007-2-1 18:45 | 显示全部楼层

支持xwj

xwj说的话总是一针见雪,看他回的帖子学习了很多了。感谢ing
哈佛大学 发表于 2007-2-3 22:49 | 显示全部楼层

晕晕晕晕晕晕晕晕晕

晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕
 楼主| tyw 发表于 2007-2-4 13:02 | 显示全部楼层

晕,难得做回菜鸟,提点问题,板砖竟挨到哈飞了,哈哈


确实应该端正一下态度,换位思考,平时回贴喜欢开开玩笑,正经回答别人提问了,人家还能容忍,要是光批不答,哼哼,胸要闷了拉.菜鸟苦,苦得很那.
yongzai 发表于 2011-5-11 18:39 | 显示全部楼层
有些看不懂
aihe 发表于 2011-5-11 19:39 | 显示全部楼层
人在江湖走,哪能不挨砖,O(∩_∩)O哈哈哈~
老T叔要丙老
cecwxf 发表于 2011-5-11 20:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

tyw

1295

主题

30538

帖子

1478

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