标题:
单片机按键控制LED的实现 感谢各位大佬抽空回复
[打印本页]
作者:
79498
时间:
2020-7-24 11:04
标题:
单片机按键控制LED的实现 感谢各位大佬抽空回复
各位大佬,请教一个单片机问题,如一个按键按一次 控制一个LED常亮,并倒计时2分钟后熄灭,但是按键并未清零,下次想点亮LED的时候,还需要多按一次按键(相当于关闭), 我想问下怎么使下次点亮LED时候,只需要按一次点亮就行,是不是需要在定时器结束时候按键取反下,但是按键不是自锁式的,所以应该怎么实现呢?感谢各位大佬抽空回复
作者:
琪姐2020
时间:
2020-7-24 14:20
说一下我的思路哈。首先判断按下是否按下,按下之后产生一个LED标记。若是按键松手则复位按键。那么可以通过这个按下按键产生的LED标记去控制灯的亮灭,例如灯需要亮两分钟,那么在两分钟后将LED标记清0即可
作者:
robinsonlin
时间:
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++;
}
作者:
SKYLAR123
时间:
2020-7-24 17:22
你可以做个标志位,当按键再次按,下倒计时2分钟就清零关闭LED,不再进入倒计时2分钟,再次按下点亮并倒计时2分钟后熄灭
作者:
shuisheng
时间:
2020-7-24 19:00
@坛子,找一些案例来练练就什么都整明白了,不要整天的想这样想那样又不想自己动手敲代码,是学不了什么东东的
作者:
xxpp2011
时间:
2020-7-24 19:05
LED亮的条件加一个就好了,
按键按下且标志为1时LED亮2分钟同时标志置零,
按键按下且标志为0时LED不动,标志置一
作者:
lxbhcy
时间:
2020-7-28 11:45
弄个变量a=0,按一下按键,a+1;判断a值,灯亮倒计时,时间到了,a清0,灯灭
作者:
79498
时间:
2020-7-28 14:43
谢谢大家回复,这个问题已经通过标志位解决,谢谢大家提供思路
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1