![]() |
為什么要把檢測按鈕狀態與燈的閃爍狀態放在一個順序邏輯上?外部中斷、定時器都可以作為檢測按鈕狀態來設置標志位,主程序執行燈閃爍與滅。條件滿足啥執行啥,中斷與定時器不影響主程序執行。 |
清冷蕭然 發表于 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; } |