小白求助,单片机流水控制灯相关。

本文详细介绍了如何使用P0口的低三位构成键盘,并控制P1口的共阳极LED实现流水灯、自上而下和自下而上的闪烁效果,以及2Hz闪烁模式。同时,着重讨论了键盘按键触发LED模式切换的编程逻辑。遇到最后一灯直接亮的问题可能是代码逻辑错误或硬件连接问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:利用P0口的低三位组成独立键盘,编写程序读取键盘的输入状态:

利用P1口控制共阳极的八只LED灯,
当1键按下后,LED进行自上而下流水闪烁,
当2键按下后,LED进行自下而上流水闪烁,当3键按下后,LED进行闪烁发光

进行流水灯操作是要求一次流水3秒钟,进行循环5次后,LED全部熄灭:

进行内烁操作是要求闪烁频率为2Hz,闪5次后修止闪烁,LED全部点亮:

以上操作进行过程中,健盘按下后,可随时切换LED发光模式
如图接线:在这里插入图片描述
程序:`
#include<reg51.h>

sbit key0 = P0^0;
sbit key1 = P0^1;
sbit key2 = P0^2;

void delay()
{
unsigned char i,j,k;
for(i=15;i>0;i–)
{
for(j=124;j>0;j–)
{
for(k=200;j>0;j–);
}
}

}
void delayh()
{//同上,0.5s
int d,f,t;
for(d=191;d>0;d–)
{
for(f=125;f>0;f–)
{
for(t=125;t>0;t–);
}
}
}

unsigned char keyscan()
{

unsigned char  keyscan_num, temp;
 
 P0  = 0xff ;
 temp = P0;
 
 if(~(temp&0xff))
 {		

      if(key0 == 0)
	  {
	     keyscan_num = 0;
	  }
	  else if(key1 == 0)
	  {
       	 keyscan_num = 1;
	  }
	  else if(key2 == 0)
	  {
	      keyscan_num = 2;
	  }
	  return keyscan_num;
 }

}

void main()
{
unsigned char key_num;
unsigned char a=0,b=0,c=0;
while(1)
{
key_num = keyscan();
switch(key_num)
{
case 0 :goto function0;
case 1 :goto function1;
case 2 :goto function2;
default :
break;
}
//由上往下
function0:
P1 = 0x7f;
delay();
P1 = 0xbf;
delay();
P1 = 0xdf;
delay();
P1 = 0xef;
delay();
P1 = 0xf7;
delay();
P1 = 0xfb;
delay();
P1 = 0xfd;
delay();
P1 = 0xfe;
delay();
a++;
if(a<=5)
{
key_num = keyscan();
switch(key_num)
{
case 0 : goto function0;
case 1 : goto function1;
case 2 : goto function2;
default : goto function0;
break;
}
}
else {break;}
//由下往上
function1 :
P1 = 0xfe;
delay();
P1 = 0xfd;
delay();
P1 = 0xfb;
delay();
P1 = 0xf7;
delay();
P1 = 0xef;
delay();
P1 = 0xdf;
delay();
P1 = 0xbf;
delay();
P1= 0x7f;
delay();
b++;
if(b<=5)
{
key_num = keyscan();
switch(key_num)
{
case 0 : goto function0;
case 1 : goto function1;
case 2 : goto function2;
default : goto function1;
break;
}
}
else {break;}

	 function2:
	 P1 = 0x00;
	 delayh();
	  c++;
	 if(c<=5)
	 {
	 key_num = keyscan();
	 switch(key_num)
			{
	    case 0 : goto function0;
		case 1 : goto function1;
		case 2 : goto function2;
		default : goto function2;
		break;
			}
	 }
	 else {P1 = 0x00;}
	 
}

}
`
问题描述:进行仿真的时候最后一个灯直接亮了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值