今天有同学学习《手把手教你学51单片机》过程中遇到一个关于51单片机IO口操作的问题,可能有其他同学有类似疑问,或者是其他同学根本没有考虑过这个疑问问题,我简单提一下,今后有类似问题也欢迎大家留言,我会给大家解释。
问题很简单,但是对于初学者常犯。
对于51单片机的P口来说,我们习惯上的赋值是P1 = 0xXX。但是这样操作是一次性操作了8个IO口。而有些情况下,我们只需要操作其中的几个而不是全部的时候,我们如何操作呢?如下图注释上边的部分,是我写的程序代码。
这个是操作51单片机P1口的低4位对步进电机进行操作的程序,在这个操作过程中,我们只使用到了P1口的低4位,因此我们希望高4位保持不变,只改变P1的低4位。首先把P1进行一个备份到变量tmp中去,然后把变量tmp的经过两条语句,得到最终要赋值给P1的值以后,再一次性赋值给P0,这个方法大家都可以学习一下。
而注释下边的这段程序,是一位同学写的,这位同学的理由是下边这种写法,也没有改变P1的高4位。表面看也没什么问题,但是实际上如果不利用tmp这个变量,P1就会产生一个错误的中间值。
P1= P1&0xF0;这条语句执行完毕以后,P1 = 0xX0;其中X是未知的,保持了之前P1的高4位的原值,而低4位是0;
再然后P1= P1|BeatCode[index];这样操作后,P1得到了最终的值。
但是这中间,P1 = 0xX0;这个值是我们根本不需要的一个错误值。不要怕有问题,但是我也不希望没有经过思考的问题。而这个问题,就是同学经过思考的问题,我认为很好,写出来提供给同学们共同学习。