今天遇到一个有趣的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思路是什么? |
你这个程序基本没用,都死在子函数里了 |