| 为什么要把检测按钮状态与灯的闪烁状态放在一个顺序逻辑上?外部中断、定时器都可以作为检测按钮状态来设置标志位,主程序执行灯闪烁与灭。条件满足啥执行啥,中断与定时器不影响主程序执行。 |
清冷萧然 发表于 2021-4-11 10:30 用for语句,执行不了其他动作,cpu的利用率会大大降低。 |
| LED取反也可以(不管它具体状态),或者直接设定LED=0 |
| 不是led=!led么,然后灭就是led为0么 |
|
#include <reg51.h> sbit key=P1^0; sbit LED=P1^1; bit flag; unsigned char num; void InitTimer0(void)//50ms@12MHz { TMOD = 0x01; TH0 = 0x3C; TL0 = 0xB0; EA = 1; ET0 = 1; TR0 = 1; } void main(void) { InitTimer0(); while(1) { if(!key)flag=1; else flag=0; } } void Timer0Interrupt(void) interrupt 1 { TH0 = 0x3C; TL0 = 0xB0; if(flag) { num++; if(num>=2) { num=0; LED=~LED;//低电平亮,闪烁频率5Hz } } else { num=0; LED=1; } } |
xjx51 发表于 2021-4-11 01:13 按照你这样确实可以实现,按住亮松开灭;可能我没有描述清楚,我的意思按住触摸按键,for语句一直运行LED闪烁,突然松开按键,LED灭;待再次按触摸按键,LED开始闪烁,松开LED即灭。 |
|
这里将K1用作触摸按键,1为松开,0为按下。LED作为灯 代码:if(K1 == 0) { LED=1; DELAY(3000);//延时 LED=0; DELAY(3000);//延时 } else { LED=1; } |