如题 最近在学单片机,在实验一个方案, 即用一个按键实现多种流水灯之间的切换,但是按键只按一次有效。用中断也无效,请大侠们分析一下原因在哪!
#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;
}
}