有实验箱的朋友帮忙试试能打印出什么内容?
P6 =~(~P6<<1)是将P6=0b1111 1110的值变成P6=0b1111 1101
yefeng 发表于 2023-11-20 15:05
理论计算是这样,但是实际情况还真不一定是,第二次输出有可能是255。如果申请到了实验箱你可以试试,我还没学完,没法申请,所以暂时无法试验。 rengran 发表于 2023-11-20 15:24
理论计算是这样,但是实际情况还真不一定是,第二次输出有可能是255。如果申请到了实验箱你可以试试,我 ...
我这是pc上运行的结果 yefeng 发表于 2023-11-20 17:36
我这是pc上运行的结果
PC上运行和实际的单片机还是两码事,毕竟PC运行只是进行运算,1+1咋算都等于2,可是实际当中就有可能是3,因为它忽略了实际硬件上的状况
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);
}
}
}
这样就能获取修改后的状态:
规格书上也有相应的介绍:
乘风飞扬 发表于 2023-11-21 11:02
STC芯片使用多级流水线结构,修改IO口状态指令后面需要等待2个时钟周期再去读取:
这样就能获取修改后的 ...
这两个_nop_()指令,其实是给端口改变一个时间,毕竟端口内部也是硬件组成的,锁存器里的值改变后不会立马反映到端口上,所以此时所有针对端口的操作比如Pn &=,Pn |= 等操作都需要增加_nop_()函数,这样Pn &=,Pn |= 的值才会做出更改。Pn &=,Pn |= 这类的操作都是先读取端口,根据端口的状态再进行更改锁存器里的值。如果连续对端口值进行如Pn &=,Pn |=等操作而不加_nop_()的话,端口状态其实并不会如理论计算那样是最后一次更改的状态,有可能是连续更改最后一次更改前两个或者前三个时的状态。
页:
[1]