关于51单片机一个一个字节读数据的写法

2019-07-14 20:02发布

你好,请问aa>>=1,放在if(dsio==1) aa|=0x80;的前面和后面有什么不同?
unsigned char i;
for(i=0;i<8;i++)
{
     //aa>>=1;放在这边和放在后面有什么不同?
    if(dsio==1)
     aa|=0x80;
     aa>>=1;放在这边和放在前面有什么不同?
     dsclk=1;
     _nop_;
     dsclk=0;
     _nop_;
    return aa;
}
这个是DS1302的读字节函数?放在前后读出数据不一样?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
猎国倾城
1楼-- · 2019-07-15 06:29
要放在后边,不能放在if前边程序精简之后变成这样:
  1. for(i=0;i<8;i++)
  2. {
  3.      aa>>=1;
  4.     if(dsio==1)
  5.     {
  6.         aa|=0x80;
  7.     }   
  8. }
  9. for(i=0;i<8;i++)
  10. {
  11.    
  12.     if(dsio==1)
  13.     {
  14.         aa|=0x80;
  15.     }
  16.      aa>>=1;
  17. }
复制代码
放在前边,第一次读取数据是正确的,第二次以后数据就是错的,解决方法是:将aa处理之后进行释放,给他赋值为0;推荐放在后边。
猎国倾城
2楼-- · 2019-07-15 10:52
本帖最后由 猎国倾城 于 2016-12-10 12:49 编辑
cuyebiren 发表于 2016-12-10 12:00
aa>>=1; 等于 aa = aa >>1;
aa|=0x80 等于 aa = aa | 0x80;
这就是逻辑的问题了:

左移右移有时容易搞混!
fashaoyou01
3楼-- · 2019-07-15 16:06
cuyebiren 发表于 2016-12-10 12:00
aa>>=1; 等于 aa = aa >>1;
aa|=0x80 等于 aa = aa | 0x80;
这就是逻辑的问题了:

"for(i=0;i<8;i++)
{
      //aa>>=1;
    if(dsio==1)
      aa|=0x80;
      aa>>=1;"       
"假设要读取的数据为IO=0101 1001
aa为任意八位数据,假定aa=1000 1110"       
原始数据        aa=1000 1110
i=0        0100 0111
i=1        0010 0011
i=2        0001 0001
i=3        0100 1000
i=4        0110 0100
i=5        0011 0010
i=6        0101 1001
i=7        0010 1100
用第二个是错的,会多出来一个移位,但是只有这样写才能读出数据,写在前面读不出数据?
fashaoyou01
4楼-- · 2019-07-15 18:38
 精彩回答 2  元偷偷看……
fashaoyou01
5楼-- · 2019-07-15 23:53
cuyebiren 发表于 2016-12-10 12:00
aa>>=1; 等于 aa = aa >>1;
aa|=0x80 等于 aa = aa | 0x80;
这就是逻辑的问题了:

写在后面是对的,写在前面是错的,但是我分析应该写在前面!此程序为DS1302读程序!
李春明
6楼-- · 2019-07-16 01:04
这个不懂  跟着高手学习一下

一周热门 更多>