高级的选择HC573通道写法
前面我们介绍了基础的HC573写法,但这个写法会出现模块冲突。原因是数码管,LED,蜂鸣器继电器都由P0口来操作,给P0口赋值便可以控制他们的状态,但在赋值之前,需要选通他们对应的P2通道,如果给P0口赋值后没有关闭当前通道,而是直接打开下一个通道,那么给原先P0的数据便会锁存到其他模块里,造成混乱。所以在操作一个模块时,正确的做法是先将对应的通道打开,然后给P0口赋值,再把这个通道关闭,做到有始有终,便不会混乱,在这个逻辑下,出现了这么一套代码。
void HC138MODE(unsigned char channel,num)//channel指要选择的通道,num指赋给P0口的值
{
P2=(P2&0X1F)|0X00;
P0=num;
switch(channel)
{
case 4:P2=(P2&0X1F)|0X80;break;
case 5:P2=(P2&0X1F)|0Xa0;break;
case 6:P2=(P2&0X1F)|0Xc0;break;
case 7:P2=(P2&0X1F)|0Xe0;break;
}
}
下面是这段代码的详细解释。
观察741HC38的输入端,我们知道,P27,P26,P25是P2口的高三位,所以操作是对P2的高三位进行,其他位不用管。
P2=(P2&0X1F)|0X00;这一段指的是先将P2的高三位置0,清除上一次P2所选择的通道。0x1F的二进制数为0001 1111,这样就保证只是将前三位清零而不影响后五位。
然后便是选择通道,以4通道的LED为例,若要打开它,则需要将前3位变为二进制数100,也就是十进制数4.此时的P2=(P2&0X1F)|0X80;前面的0X1F又将前三位清零,而0x80的二进制是
1000 0000,将其相与,便可将前三位置为100而后五位不变,即打开了4通道。
5通道同理,先将前三位清0,然后将0xa0(1010 0000 )与之相与,得到前三位101.
切记,一定要在每一句后加上break!!!
这样做到有始有终,便不会引起逻辑的错误,可以单独控制买个模块了。