• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> 请教 如何用一个按键实现多函数调用;有程序!请大侠分析!
    请教 如何用一个按键实现多函数调用;有程序!请大侠分析!
    2014年04月01日 点击: 编辑: bios
    如题 最近在学单片机,在实验一个方案, 即用一个按键实现多种流水灯之间的切换,但是按键只按一次有效。用中断也无效,请大侠们分析一下原因在哪!


    #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;
      delay(150);
    }

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

    }