呵呵 俺来为你解答:
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开始新一轮的循环
呵呵 按你的要求编写的 恩 快点给俺加分吧
参照胖君的图,程序如下:
#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
}
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;
}
}
}
电路图就用推荐答案的那个图吧;
写到没有编译,可能有错,楼主自己再编译下,改一改
#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--);
}
main函数中检查按键是否按下(也可以在中断里进行检查),然后定义一个整形变量,例如flag,用它来记录按键按下的次数,分别为赋值1,2,3,然后循环;
然后通过判断flag的值,利用分支语句实现不同的功能就行了。慢闪和快闪只不过是中间的延时不同而已,注意记得在延时中加入按键是否按下的判断,这样更加准确。