简单的51单片机键盘C程序

#include "reg51.h" #include "intrins.h" #define uchar unsigned char unsigned int updown=0; /*灯的流动方向*/ unsigned int start=0; /*灯开始流动显示*/ unsigned int stop=0; /*使灯停止流动显示*/ /*延时程序*/ void Delay(unsigned int time) { unsigned int j; for(;time>0;time--) { for(j=0;j<124;j++) {;} } } /*按键获取程序*/ unsigned int Key() { uchar keyvalue; keyvalue=P3; keyvalue|=0xc3; if((keyvalue|=0xc3)==0xff) { Delay(10); if((keyvalue|=0xc3)==0xff) { return(0); } } else { Delay(10); if((keyvalue|=0xc3)!=0xff) { if((keyvalue|=0xfb)!=0xff) { return(1);} if((keyvalue|=0xf7)!=0xff) { return(2);} if((keyvalue|=0xef)!=0xff) { return(3);} if((keyvalue|=0xdf)!=0xff) { return(4);} } } } /*按键处理程序*/ void Prokey(unsigned int keyvalue) { if(keyvalue==1) { start=1; updown=1; stop=0; } if(keyvalue==2) { start=1; stop=1;} if(keyvalue==3) { start=1; updown=1;} if(keyvalue==4) { start=1; updown=0;} } void main() { unsigned int keyvalue; /*按键的数值*/ uchar lamp=0xfe; /*LED循环的数值*/ for(;;) { keyvalue=key(); /*获取按键值*/ Prokey(keyvalue); if(start) /*开始灯的流动显示*/ { if(stop) { P1=0xff; lamp=0xfe; } else { if(updown) { P1=lamp; lamp=_cror_(lamp,1); } else { P1=lamp; lamp=_crol_(lamp,1); } } Delay(500); } } } 要完成的任务是:按下K1键,灯开始流动显示(由下往上);按下K2键,灯停止流动,所有灯为暗;按下K3键,灯由下往上流动;按下K4键。灯开始由上往下流动。 小弟自己编的程序,只能完成第一个任务,按下K2、K3、K4键都没用,请教各位大虾,这是什么原因???

第1个回答  2019-03-25
A|=B;
等价于
A=A|B;
是先进行或运算,再把运算结果赋给A,之后的A已经不是原来的A了。
第一个键值判断后,你就键值变量已经被赋予新的值了。
如果正好按的是第一个键则能返回1,
如果不是第一个键按下,但经过
if((keyvalue|=0xfb)!=0xff)这一判断,其中的“keyvalue|=0xfb”就把keyvalue变成0xff了,后面的判断条件自然不会满足。
把这里的一些等于号再去掉试试看。
另外,建议你对于按键扫描程序使用switch
case
语句,这样条理更清晰。
/*按键获取程序*/
unsigned
int
Key()
{
uchar
keyvalue;
keyvalue=P3;
keyvalue|=0xc3;
if((keyvalue|0xc3)==0xff)
{
Delay(10);
if((keyvalue|0xc3)==0xff)
{
return(0);
}
}
else
{
Delay(10);
if((keyvalue|0xc3)!=0xff)
{
if((keyvalue|0xfb)!=0xff)
{
return(1);}
if((keyvalue|0xf7)!=0xff)
{
return(2);}
if((keyvalue|0xef)!=0xff)
{
return(3);}
if((keyvalue|0xdf)!=0xff)
{
return(4);}
}
}
}
相似回答