【藍橋杯單片機的備賽旅行日記系列】之LED流水燈

目錄

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】下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章