找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2234|回复: 7
打印 上一主题 下一主题
收起左侧

单片机按键控制LED的实现 感谢各位大佬抽空回复

[复制链接]
跳转到指定楼层
楼主
ID:685954 发表于 2020-7-24 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬,请教一个单片机问题,如一个按键按一次   控制一个LED常亮,并倒计时2分钟后熄灭,但是按键并未清零,下次想点亮LED的时候,还需要多按一次按键(相当于关闭), 我想问下怎么使下次点亮LED时候,只需要按一次点亮就行,是不是需要在定时器结束时候按键取反下,但是按键不是自锁式的,所以应该怎么实现呢?感谢各位大佬抽空回复
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:739325 发表于 2020-7-24 14:20 | 只看该作者
说一下我的思路哈。首先判断按下是否按下,按下之后产生一个LED标记。若是按键松手则复位按键。那么可以通过这个按下按键产生的LED标记去控制灯的亮灭,例如灯需要亮两分钟,那么在两分钟后将LED标记清0即可
回复

使用道具 举报

板凳
ID:451718 发表于 2020-7-24 14:52 | 只看该作者
本帖最后由 robinsonlin 于 2020-7-24 15:18 编辑

#define K1                    P37
#define LED                    P36

unsigned long SysTick;
unsigned char KFlag;

void Delay10ms()                //@22.1184MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 216;
        k = 35;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Timer0Init(void)                //1毫秒@22.1184MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x9A;                //设置定时初值
        TH0 = 0xA9;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

void main()
{
    K1 = 1;
    LED = 0;
    KFlag = 1;      Timer0Init() ;
   EA = 1;

    while(1)
    {
         if(K1==0 && KFlag==1)
         {
             Delay10ms();
             if(K1==0 && KFlag==1)
             {
                 T1 = SysTick;
                 KFlag = 0;
                 //LFlag = 1;
                 LED = 1;
             }
         }

         if(K1==0 && LED==1)
         {
             Delay10ms();
             if(K1==0 && LED==1)
             {            
                 LFlag = 0;
                 LED = 0;
             }
         }

         if((SysTick-T1)>=120000 && LED==1)
         {
             LED = 0;
             LFlag = 0;
         }
    }
}


void tm0_isr() interrupt 1         //中断入口
{
        SysTick++;
}


回复

使用道具 举报

地板
ID:636538 发表于 2020-7-24 17:22 | 只看该作者
你可以做个标志位,当按键再次按,下倒计时2分钟就清零关闭LED,不再进入倒计时2分钟,再次按下点亮并倒计时2分钟后熄灭
回复

使用道具 举报

5#
ID:454000 发表于 2020-7-24 19:00 | 只看该作者
@坛子,找一些案例来练练就什么都整明白了,不要整天的想这样想那样又不想自己动手敲代码,是学不了什么东东的
回复

使用道具 举报

6#
ID:452950 发表于 2020-7-24 19:05 | 只看该作者
LED亮的条件加一个就好了,
按键按下且标志为1时LED亮2分钟同时标志置零,
按键按下且标志为0时LED不动,标志置一
回复

使用道具 举报

7#
ID:808700 发表于 2020-7-28 11:45 | 只看该作者
弄个变量a=0,按一下按键,a+1;判断a值,灯亮倒计时,时间到了,a清0,灯灭
回复

使用道具 举报

8#
ID:685954 发表于 2020-7-28 14:43 | 只看该作者
谢谢大家回复,这个问题已经通过标志位解决,谢谢大家提供思路
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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