标题: 咨询一个给单片机io口赋值的问题 [打印本页]

作者: mtt661    时间: 2022-3-17 15:07
标题: 咨询一个给单片机io口赋值的问题
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始终是高电平;

作者: lkc8210    时间: 2022-3-17 18:09
其实SER=dat>>7;这句并不是把dat位移后的值放到SER
而是判断dat位移后的值是不是0
不是0就把SER置1, 是0就置0
作者: snsoyang    时间: 2022-3-17 19:43
需要强制转换成位,SER=(bit)(dat>>7);
作者: mtt661    时间: 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位后的最高位,

作者: lkc8210    时间: 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
复制代码



作者: caowei123    时间: 2022-3-21 15:16
其实SER=dat>>7;这句并不是把dat位移后的值放到SER
而是判断dat位移后的值是不是0





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