大家好,新手小白。分享先前尝试用51做的按键控制流水灯花样,有六个按键,分别实现单个灯的亮灭、从上往下流动、从下往上流动、全闪、全灭、暂停六种功能。已经成功仿真,有时候不太灵敏需要多按几下,附源码源程序。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- sbit LED1=P2^0;
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit K5=P1^4;
- sbit K6=P1^5;
- unsigned char keyval,num=0;
- int i,j,n;
- void delay_ms(int n)
- {
- for(i=0;i<n;i++)
- for(j=0;j<120;j++);}
-
- void forward() //从上往下流动
- {
- P2=0xfd;
- delay_ms(150);
- P2=0xfb;
- delay_ms(150);
- P2=0xf7;
- delay_ms(150);}
- void backward() //从下往上流动
- {
- P2=0xf7;
- delay_ms(150);
- P2=0xfb;
- delay_ms(150);
- P2=0xfd;
- delay_ms(150);}
- void blink() //全闪
- {
- P2=0xff;
- delay_ms(100);
- P2=0x00;
- delay_ms(100); }
- void key_scan()
- {
- P1=0xff;
- if((P1&0x3f)!=0x3f)
- {
- delay_ms(100);
- if(K1==0)
- {keyval=1;num=(num+1)%2;}
- if(K2==0)
- keyval=2;
- if(K3==0)
- keyval=3;
- if(K4==0)
- keyval=4;
- if(K5==0)
- keyval=5;
- if(K6==0)
- keyval=6;}
- while((P1&0x3f)!=0x3f);}
-
- void main()
- {
- keyval=0;
- while(1)
- {
- key_scan();
- switch(keyval)
- {
- case 1 :LED1=!num;break; //按一下亮按一下灭
- case 2 :forward();break;
- case 3 :backward();break;
- case 4 :blink();break;
- case 5 :P2=0xff;break; //全灭
- case 6 :while(keyval!=6);break;}}} //暂停
复制代码
Keil代码与Proteus仿真下载:
按键控制流水灯花样.zip
(70.76 KB, 下载次数: 48)
|