rengran 发表于 2023-11-19 14:01:24

有实验箱的朋友帮忙试试能打印出什么内容?


P6 =~(~P6<<1)是将P6=0b1111 1110的值变成P6=0b1111 1101




yefeng 发表于 2023-11-20 15:05:07


rengran 发表于 2023-11-20 15:24:21

yefeng 发表于 2023-11-20 15:05


理论计算是这样,但是实际情况还真不一定是,第二次输出有可能是255。如果申请到了实验箱你可以试试,我还没学完,没法申请,所以暂时无法试验。

yefeng 发表于 2023-11-20 17:36:30

rengran 发表于 2023-11-20 15:24
理论计算是这样,但是实际情况还真不一定是,第二次输出有可能是255。如果申请到了实验箱你可以试试,我 ...

我这是pc上运行的结果

rengran 发表于 2023-11-20 19:18:14

yefeng 发表于 2023-11-20 17:36
我这是pc上运行的结果

PC上运行和实际的单片机还是两码事,毕竟PC运行只是进行运算,1+1咋算都等于2,可是实际当中就有可能是3,因为它忽略了实际硬件上的状况

乘风飞扬 发表于 2023-11-21 11:02:07



STC芯片使用多级流水线结构,修改IO口状态指令后面需要等待2个时钟周期再去读取:
    while(1)
    {
      if(P32 == 0)
      {
            delay_ms(10);
            if(P32 == 0)
            {
                printf("P6=0x%02bx\r\n", P6);
                P6 = ~(~P6<<1);
                _nop_();
                _nop_();
                i = P6;
                printf("i=0x%02bx\r\n", i);
                while(P32 == 0);
            }
      }
    }
这样就能获取修改后的状态:


规格书上也有相应的介绍:


rengran 发表于 2023-11-21 15:38:20

乘风飞扬 发表于 2023-11-21 11:02
STC芯片使用多级流水线结构,修改IO口状态指令后面需要等待2个时钟周期再去读取:

这样就能获取修改后的 ...

这两个_nop_()指令,其实是给端口改变一个时间,毕竟端口内部也是硬件组成的,锁存器里的值改变后不会立马反映到端口上,所以此时所有针对端口的操作比如Pn &=,Pn |= 等操作都需要增加_nop_()函数,这样Pn &=,Pn |= 的值才会做出更改。Pn &=,Pn |= 这类的操作都是先读取端口,根据端口的状态再进行更改锁存器里的值。如果连续对端口值进行如Pn &=,Pn |=等操作而不加_nop_()的话,端口状态其实并不会如理论计算那样是最后一次更改的状态,有可能是连续更改最后一次更改前两个或者前三个时的状态。
页: [1]
查看完整版本: 有实验箱的朋友帮忙试试能打印出什么内容?