P1开关控制低四位流水灯,速度有点快自己调,有备注。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define led P1 //可以改为其他口
- void delay(int x);
- void left(int x);
- void right(int x);
- void flash1(int x);
- void flash2(int x);
- void delay(int x) //延迟函数1ms(大概)
- {int i;
- while(x)
- {
- for(i=0;i<125;i++);
- x--;
- }
- }
- void left(int x) //从P1^3到P1^0(我叫它左移)
- {int i,j;
- while(x)
- {for(i=0;i<3;i++) // 循环3遍
- {led=0xfe;
- delay(50); //每个灯亮50ms
- for(j=0;j<3;j++) //一共四位
- {
- led=led<<1|0xf1;
- delay(50);
- }
- }
- x--;
- }
- }
- void right(int x) //从最低位的最高位(我叫它右移)
- {int i,j;
- while(x) //其他同左移
- {for(i=0;i<3;i++)
- { led=0xf7;
- delay(50);
- for(j=0;j<3;j++)
- {
- led=led>>1|0xf8;
- delay(50);
- }
- }
- x--;
- }
- }
- void flash1(int x) //四位全闪 (可以改很多种)
- {int i;
- while(x)
- {led=0xf0;
- delay(100); //一次亮100ms
- for(i=0;i<1;i++) //可以改循环次数
- {
- led=~led|0xf0; //屏蔽高四位
- delay(100);
- }
- x--;
- }
- }
- void flash2(int x) //隔一位闪烁(全闪改)
- {int i;
- while(x) //基本和全闪一样
- {led=0xf5;
- delay(100);
- for(i=0;i<1;i++)
- {
- led=~led|0xf0;
- delay(100);
- }
- x--;
- }
- }
- main()
- {while(1)
- {led=0xff;
- switch(led) //在灯全灭的情况下,多个按键同时按下时不会动作;
- {case 0xef :{left(2);}break; //按下P1^4,执行左移,可以修改循环次数
- case 0xdf :{right(2);}break; //按下P1^5,执行右移
- case 0xbf :{flash1(2);}break;//按下P1^6,执行全闪
- case 0x7f :{flash2(2);}break;//按下P1^7,执行全闪改
- default:{led=0xff;}
- }
- }
- }
复制代码- #include<reg51.h>
- #define led P1 //可以改为其他口
- void delay(int x);
- void left(int x);
- void right(int x);
- void flash1(int x);
- void flash2(int x);
- void delay(int x) //延迟函数1ms(大概)
- {int i;
- while(x)
- {
- for(i=0;i<125;i++);
- x--;
- }
- }
- void left(int x) //从P1^3到P1^0(我叫它左移)
- {int i,j;
- while(x)
- {for(i=0;i<3;i++) // 循环3遍
- {led=0xfe;
- delay(50); //每个灯亮50ms
- for(j=0;j<3;j++) //一共四位
- {
- led=led<<1|0xf1;
- delay(50);
- }
- }
- x--;
- }
- }
- void right(int x) //从最低位的最高位(我叫它右移)
- {int i,j;
- while(x) //其他同左移
- {for(i=0;i<3;i++)
- { led=0xf7;
- delay(50);
- for(j=0;j<3;j++)
- {
- led=led>>1|0xf8;
- delay(50);
- }
- }
- x--;
- }
- }
- void flash1(int x) //四位全闪 (可以改很多种)
- {int i;
- while(x)
- {led=0xf0;
- delay(100); //一次亮100ms
- for(i=0;i<1;i++) //可以改循环次数
- {
- led=~led|0xf0; //屏蔽高四位
- delay(100);
- }
- x--;
- }
- }
- void flash2(int x) //隔一位闪烁(全闪改)
- {int i;
- while(x) //基本和全闪一样
- {led=0xf5;
- delay(100);
- for(i=0;i<1;i++)
- {
- led=~led|0xf0;
- delay(100);
- }
- x--;
- }
- }
- main()
- {while(1)
- {led=0xff; //在灯全灭的情况下,多个按键同时按下时不会动作;
- if(led==0xef) //按下P1^4,执行左移,可以修改循环次数 ;
- {left(2);}
- else if(led==0xdf) //按下P1^5,执行右移
- {right(2);}
- else if(led==0xbf) //按下P1^6,执行全闪
- {flash1(2);}
- else if(led==0x7f) //按下P1^7,执行全闪改
- {flash2(2);}
- }
- }
复制代码
所有资料51hei提供下载:
开关控制低四位流水灯.zip
(74.82 KB, 下载次数: 10)
|