标题: 这个单片机程序怎样改 按键按下后只在LED1和LED2之间来回切换 [打印本页]

作者: dj3365191    时间: 2023-5-28 18:32
标题: 这个单片机程序怎样改 按键按下后只在LED1和LED2之间来回切换
请教各位这个程序怎样改成按键按下后只在LED1和LED2之间来回切换,就是说上电LED1,LED2都不亮,按键按下后LED1亮,LED2灭。再按一次LED2亮,LED1灭,再按一次又是LED1亮,LED2灭,如此反复循环,谢谢

#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

u16 mode;

sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
sbit key=P3^1;

void delay(u16 i)
{
        while(i--);
}

void LED()
{
        switch(mode)
        {
                case(0):LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;
                case(1):LED1=0;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;
                case(2):LED1=1;LED2=0;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;
                case(3):LED1=1;LED2=1;LED3=0;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;
                case(4):LED1=1;LED2=1;LED3=1;LED4=0;LED5=1;LED6=1;LED7=1;LED8=1;break;
                case(5):LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;LED6=1;LED7=1;LED8=1;break;
                case(6):LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=0;LED7=1;LED8=1;break;
                case(7):LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=0;LED8=1;break;
                case(8):LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=0;break;

        }
}


void main()
{
        while(1)
        {
                LED();
                if(key==0)
                {
                        delay(1000);
                        if(key==0)
                        {
                                mode++;
                                if(mode==9)
                                {
                                        mode=0;
                                }
                                while(!key);
                        }
                }
        }
}



作者: Hephaestus    时间: 2023-5-28 20:00
把这一段
  1.         switch(mode)
  2.         {
  3.         }
复制代码

改成
  1. LED1=mode&1;
  2. LED2=!(mode&1);
复制代码

作者: lkc8210    时间: 2023-5-28 23:04


作者: lsy5110    时间: 2023-5-28 23:07
void LED()
{
        switch(mode)
        {
                case(0):LED1=1;LED2=1;break;
                case(1):LED1=0;LED2=1;break;
                case(2):LED1=1;LED2=0;break;
                case(3):LED1=0;LED2=1;break;
                case(4):LED1=1;LED2=0;break;
                case(5):LED1=0;LED2=1;break;
                case(6):LED1=1;LED2=0;break;
                case(7):LED1=0;LED2=1;break;
                case(8):LED1=1;LED2=0;break;

        }
}

作者: leave323    时间: 2023-5-28 23:41
#include <reg52.h>
sbit LED1=P2^0;
sbit LED2=P2^1;
void delay(int i)
{
        while(i--);
}
void main()
{
while(1)
{  
      LED1=0;
      LED2=1;
      if(key==0)
                {
                      delay(1000);
                      if(key==0)
                      {LED1=~LED1;LED2=~LED2;while(!key);}
}
   
}



作者: ZZZZZ134679    时间: 2023-5-29 00:06
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

bit mode;

sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
sbit key=P3^1;

void delay(u16 i)
{
        while(i--);
}
void main()
{
      LED3=LED4=LED5=LED6=LED7=LED8=1;
        while(1)
        {
                if(key==0)
                {
                    delay(20);
                    while(key==0)
                     delay(20);
                        mode^=1;
                       LED1=mode?1:0;
                       LED2=mode?0:1;
                }
        }
}
作者: wulin    时间: 2023-5-29 05:59
去掉所有赘句,越简单越好。
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit LED1=P2^0;
sbit LED2=P2^1;

sbit key=P3^1;

void delay(u16 i)
{
        while(i--);
}

void main()
{
        while(1)
        {
                if(!key)
                {
                        delay(200);
                        if(!key)
                        {
                                LED1=~LED1;
                                LED2=~LED1;
                                while(!key);
                        }
                }
        }
}
作者: 清风皓月抚心绕    时间: 2023-5-29 20:21
把按键分出来定一个标志位
作者: 王秋冬    时间: 2023-5-29 20:56
编程技巧,能减少程序步数,是程序简洁,谢谢分享。
作者: chxelc    时间: 2023-5-30 08:43
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

u16 mode;

sbit LED1=P2^0;
sbit LED2=P2^1;

sbit key=P3^1;

void delay(u16 i)
{
        while(i--);
}

void main()
{
        while(1)
        {
                LED1=LED2=1;//假设LED高电平灭,低电平亮
                if(key==0)//开关按下为低电平
                {
                        delay(1000);//延时防误触
                        if(key==0)
                        {
                              LED1=~LED1;//LED1取反,上电LED1不亮,第一次按时,LED1亮,第2次按时LED1灭                              LED2=~LED1;//LED2取LED1反,上电时LED2不亮,第一次按时,LED1亮,LED2灭,第二次按时,LED1灭,LED2亮

                        }
                }
        }
}

作者: lzts88    时间: 2023-5-30 10:52
主程序 if(mode==9) 改成 if(mode == 3), 如果你循环是有灭灯的就不用改了, 你要求不灭灯只是1,2灯交叉亮灭的, 把下面  mode=0; 改为 mode = 1; 就改完收工了
作者: 13423265909    时间: 2023-5-30 11:02
用switch case来试试                case(0):LED1=1;LED2=1;break;                 case(1):LED1=0;LED2=1;break;                 case(2):LED1=1;LED2=0;break;                 case(3):LED1=0;LED2=1;break;                 case(4):LED1=1;LED2=0;break;                 case(5):LED1=0;LED2=1;break;                 case(6):LED1=1;LED2=0;break;                 case(7):LED1=0;LED2=1;break;                 case(8):LED1=1;LED2=0;break;
作者: dj3365191    时间: 2023-5-30 11:49
谢谢各位的详细解答




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1