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