目錄
1、前言
2、循環位移的優缺點
3、改進策略
4、一個花樣流水燈的實現
1、前言
話說這單片機點燈就像編程跑Hello World,流水燈就像循環式的Hello world,那這哈嘍沃德這麼簡單大家都會跑,就不贅述了,今天說說在CT107D上“循環跑Hello World”吧。
今天的任務目錄說的很清楚了,幹吧。
2、循環位移的優缺點
我敢說,你跑的第一個流水燈一定是用循環位移實現的,就像這樣:
P2=0x80;P0=0x7f;
Delay1000ms();
while(1)
{
for(i=0;i<7;i++)
{
P0=_cror_(P0,1);
Delay1000ms();
}
for(i=0;i<7;i++)
{
P0=_crol_(P0,1);
Delay1000ms();
}
}
確實是這樣,優點很明顯,簡單易懂,很大衆;至於缺點,讀完藍橋杯第三屆初賽題就顯而易見了:由於for循環脾氣比較倔,它不跑完一圈不會停,所以導致流水方向不可控。
於是有了下面的改進。
3、改進策略
通過獨立按鍵模式下S4控制流水方向,下圖帖部分代碼一看就懂系列不多廢話。
4、一個花樣流水燈的實現
熱完身了,請出今天的主角吧,問題描述:
(1).第一次循環爲L1-L8流水
(2).第二次循環爲L1L2-L2L3-...-L7L8流水
(3).第三次循環爲L1L2L3-L2L3L4-...-L6L7L8流水
...以此類推
思路:
①:縱觀整個實現流程,共有八次循環(mode從0-7),第N次循環共有N個燈被點亮;
②:並且第N次循環中,需要位移的次數(times)爲7-mode。
於是乎:這道題的模型被我們簡化成:
(1).第一次循環
1111 1110->1111 1101->1111 1011......
(2).第二次循環
1111 1100->1111 1001->1111 0011......
(3).......
發現規律沒,第N次循環就把N個LED綁在一起移動,也就是說
拿第二次流水舉例,和第一次不同的點在於:
1.初始值不一樣,第一次初始值是~(0x01) ,第二次是~(0x01|0x02);以此類推
2.循環次數不一樣,第一次(mode=0時)移位7次,第二次(mode=1時)移位6次,第N次(mode=N-1)移位7-mode次
於是有了下面的算法:
兩個for循環嵌套的結果是控制每次流水的P0的初始值。
大功告成。完整源碼移步至【我的github】下載。