单片机P0口高4位接上拉电阻接4个LED灯,低4位开关接GND。P00合上,P04的LED亮,P01合上,P05的LED亮,依次,P03合上,P07的LED亮。开关合上就接地了,高4位输出0,灯就亮了。<br />我的程序编好了,效果也出来了,如下:<br />思路1<br />#include <reg52.h><br />#define uint unsigned int<br />#define uchar unsigned char<br />void main() <br />{<br /> uchar a,b,c,m,n,i;<br /> <br /> b=0xff; <br /> P0=0xff;<br /> while(1)<br /> { a=0x01; <br /> for(c=0;c<5;c++)<br /><br />{ m=P0|(~a);<br /> if(m==(~a)) //检测P1_0按键是否按下<br /> {<br /> i=a;<br /> b=(b&(~i))&(~(i<<4));<br /> P0=b;<br /> }<br /> else<br /> {<br /> b=((b|i)|(i<<4));<br /> P0=b;<br /> }<br /> a=a<<1;<br /> <br />// for(m=0;m<255;m++)<br /> for(n=0;n<200;n++);<br /> <br /> <br /> }}<br /> }<br />用的是循环,教材上是用的低4位逐一判断,然后输出,很易懂。<br /><br />我又尝试这样的思路:首先将P0口的状态读入赋给a,然后a=((a<<4)|(a&0x0f)),再把a赋给P0口,这样不是简单很多,程序如下:<br />#include <reg52.h><br />#define uint unsigned int<br />#define uchar unsigned char<br />void main() <br />{<br /> uchar a,n;<br /> while(1)<br /> {<br /> a=P0;<br /> a=((a<<4)|(a&0x0f));<br /> P0=a;<br /> for(n=0;n<200;n++);<br /> }<br />}<br />结果肯定错了,不然我也不会上来请教了,想了半宿,硬是没有想通,哪里错了。<br /><br />最后再问一个Keil51软件的问题,如图:程序仿真时,port0框内,P0栏8个状态位和下面的Pins状态位有什么关系?为什么有时上下状态一致有时不一致?为什么聂?<br /><br />搬个板凳坐到等,^_^ |
|