社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1727|回复: 6

[讨论] 51单片机模拟iic时发现用到psw寄存器的CY位,求大神帮忙解答一下疑惑

[复制链接]

150

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-20 15:43:58 | 显示全部楼层 |阅读模式
这是模拟应答的程序:
//位定义
sbit SCL=P1^0;
sbit SDA=P1^1;
bit I2C_RecvACK()//处理器检测到SDA拉低就能知道外接IIC设备数据已经收到
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
    return CY;
}我查了下资料,说:CY表示了运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。我想问,
1.怎么才算借位??。
2.SDA只有1或0,那他最高位就只有1位,怎么都进不上去啊,那CY不就一直是0吗?。
3.CY位既然是处理器状态标志位,那么理论上CY应该是由硬件控制,为什么课一对他进行赋值呢?
4.能不能直接设个变量,如 uchar flag;flag=SDA;return flag;这样可以不?
求大神教教我,这种类型的寄存器不会用。还是我理解有问题,CY = SDA这句话表示,CY位对SDA引脚也就是P1.1进行检测?还有就是能否给我讲解一下什么是进位或者借位,能不能给我举个具体的例子?

此帖出自51单片机论坛


回复

使用道具 举报

532

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-1-23 11:06:52 | 显示全部楼层
本帖最后由 gs001588 于 2017-1-23 11:22 编辑

我用三张图来说明问题。
傲游截图20170123110240.jpg

傲游截图20170123110559.jpg
傲游截图20170123111245.jpg




回复

使用道具 举报

2928

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-23 14:17:38 | 显示全部楼层
按顺序给你回答:
1:进借位就是指加减法的溢出为,减法溢出表示向上有借位,0000000-1=11111111并且cy=1
2:这里只是用cy位传递返回值,和进借位没关系
3:状态标志在不做算数运算时不受影响,所以赋值可以一直保持
4:可以的,这么做更合理。

严格的说这程序不是特别合理,只是用cy传递SDA的位,你可以看看51的位操作这一块儿,C51在处理位变量时都用CY位来过度,代码里会有机制保护CY的使用过程不被中断影响。


回复

使用道具 举报

150

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-2-6 21:52:29 | 显示全部楼层
gs001588 发表于 2017-1-23 11:06
我用三张图来说明问题。

不是很懂,为什么左移会一次是1,一次是0.。。。

点评

可以这么理解。 左移的话相当于,CY+B7+B6+B5+B4+B3+B2+B1+B0,共9位; 右移的话相当于,B7+B6+B5+B4+B3+B2+B1+B0+CY,共9位。 我第一张图的数据BUF初始值为0xaa,即是10101010,B7位为1,左移一位,就是把原本B7  详情 回复 发表于 2017-2-6 23:06


回复

使用道具 举报

532

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-2-6 23:06:23 | 显示全部楼层
赵怡彬 发表于 2017-2-6 21:52
不是很懂,为什么左移会一次是1,一次是0.。。。

可以这么理解。
左移的话相当于,CY+B7+B6+B5+B4+B3+B2+B1+B0,共9位;
右移的话相当于,B7+B6+B5+B4+B3+B2+B1+B0+CY,共9位。
我第一张图的数据BUF初始值为0xaa,即是10101010,B7位为1,左移一位,就是把原本B7位移到了CY位。

点评

同理,如果右移的话,就是把B0位移到了CY位,其它位依次往低位移。  详情 回复 发表于 2017-2-6 23:08


回复

使用道具 举报

532

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-2-6 23:08:05 | 显示全部楼层
gs001588 发表于 2017-2-6 23:06
可以这么理解。
左移的话相当于,CY+B7+B6+B5+B4+B3+B2+B1+B0,共9位;
右移的话相当于,B7+B6+B5+B4+B ...

同理,如果右移的话,就是把B0位移到了CY位,其它位依次往低位移。


回复

使用道具 举报

150

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-2-7 22:46:57 | 显示全部楼层
gs001588 发表于 2017-2-6 23:08
同理,如果右移的话,就是把B0位移到了CY位,其它位依次往低位移。

懂了,这样通俗易懂。谢谢大神


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-2-21 18:57 , Processed in 0.267826 second(s), 18 queries , Redis On.

快速回复 返回顶部 返回列表