键控流水灯的程序

  • 格式:docx
  • 大小:15.50 KB
  • 文档页数:3

键控流水灯的程序

硬件电路描述如下:89S52 单片机的P1 口接有8 个LED,当某一端口输出为“0”时,

相应的LED 点亮,P3.2、P3.3、P3.4、P3.5 分别接有四个按钮K1~K4,按下按钮时,相应

引脚被接地。现要求编写可键控的流水灯程序,当K1 按下时,开始流动,K2 按下时停止

流动,全部灯灭,K3 使灯由上往下流动,K4 使灯由下往上流动。

下面首先给出程序,然后再进行分析。

例 2-1:键控流水灯的程序

#include "reg51.h"

#include "intrins.h"

#define uchar unsigned char

void mDelay(unsigned int DelayTime)

{ unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{ for(j=0;j<125;j++)

{;} }}

uchar Key()

{ uchar KeyV;

uchar tmp;

P3=P3|0x3c; //四个按键所接位置

KeyV=P3;

if((KeyV|0xc3)==0xff) //无键按下

return(0);

mDelay(10); //延时,去键抖

KeyV=P3;

if((KeyV|0xc3)==0xff)

return(0); else

{ for(;;){ tmp=P3;

if((tmp|0xc3)==0xff)

break;}

return(KeyV);}}

void main()

{ unsigned char OutData=0xfe;

bit UpDown=0;

bit Start=0;

uchar KValue;

for(;;)

{ KValue=Key();

switch (KValue)

{ case 0xfb: //P3.2=0,Start

{ Start=1;

break; }

case 0xf7: //P3.3=0,Stop

{ Start=0;

break; }

case 0xef: //P3.4=0 Up

{ UpDown=1;

break; }

case 0xdf: //P3.5=0 Down

{ UpDown=0;

break; }

}

if(Start)

{ if(UpDown)

OutData=_crol_(OutData,1);

else OutData=_cror_(OutData,1); P1=OutData;

}

else

P1=0xff; //否则灯全灭

mDelay(1000);

}

}