标题: 关于单片机中的一点C语言的问题 [打印本页]

作者: 134849694164151    时间: 2018-5-16 21:17
标题: 关于单片机中的一点C语言的问题
这是ds1302中写字节的一部分,我想问问这部分里边的这个for循环,里边的那个dat一次不是只能传输一个位吗?最终是怎么传出来一个字节的呢?每次循环不应该都重新来了吗?所以就不懂了,麻烦看见的帮我解答解答,万分感激

Screenshot_2018-05-16-21-07-21-52.png (139.08 KB, 下载次数: 64)

Screenshot_2018-05-16-21-07-21-52.png

作者: 134849694164151    时间: 2018-5-17 00:33
        图片里的东西在这里
for (i=0; i<8; i++)
        {
                dat = addr & 0x01;                 // SPI是从低位开始传输的
                DSIO = dat;                                 // 把要发送的bit数据丢到IO引脚上去准备好
                SCLK = 1;                                 // 制造上升沿,让DS1302把IO上的值读走
                delay();                                // 读走之后,一个小周期就完了
                SCLK = 0;                                // 把SCLK拉低,是为了给下一个小周期做准备
                delay();
                addr >>= 1;                                   // 把addr右移一位
        }
        // 第3部分: 写入第2字节,value
        for (i=0; i<8; i++)
        {
                dat = value & 0x01;                 // SPI是从低位开始传输的
                DSIO = dat;                                 // 把要发送的bit数据丢到IO引脚上去准备好
                SCLK = 1;                                 // 制造上升沿,让DS1302把IO上的值读走
                delay();                                // 读走之后,一个小周期就完了
                SCLK = 0;                                // 把SCLK拉低,是为了给下一个小周期做准备
                delay();
                value = value >> 1;                   // 把addr右移一位
        }
作者: HC6800-ES-V2.0    时间: 2018-5-17 07:23
134849694164151 发表于 2018-5-17 00:33
图片里的东西在这里
for (i=0; i>= 1;                                   // 把addr右移一位
        }

从你给的程序上看,dat是8位,不是一位。
主要是你想不通:为什么一个8位数据去给一个一位赋值?!
其实很简单:DSIO是一位,当DSIO=dat时,自动取低位。
你自己可以做实验的:对一个unsigned char 型变量,赋值0x1234,你会发现,最后得到的自动就是0x34,高位自动去掉了。
作者: wulin    时间: 2018-5-17 07:44
134849694164151 发表于 2018-5-17 00:33
图片里的东西在这里
for (i=0; i>= 1;                                   // 把addr右移一位
        }

就像8个人排队跳水,一次只跳下一个,后面的人依次向前移动一位,直至跳完。addr >>= 1; // 把addr右移一位
作者: 林曦    时间: 2018-5-17 08:50
一个字节是8位。for循环里面循环8次,每一次循环把dat里面的数据给DSIO寄存器,然后dat获得value右移一位后的数据,8次共传输一个字节。for循环8次后,进入下一个函数。
作者: nnqtdf    时间: 2018-5-17 08:54
每次传输一个位,循环8次不正好一个字节吗

作者: nnqtdf    时间: 2018-5-17 08:58

仔细理解下这两句

作者: 程序新手    时间: 2018-5-23 10:13
从你给的程序上第一句看,dat是8位,不是一位。
从最低位开始传
DSIO是一位,当DSIO=dat时,自动取低位。
所以你就可以看到八位数啦
希望对你能有帮助
作者: Robertzhang    时间: 2018-5-23 19:10
是每次传送一bit,传8次就是一个Byte了。如果要传输很多Byte,就连续调用这个循环。
作者: yanwang    时间: 2018-5-23 20:55
取最低位,传一位移一位,八次




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1