![]() |
發布時間: 2023-10-29 08:42
正文摘要:我的問題就卡在K2按鍵可以進行模式加一這一步和K3的模式減一這一步,我不知道到這里我應該如何將我之前編好的那八個模式導進去,因為我把它們都封裝成函數,請大佬們給點提示,孩子真的寫不出來了。沒有任何思路 ... |
今天遇到一個有趣的32燈流水及按鍵復用,題主電路。![]() 我的電路。 ![]() |
changhz 發表于 2023-10-29 20:11 很不錯的想法,給我一種新思路了 |
lkc8210 發表于 2023-10-29 21:15 嗯嗯,明白了 |
wulin 發表于 2023-10-30 09:11 太厲害了,就是要這種效果,原來還可以這樣子實現 |
殿堂之上 發表于 2023-10-31 12:20 沒有用定時器,在主循環中用delayms(1);使主循環周期大約1ms,按鍵掃描10次消抖,j計數250ms,控制流水燈移動速度。 |
wulin 發表于 2023-10-30 09:11 1、主循環中的j是啥作用 2、按鍵中count為啥取10,是掃描10次消抖 3、沒用中斷,主循環時間長會丟鍵嗎 能說明下嗎,沒看明白,有點像用狀態機原理 |
深層次 發表于 2023-10-29 17:57 這就是一個花樣流水燈的程序,給你改好了。
|
深層次 發表于 2023-10-29 17:57 給你一個例子
|
程序修改可以了,不過效率太低了,要用定時器才行。 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit key0=P0^0; sbit key1=P0^1; sbit key2=P0^2; sbit key3=P0^3; uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移 uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED從高位往低位移 uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED從1個亮到8個都點亮(從低位往高位) uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點亮(從高位往低位) uchar code table4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED從8個全亮到一個都不亮(從低位往高位) uchar code table5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED從8個全亮到一個都不亮(從高位往低位) uchar code table6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED從低位往高位移(最低位始終為0) uchar code table7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED從高位往低位移(最高位始終為0) uchar keyflag=0;//按鍵標志位 void keyscan();//按鍵檢測函數 uchar i,j,a; void delayms(uint xms); void disp0() //狀態0 全亮 { P1=0x00; delayms(500); } void disp1() //狀態1 低位到高位依次亮 { P1=0xff; for(i=0;i<8;i++) { P1=table0[i]; delayms(500); } } void disp2() //狀態2 LED從高位到低位依次亮 { P1=0xff; for(i=0;i<8;i++) { P1=table1[i]; delayms(500); } } void disp3() // 狀態3 LED閃爍3次 { for(i=0;i<3;i++) { P1=0X00; delayms(500); P1=0xff; delayms(500); } } void disp4() //狀態4 LED自上而下逐漸點亮 { for(i=0;i<8;i++) { P1=table3[ i]; delayms(100); } P1=0xff; } void disp5() //狀態5 從LED全部亮到全不亮 { for(i=0;i<9;i++) { P1=table5[ i]; delayms(100); } delayms(300); } void disp6() //狀態6 逐步逆時針點亮P1的LED,熄滅 { P1=0xff; for(j=0;j<2;j++) { for(i=0;i<8;i++) { P1=table2[ i]; delayms(100); } P1=0xff; } } void disp7() //狀態7 全滅 { P1=0XFF; delayms(500); } void main() { while(1) { keyscan(); switch(keyflag) { case 1:disp0();break; case 2:disp1();break; case 3:disp2();break; case 4:disp3();break; case 5:disp4();break; case 6:disp5();break; case 7:disp6();break; case 8:disp7();break; } } } void delayms(uint xms) { uint i,j; for(i=0;i<xms;i++) for(j=0;j<120;j++); } void keyscan() { if((P0&0x0f)!=0x0f)//檢測有按鍵按下 { delayms(10);//延時去抖 if(key0==0)//key0按鍵按下 keyflag=1; if(key1==0 && keyflag<7)//key1按鍵按下 keyflag++;//設標志位2 if(key2==0 && keyflag>2)//key2按鍵按下 keyflag--;//設標志位3 if(key3==0)//key3按鍵按下 keyflag=8;//設標志位4 while(!key0); while(!key1); while(!key2); while(!key3); } } |
深層次 發表于 2023-10-29 17:57 用定時器延時 |
tyrl800 發表于 2023-10-29 17:28 那我應該怎么去寫比較好呢?這個的K2和K3思路是什么? |
你這個程序基本沒用,都死在子函數里了 |