赞助论坛
  • 2598阅读
  • 0回复

请教 如何用一个按键实现多函数调用;有程序!请大侠分析! [复制链接]

楼层直达
bios  
发帖
99
精华
0
金币
244
威望
0
贡献
0
好评
0
注册
2010-11-16
楼主    bios 发表于: 2014-04-01 21:40:27 
如题 最近在学单片机,在实验一个方案, 即用一个按键实现多种流水灯之间的切换,但是按键只按一次有效。用中断也无效,请大侠们分析一下原因在哪!


#include<reg52.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar flag,num;
sbit k1=P3^4;
sbit led1=P1^1;
//sbit led2=P1^7;
void led();
void led2();
void led3();
void led4();
void keyscan();
void delay(uint t);
void delay1(int x);
//sbit led1=P1^7;
uchar code table[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff,0x00,0xff,0x00};

uchar code table1[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,0xff,0x00,0xff,0x00};

uchar code tab[]={0xff,0x7e,0x3c,0x19,0x00,0x19,0x3c,0x7e};
/***延时函数*******/
void delay(uint t)
{
uchar i;
while(t--)
for(i=0;i<100;i++);
}
/****呼吸灯延时*****/
void delay1(int x)     //呼吸灯延时用
{
int i;
for(i=x;i>0;i--);
}
/********按键函数****************/
void keyscan()
{
if(k1==0)
{
delay(16);
if(k1==0)
{
while(!k1);
  num=~num;
}

}
}
/**********彩灯1***********/
void led()
{
P1=0xff;
delay(100);
}

/*********bcd彩灯**********/
void led2()
{
uchar i=255;
while(1)
{
i--;
P1=i;
delay(300);

}
}
/*********霹雳灯*********/
void led3()
{
uchar i;
for(i=0;i<8;i++)
{
  P1=tab[i];
  delay(150);
}

}
/*******递增闪灯**********/
void led4()
{
uchar i;
for(i=0;i<13;i++)
{
P1=table[i];
delay(700);
}
for(i=0;i<13;i++)
{
P1=table1[i];
delay(700);
}
}
/****main **********/
void main()//主函数
{
while(1)
{
keyscan();
if(num==0)
led1=0;
else
led1=1;
}

}