找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 916|回复: 5
收起左侧

咨询一个给单片机io口赋值的问题

[复制链接]
ID:1010435 发表于 2022-3-17 15:07 | 显示全部楼层 |阅读模式
sbit SER=P2^1;
for(a=0;a<8;a++)
{    SER=dat>>7;        
    dat<<=1;        

}

以上情况是将数据dat由最高位开始依次送到P2_1口,那么问题来了,dat始终是一个8位的二进制,P2_1口只接收dat的最高位还是最低位?我用Proteus试了下,不管给P2_1=0x80;还是P2_1=0x01;P2_1始终是高电平;
回复

使用道具 举报

ID:161164 发表于 2022-3-17 18:09 | 显示全部楼层
其实SER=dat>>7;这句并不是把dat位移后的值放到SER
而是判断dat位移后的值是不是0
不是0就把SER置1, 是0就置0
回复

使用道具 举报

ID:978751 发表于 2022-3-17 19:43 | 显示全部楼层
需要强制转换成位,SER=(bit)(dat>>7);
回复

使用道具 举报

ID:1010435 发表于 2022-3-18 09:53 | 显示全部楼层
lkc8210 发表于 2022-3-17 18:09
其实SER=dat>>7;这句并不是把dat位移后的值放到SER
而是判断dat位移后的值是不是0
不是0就把SER置1, 是 ...

明白了
比如data=10101100
先向右移七位变成0000001 判断0或者1 这个时候SER=1
然后把data向左移1位 data变成了01011000,
再向右移七位再判断。。。始终判断的是右移7位后的最高位,
回复

使用道具 举报

ID:161164 发表于 2022-3-18 11:59 | 显示全部楼层
mtt661 发表于 2022-3-18 09:53
明白了
比如data=10101100
先向右移七位变成0000001 判断0或者1 这个时候SER=1


但建议用SER = dat & 0x80;
比较快

  1.    192:                         SER = dat >> 7;
  2. C:0x03DE    E512     MOV      A,dat(0x12)
  3. C:0x03E0    C4       SWAP     A
  4. C:0x03E1    13       RRC      A
  5. C:0x03E2    13       RRC      A
  6. C:0x03E3    13       RRC      A
  7. C:0x03E4    5401     ANL      A,#0x01
  8. C:0x03E6    24FF     ADD      A,#0xFF
  9. C:0x03E8    92B7     MOV      RD(0xB0.7),C

  10.    196:                         SER = dat & 0x80;
  11. C:0x03FC    E512     MOV      A,dat(0x12)
  12. C:0x03FE    33       RLC      A
  13. C:0x03FF    92B7     MOV      RD(0xB0.7),C
复制代码


回复

使用道具 举报

ID:1011864 发表于 2022-3-21 15:16 | 显示全部楼层
其实SER=dat>>7;这句并不是把dat位移后的值放到SER
而是判断dat位移后的值是不是0
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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