打印

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

[复制链接]
4496|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;

是左移一位的意思

使用特权

评论回复
5
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; // 啦...

使用特权

评论回复
6
tyw|  楼主 | 2007-2-1 15:50 | 只看该作者

谢谢小跳鸟,3069

俺十几年前的Turbo C都忘得差不多了拉,哈哈

使用特权

评论回复
7
xwj| | 2007-2-1 15:51 | 只看该作者

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

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

55555555555555...
俺咋就变成老9了呢???

使用特权

评论回复
8
diannaoza| | 2007-2-1 16:38 | 只看该作者

有8,9不错了

我们都在898989后了

使用特权

评论回复
9
mc9s08aw60| | 2007-2-1 16:58 | 只看该作者

等效与cSendByte = cSendByte *2; //

使用特权

评论回复
10
tyw|  楼主 | 2007-2-1 17:51 | 只看该作者

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

使用特权

评论回复
11
loggerjy| | 2007-2-1 18:24 | 只看该作者

支持xwj

使用特权

评论回复
12
joson| | 2007-2-1 18:33 | 只看该作者

呵呵.

使用特权

评论回复
13
甄蔡组合| | 2007-2-1 18:39 | 只看该作者

写法上的小技巧

其实就是做个加法运算呗 !!也可以说是左移一位

使用特权

评论回复
14
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

使用特权

评论回复
15
happystar| | 2007-2-1 18:45 | 只看该作者

支持xwj

xwj说的话总是一针见雪,看他回的帖子学习了很多了。感谢ing

使用特权

评论回复
16
哈佛大学| | 2007-2-3 22:49 | 只看该作者

晕晕晕晕晕晕晕晕晕

晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕

使用特权

评论回复
17
tyw|  楼主 | 2007-2-4 13:02 | 只看该作者

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


确实应该端正一下态度,换位思考,平时回贴喜欢开开玩笑,正经回答别人提问了,人家还能容忍,要是光批不答,哼哼,胸要闷了拉.菜鸟苦,苦得很那.

使用特权

评论回复
18
yongzai| | 2011-5-11 18:39 | 只看该作者
有些看不懂

使用特权

评论回复
19
aihe| | 2011-5-11 19:39 | 只看该作者
人在江湖走,哪能不挨砖,O(∩_∩)O哈哈哈~
老T叔要丙老

使用特权

评论回复
20
cecwxf| | 2011-5-11 20:27 | 只看该作者
学习

使用特权

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

本版积分规则

tyw

1294

主题

30071

帖子

1467

粉丝