找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1016|回复: 12
收起左侧

这个单片机程序怎样改 按键按下后只在LED1和LED2之间来回切换

  [复制链接]
ID:143767 发表于 2023-5-28 18:32 | 显示全部楼层 |阅读模式
请教各位这个程序怎样改成按键按下后只在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);
                        }
                }
        }
}


回复

使用道具 举报

ID:883242 发表于 2023-5-28 20:00 | 显示全部楼层
把这一段
  1.         switch(mode)
  2.         {
  3.         }
复制代码

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

使用道具 举报

ID:161164 发表于 2023-5-28 23:04 | 显示全部楼层
2023-05-28_230423.png
回复

使用道具 举报

ID:549933 发表于 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;

        }
}
回复

使用道具 举报

ID:1077017 发表于 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);}
}
   
}


回复

使用道具 举报

ID:1057946 发表于 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;
                }
        }
}
回复

使用道具 举报

ID:213173 发表于 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);
                        }
                }
        }
}
回复

使用道具 举报

ID:1019324 发表于 2023-5-29 20:21 | 显示全部楼层
把按键分出来定一个标志位
回复

使用道具 举报

ID:149799 发表于 2023-5-29 20:56 | 显示全部楼层
编程技巧,能减少程序步数,是程序简洁,谢谢分享。
回复

使用道具 举报

ID:712097 发表于 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亮

                        }
                }
        }
}
回复

使用道具 举报

ID:341045 发表于 2023-5-30 10:52 | 显示全部楼层
主程序 if(mode==9) 改成 if(mode == 3), 如果你循环是有灭灯的就不用改了, 你要求不灭灯只是1,2灯交叉亮灭的, 把下面  mode=0; 改为 mode = 1; 就改完收工了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1061331 发表于 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;
回复

使用道具 举报

ID:143767 发表于 2023-5-30 11:49 | 显示全部楼层
谢谢各位的详细解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表