找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3852|回复: 9
收起左侧

我想让按键按下LED一直循环闪亮,松开就灭,要怎么去修改单片机程序求大神指教

[复制链接]
ID:388130 发表于 2019-8-16 13:54 | 显示全部楼层 |阅读模式
#include "reg52.h"               

typedef unsigned int u16;
typedef unsigned char u8;

sbit k1  =P1^0;  //定义按键输入端口
sbit led1=P1^4;  //定义led输出端口
sbit led2=P1^3;
sbit led3=P1^2;
sbit led4=P1^1;
sbit led5=P0^5;
sbit led6=P0^4;
sbit led7=P2^7;
sbit led8=P2^6;


/*------------------------------------------------
                    yanshi
------------------------------------------------*/


        void delay500ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=205;c>0;c--)
        for(b=116;b>0;b--)
            for(a=9;a>0;a--);
}



void keypros()
{

     if(k1==0)        
        {        

                if(k1==0)
                {

                        led1=0;
                                                led2=0;        
                                                delay500ms();
                                                led3=0;
                                                led4=0;
                                                delay500ms();
                                                led5=0;
                                                led6=0;
                                                delay500ms();
                                                led7=0;
                                                led8=0;
                }
                else
                {
                        led1=1;
                                                led2=1;
                                                led3=1;
                                                led4=1;
                                                led5=1;
                                                led6=1;
                                                led7=1;
                                                led8=1;
                 }

        }
}  

回复

使用道具 举报

ID:230975 发表于 2019-8-17 07:24 来自手机 | 显示全部楼层
程序没传完
回复

使用道具 举报

ID:213173 发表于 2019-8-17 08:10 | 显示全部楼层
按你的意图改写,但松手后要等一轮循环结束才全熄灭。如果想松手立即全熄灭就要用定时器中断:
#include "reg52.h"               

typedef unsigned int u16;
typedef unsigned char u8;

sbit k1  =P1^0;  //定义按键输入端口
sbit led1=P1^4;  //定义led输出端口
sbit led2=P1^3;
sbit led3=P1^2;
sbit led4=P1^1;
sbit led5=P0^5;
sbit led6=P0^4;
sbit led7=P2^7;
sbit led8=P2^6;


/*------------------------------------------------
                    yanshi
------------------------------------------------*/


void delay500ms(void)   //误差 0us
{
        unsigned char a,b,c;
        for(c=205;c>0;c--)
                for(b=116;b>0;b--)
                        for(a=9;a>0;a--);
}

void keypros()
{       
        if(k1==0)        
        {                       
                led1=0;
                led2=0;        
                led3=1;
                led4=1;
                led5=1;
                led6=1;
                led7=1;
                led8=1;
                delay500ms();
                led1=1;
                led2=1;
                led3=0;
                led4=0;
                led5=1;
                led6=1;
                led7=1;
                led8=1;
                delay500ms();
                led1=1;
                led2=1;
                led3=1;
                led4=1;
                led5=0;
                led6=0;
                led7=1;
                led8=1;
                delay500ms();
                led1=1;
                led2=1;
                led3=1;
                led4=1;
                led5=1;
                led6=1;
                led7=0;
                led8=0;
                delay500ms();
        }
        else
        {
                led1=1;
                led2=1;
                led3=1;
                led4=1;
                led5=1;
                led6=1;
                led7=1;
                led8=1;
        }
}
void main()
{
        while(1)
        {
                keypros();
        }
}
回复

使用道具 举报

ID:462827 发表于 2019-8-17 08:38 | 显示全部楼层
你的8颗led不在同一个P口上,不能简单地通过位操作来循环亮灭每颗灯,所以建议用一个函数来封装对它们的操作,只需要传送的参数是第n颗灯以及要它亮或灭就行了。

因为要对按键作出即时的反应,所以,对灯的操作应在中断里进行,而按键的检测轮询和中断都可以。
回复

使用道具 举报

ID:123289 发表于 2019-8-17 09:18 | 显示全部楼层
1、将显示与按键分开编写。
2、按键:做个标记B_KEY,按下时=1,反之为0。
3、编写一个循环闪亮程序,在B_KEY=1时执行它。
4、在B_KEY=0,时灭灯。
回复

使用道具 举报

ID:592674 发表于 2019-8-19 08:46 | 显示全部楼层
没有main函数啊怎么会亮呢
回复

使用道具 举报

ID:560467 发表于 2019-8-19 15:19 | 显示全部楼层
把else的内容放到最外一个if那里就ok
回复

使用道具 举报

ID:592379 发表于 2019-8-27 10:14 | 显示全部楼层
设定一个标记位,按键按住时一直将其置1,松开后置0,然后在定时器中断里添加一个循环点灯程序,在标记位为1时调用,标记位为0时将所有灯熄灭
回复

使用道具 举报

ID:275826 发表于 2019-8-27 22:04 | 显示全部楼层
void main()
  {while(1)
     {if(!key)
       { P1=~P1;
         Delayms(500);
        }
     else P1=0xff;
    }
  }
回复

使用道具 举报

ID:458699 发表于 2019-8-28 00:10 | 显示全部楼层
循环检测按键状态,分别把一位一位的值置一,其他置零,就能够达到循环闪烁效果,按键状态为松开时,直接全部置零退出就行了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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