简易花式流水灯
先看看效果
具體思路
??實現流水燈的效果其實就是控制相應的I/O口,以P2為例,通過有規律的改變P2各I/O口的狀態就可實現相應規律的流水燈效果,這其中需要用到與、或、異或、左移、右移等操作。
 ??流水燈向左閃爍點亮就是將P2最低位的1不斷左移,每次左移其最低位都補0且延時一段時間,所以在初始時P2可賦值0x01。
 ??流水燈向右閃爍點亮就是將P2最高位的1不斷右移,每次右移其最高位都補0且延時一段時間,所以在初始時P2可賦值0x80。
 ??流水燈逐個向左點亮是說在初始時,P2賦值為0x01,并將P2整體左移,每移動一次就將最低為置為1且延時一段時間。
 ??流水燈逐個向右點亮是說在初始時,P2賦值為0x80,并將P2整體右移,每移動一次就將最高為置為1且延時一段時間。
 ??流水燈兩端向內點亮是結合了逐個向左和逐個向右點亮的思想,P2 低4位 逐個向左點亮, 高4位逐個向右點亮。
 ??流水燈由內向兩端熄滅同樣是結合了逐個向左和逐個向右點亮的思想,P2 低4位逐個向右熄滅,高4位逐個向左熄滅。
 ??流水燈以兩個燈為主體向左移動點亮其本質也就是一個燈向左移動點亮。
程序
#include <reg51.h>#define Led P2unsigned int time=0; //延時時長變量void InitTimer0(void) //10ms {TMOD = 0x01; //定時器模式1//賦值TH0 = 0xDC;TL0 = 0x00;EA = 1; //開總中斷ET0 = 1; //開定時器0中斷 }void delay(unsigned int ms_10) //延時函數 {time=ms_10; //給time賦予具體延時時間的數值TR0 = 1; //打開定時器0while(time); //等待延時結束TR0 = 0; //關閉定時器0 }void light_water() //流水燈函數 {int i=0,Led_H=0,Led_L=0,temp=0x06,num=0; //Led_H存儲P2高8位Led_L存儲P2低8位Led=0x01;delay(10);//100msfor(;i < 7;i++) //單個左移{Led=Led<<1; //P2數值左移delay(10);//100ms }for(i=0;i < 7;i++) //單個右移{Led=Led>>1; //P2數值右移delay(10);//100ms }for(i=0;i < 7;i++) //依次向左點亮{Led=Led<<1|0x01; //P2數值左移并將最低位置為1delay(10);//100ms }for(i=0;i < 7;i++) //依次向右點亮{Led=Led>>1; //P2數值右移,依次將位1清零delay(10);//100ms }Led=0x00;for(i=0;i < 7;i++) //兩端向內依次點亮{Led_L=Led<<1|0x01&0x0f; //取出P2的低4位,并將其左移最低位置1Led_H=((Led&0xf0)>>1)^0x80; //取出P2的高4位,并將其右移最高位置1Led=Led|Led_L; //將低4位賦予P2Led=Led|Led_H; //將高4位賦予P2delay(10);//100ms }for(i=0;i < 7;i++) //由內向兩端依次點亮{Led_L=(Led&0x0f)>>1; //取P2低4位并右移Led_H=(Led&0xf0)<<1; //取P2高4位并左移Led=Led&Led_L; //將低4位賦予P2Led=Led^Led_H; //將高4位賦予P2delay(10);//100ms }Led=0x00;for(i=0;i < 10;i++) //依次向左點亮2個燈{num=Led<<1|0x01; //P2數值左移并最低位置1if(num>=0x06) //第2、3個燈亮后,以2個燈為主體向左移動{Led=num&temp;temp=temp<<1; }else Led=num;delay(7);//100ms }Led=0x00;temp=0xc0;for(i=0;i < 10;i++) //依次向右點亮2個燈{num=Led>>1|0x80; //將P2數值右移并最高位置1if(num>=temp) //第6、7個燈亮時以兩個燈為整體向右移動{Led=num&temp;temp=temp>>1;}elseLed=num;delay(7);//100ms } }void main(void) {InitTimer0(); //定時器初始化while(1){light_water();} }void Timer0Interrupt(void) interrupt 1 {TH0 = 0xDC;TL0 = 0x00;time--;if(time < 0){time = 0; //time為0時不在減} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
                            
                        - 上一篇: 二叉树的前序、中序、后续、层序遍历(包含
 - 下一篇: Run Length Encoding