熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2023-11-23 20:02
正文摘要:求助51單片機(jī)一個(gè)按鍵分別控制兩個(gè)LED燈閃爍C程序,一個(gè)按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長(zhǎng)按一下LED2燈閃亮,再短按一下LED2滅,謝謝。 |
QDMLIT 發(fā)表于 2023-11-26 20:23 void display()//顯示函數(shù) { static uint i=0; if(++i>=400) { i=0; flashing=~flashing; } |
您好,在這個(gè)程序上改變LED閃爍時(shí)間怎么修改程序,如點(diǎn)亮2S,滅2秒,謝謝 |
朋友謝謝您的辛苦付出 |
tyrl800 發(fā)表于 2023-11-24 20:58 謝謝您辛苦付出 |
QDMLIT 發(fā)表于 2023-11-24 19:16
|
QDMLIT 發(fā)表于 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 發(fā)表于 2023-11-24 15:47 您好,您的程序我仿真后是按鍵短按下LED1點(diǎn)亮,再短按LED1滅,LED1并沒有閃爍,我這個(gè)實(shí)驗(yàn)是按鍵分別控制兩個(gè)LED燈閃爍C程序,一個(gè)按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長(zhǎng)按一下LED2燈閃亮,再短按一下LED2滅,謝謝。 |
QDMLIT 發(fā)表于 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 發(fā)表于 2023-11-24 09:06 我是個(gè)小白,這個(gè)程序不完整,麻煩補(bǔ)充一下子唄,謝謝 |
man1234567 發(fā)表于 2023-11-24 10:18 3種結(jié)果,0,1,2;1短,2長(zhǎng),0 無 |
做出以下三個(gè)變量: 1、閃動(dòng)變量FL:在定時(shí)器中斷服務(wù)程序中,每0.4秒FL求反一次。 2、長(zhǎng)按變量CA:界定出長(zhǎng)按時(shí),讓CA =1。 3、短按變量DA:界定出短按時(shí),讓DA = !DA。 輸出這樣寫就可以達(dá)成目的了: LED1 = DA * FL LED2 = CA * FL * DA |
tyrl800 發(fā)表于 2023-11-24 09:06 怎么看switch(flag_key_byte&0x03)只會(huì)出一個(gè)結(jié)果呢 |
先做出:彈動(dòng)、長(zhǎng)按、短按 的識(shí)別方法! 要點(diǎn):做一個(gè)計(jì)數(shù)器CJ來判定彈動(dòng)、長(zhǎng)按與短按,CJ的規(guī)則如下: 1、CJ計(jì)數(shù)只發(fā)生于定時(shí)器的中斷服務(wù)程序中,每次中斷+1,計(jì)滿不再計(jì),即不回0。 2、CJ計(jì)數(shù)只發(fā)生于鍵按下的時(shí)候,未按下不計(jì)。 3、做一個(gè)鍵狀態(tài)判定觸發(fā)標(biāo)記:B_OK,如果鍵未按下,但CJ<>0【彈起】,則置B_OK=1,表示是判斷鍵狀態(tài)的時(shí)候了。【彈起起效】 4、當(dāng)B_OK=1,判斷鍵狀態(tài)的界定法則是:CJ<某個(gè)值為彈動(dòng);CJ<某個(gè)值為短按;CJ>某個(gè)值為長(zhǎng)按,某個(gè)值是多少由你決定。建議事先將長(zhǎng)短兩個(gè)界定值放置在某個(gè)寄存器中,這樣可以隨意變更界定值。 5、狀態(tài)界定完成后將:B_OK清0、CJ清0以備下次再界定。 |
如果LED1,2都亮的情況下再短按會(huì)如何? |
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; } } /**********************************************************/ |
難倒了小白,我是沒有時(shí)間寫,你加上幾個(gè)標(biāo)志就可以把完整的程序流程寫出來。 |
Powered by 單片機(jī)教程網(wǎng)