单片机,一个按键控制LED三种状态,第一次按,慢闪;第二次按下,快闪;第三次按下,关闭,反复;

2025-03-06 21:08:31
推荐回答(4个)
回答1:

呵呵   俺来为你解答:

1 参考电路图:     如下 

2   参考程序:

                          ORG    0000H

                          LJMP    MAIN

                          ORG    0100H

MAIN:                 SETB    P1.7                       ; LED   灭

LL1:                   SETB    P1.0

                          JB         P1.0,  LL1

MS:                 CPL      P1.7                        ; LED  慢 闪

                          MOV     R7,#255

                          LCLL    YS                         

LL2:                 SETB     P1.0

                           JB          P1.0, MS

KS:                     CPL       P1.7                       ;  LED   快闪

                          MOV      R7,#15

                          LCLL     YS                         

LL3:                 SETB     P1.0

                          JB           P1.0, KS

GB:                     SETB      P1.7                   ;LED关闭

                           SJMP      LL1                     ;转LL1开始新一轮的循环

 

         呵呵       按你的要求编写的    恩    快点给俺加分吧

回答2:

参照胖君的图,程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit KEY=P1^0;
sbit LED=P1^7;
void delay(uint x)
{
uchar i,j;
for(i=0;i for(j=0;j<125;j++);
}

uchar keyck(void)
{
uchar ch;
ch=0;
if(KEY==0)
{
delay(10);
if(KEY==0)ch=1;
}
return(ch);
}

main()
{
uchar num;
num=0;
while{
if(keych())num++;
num%=3;
switch(num)
{
case 0:LED=1;break;
case 1:LED=~LED;delay(400);break;
case 2:LED=~LED;delay(100);break;
default:break;
}
}
}

回答3:

电路图就用推荐答案的那个图吧;
写到没有编译,可能有错,楼主自己再编译下,改一改

#include
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^7;
sbit key=P1^0;//=0是按键 =1是没按
void LED_con;
void stop();
void fast();
void delayshort();
void delayfast();
uchar flag=0;//状态标识
//假设程序段不长
void main()
{
LED =1;
while(1)
{
LED_con();
}
}
void LED_con()
{
if(key==0)
{
while(key==0);
if(key==1)//抬手识别
{flag=((flag==3)?1:(flag++));}//按键就加1,加到三就表示按完3下后又按了一下,就是新的第一下按键
}
switch (flag)
{
case 1:
slow();break;
case 2:
fast();break;
case 3:
stop();break;
}
}

void slow()
{
LED=~LED;
delayshort();
}
void fast()
{
LED=~LED;
delaylong();
}
void stop()
{
LED =1;
}
void delayshort();
{
uint tmp=5000;
while(tmp--);
}
void delaylong()
{
uint tmp=10000;
while(tmp--);
}

回答4:

main函数中检查按键是否按下(也可以在中断里进行检查),然后定义一个整形变量,例如flag,用它来记录按键按下的次数,分别为赋值1,2,3,然后循环;
然后通过判断flag的值,利用分支语句实现不同的功能就行了。慢闪和快闪只不过是中间的延时不同而已,注意记得在延时中加入按键是否按下的判断,这样更加准确。