51单片机简单程序问题,关于开关控制

来源:百度知道 编辑:UC知道 时间:2024/06/08 02:13:30
3. 多路开关状态指示
#include <AT89X51.H>
unsigned char temp;

void main(void)
{
while(1)
{
temp=P1>>4;
temp=temp | 0xf0;
P1=temp;
}
}
我的理解:开始时P1口是 11111111,右移4位以后变成00001111,
和11110000进行或运算变成11111111,四路灯接在P1^0-P1^3口,4路开关接在P1^4-P1^7口,开关的开或关只能影响到后4位的0或1,但是没有影响到前四位也就是灯的0或1啊??、各位大侠,我的理解哪里出了问题?
程序中没看到开关控制的程序啊,开关是怎么控制的呢??

程序是没有问题的

其实你的理解就错在第一步,后面的都是对的,P1口的初始状态不是11111111而是与开关的状态有关的,比如有些位的开关处在把这位置0的位置(假设是P1.6)其它位是把IO置1的位置,那么P1的状态就是1011XXXX,右移相或后就是11111011,就可以控制相应的灯了,再下个循环读的时候还是一样,读IO是当前外部电平的高低,与上次IO输出无关!所以读回来还是开关的状态!
temp=P1>>4; 这句就是在读开关的状态,同时进行移位处理等效于:
temp=P1;
temp>>=4;

程序是对的,但你想问什么样的问题?

开关控制?先用几个位变量定义好开关量,然后传送到P1.4-P1.7。比如位00H~03H分别对应与P1.4~P1.7,在设置好位变量之后再复制过去,这样该没问题了吧?