![]() |
發布時間: 2023-11-23 20:02
正文摘要:求助51單片機一個按鍵分別控制兩個LED燈閃爍C程序,一個按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長按一下LED2燈閃亮,再短按一下LED2滅,謝謝。 |
QDMLIT 發表于 2023-11-26 20:23 void display()//顯示函數 { static uint i=0; if(++i>=400) { i=0; flashing=~flashing; } |
您好,在這個程序上改變LED閃爍時間怎么修改程序,如點亮2S,滅2秒,謝謝 |
朋友謝謝您的辛苦付出 |
tyrl800 發表于 2023-11-24 20:58 謝謝您辛苦付出 |
QDMLIT 發表于 2023-11-24 19:16
|
QDMLIT 發表于 2023-11-24 19:16 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit Key =P3^7; uchar cnt,flashcnt; sbit led1=P1^0; sbit led2=P1^1; bit bit_10ms=0,flag1,flag2; uchar bdata flag_key_byte=0xff; sbit keyflag=flag_key_byte^0; sbit keyflag1=flag_key_byte^1; /**********************************************************/ uchar keyscan(void) {uchar kv=0; keyflag1=keyflag; keyflag=Key; switch(flag_key_byte&0x03) { case 0:cnt++;break; case 2:cnt++;break; case 1:if(cnt>30)kv=2; else if(cnt>5)kv=1; else kv=0; cnt=0; flag_key_byte=0xff; break; } return kv; } /**********************************************************/ void main() { uchar kv=0; TH0=(65536-20000)/256; TL0=(65536-20000)%256; TMOD=0X01; ET0=EA=TR0=1; while(1) { if(bit_10ms) {kv=keyscan(); bit_10ms=0; if(kv==1) {flag1=!flag1;} if(kv==2) {flag2=!flag2;} if(!flag1) led1=1; if(!flag2) led2=1; flashcnt++; if(flashcnt==10) { flashcnt=0; if(flag1) led1=!led1; if(flag2) led2=!led2; } } } } /**********************************************************/ void DelayInt() interrupt 1 {TH0=(65536-20000)/256; TL0=(65536-20000)%256; bit_10ms=1; } /**********************************************************/ |
tyrl800 發表于 2023-11-24 15:47 您好,您的程序我仿真后是按鍵短按下LED1點亮,再短按LED1滅,LED1并沒有閃爍,我這個實驗是按鍵分別控制兩個LED燈閃爍C程序,一個按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長按一下LED2燈閃亮,再短按一下LED2滅,謝謝。 |
QDMLIT 發表于 2023-11-24 12:47 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit Key =P3^7; uchar cnt,kv; sbit led1=P1^0; sbit led2=P1^1; bit bit_10ms=0; uchar bdata flag_key_byte=0xff; sbit keyflag=flag_key_byte^0; sbit keyflag1=flag_key_byte^1; /**********************************************************/ void keyscan(void) { keyflag1=keyflag; keyflag=Key; switch(flag_key_byte&0x03) { case 0:cnt++;break; case 2:cnt++;break; case 1:if(cnt>30)kv=2; else if(cnt>5)kv=1; else kv=0; cnt=0; flag_key_byte=0xff; break; } } /**********************************************************/ void main() { TH0=(65536-20000)/256; TL0=(65536-20000)%256; TMOD=0X01; ET0=EA=TR0=1; while(1) { if(bit_10ms) {keyscan(); bit_10ms=0; } if(kv==1) {led1=!led1;kv=0;} if(kv==2) {led2=!led2;kv=0;} } } /**********************************************************/ void DelayInt() interrupt 1 {TH0=(65536-20000)/256; TL0=(65536-20000)%256; bit_10ms=1; } /**********************************************************/ |
tyrl800 發表于 2023-11-24 09:06 我是個小白,這個程序不完整,麻煩補充一下子唄,謝謝 |
man1234567 發表于 2023-11-24 10:18 3種結果,0,1,2;1短,2長,0 無 |
做出以下三個變量: 1、閃動變量FL:在定時器中斷服務程序中,每0.4秒FL求反一次。 2、長按變量CA:界定出長按時,讓CA =1。 3、短按變量DA:界定出短按時,讓DA = !DA。 輸出這樣寫就可以達成目的了: LED1 = DA * FL LED2 = CA * FL * DA |
tyrl800 發表于 2023-11-24 09:06 怎么看switch(flag_key_byte&0x03)只會出一個結果呢 |
先做出:彈動、長按、短按 的識別方法! 要點:做一個計數器CJ來判定彈動、長按與短按,CJ的規則如下: 1、CJ計數只發生于定時器的中斷服務程序中,每次中斷+1,計滿不再計,即不回0。 2、CJ計數只發生于鍵按下的時候,未按下不計。 3、做一個鍵狀態判定觸發標記:B_OK,如果鍵未按下,但CJ<>0【彈起】,則置B_OK=1,表示是判斷鍵狀態的時候了。【彈起起效】 4、當B_OK=1,判斷鍵狀態的界定法則是:CJ<某個值為彈動;CJ<某個值為短按;CJ>某個值為長按,某個值是多少由你決定。建議事先將長短兩個界定值放置在某個寄存器中,這樣可以隨意變更界定值。 5、狀態界定完成后將:B_OK清0、CJ清0以備下次再界定。 |
如果LED1,2都亮的情況下再短按會如何? |
uchar bdata flag_key_byte=0xff; sbit keyflag=flag_key_byte^0; sbit keyflag1=flag_key_byte^1; /**********************************************************/ void keyscan(void) { keyflag1=keyflag; keyflag=Key; switch(flag_key_byte&0x03) { case 0:cnt++;break; case 2:cnt++;break; case 1:if(cnt>30)kv=2; else if(cnt>5)kv=1; else kv=0; cnt=0; flag_key_byte=0xff; break; } } /**********************************************************/ |
難倒了小白,我是沒有時間寫,你加上幾個標志就可以把完整的程序流程寫出來。 |