饿了就吃306 2023-06-15 15:36 采纳率: 0%
浏览 56

单片机两个按钮控制八盏灯

1.有数码管,两个按键,8个led灯
2.按一下S1第一个灯亮,依次往下,按下第9次的时候全亮,按下第10次的时候全灭;
3.同时每按下一次S1的时候,数码管显示次数;
4.按下S2的时候清零。

  • 写回答

1条回答 默认 最新

  • Minuw 2023-06-15 15:49
    关注

    不难
    可参考

    
    #include <reg52.h>
     
    //数据段定义
    unsigned char code Number[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
    //定义每个按键的状态
    #define K1  P1_0
    #define K2  P1_1
    #define K3  P1_2
     
    //延时函数
    void delay(unsigned int t)
    {
        unsigned int i,j;
        for(i=0;i<t;i++)
            for(j=0;j<120;j++);
    }
     
    //循环检测按键
    char KeyScan(void)
    {
        if(K1 == 0) //K1按下
        {
            delay(5); //按键消抖
            if(K1 == 0) //再次确认按键按下
            {
                while(K1 == 0); //等待按键松开
                return 1;
            }
        }
        if(K2 == 0) //K2按下
        {
            delay(5); //按键消抖
            if(K2 == 0) //再次确认按键按下
            {
                while(K2 == 0); //等待按键松开
                return 2;
            }
        }
        if(K3 == 0) //K3按下
        {
            delay(5); //按键消抖
            if(K3 == 0) //再次确认按键按下
            {
                while(K3 == 0); //等待按键松开
                return 3;
            }
        }
        return 0; //无按键按下
    }
     
    void main()
    {
        unsigned char a,counter = 0;
        unsigned long i = 0;
        
        while(1)
        {
            a = KeyScan(); //检测按键
            if(a == 1) //按下K1
            {
                counter++; //计数器加1
                if(counter == 3) //连续按下K1两次,K2一次,K3一次
                {
                    P0 = Number[1]; //在数码管上显示“1”
                    delay(200); //延时一段时间
                    counter = 0; //计数器清零
                }
            }
            else if(a == 2 || a == 3) //按下K2或K3
            {
                counter = 0; //计数器清零
            }
            else //无按键按下
            {
                P0 = Number[0]; //在数码管上显示“0”
            }
        }
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月15日