【蓝桥杯单片机的备赛旅行日记系列】之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控制流水方向,下图帖部分代码一看就懂系列不多废话。

【蓝桥杯单片机的备赛旅行日记系列】之LED流水灯_第1张图片
  
  
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次

于是有了下面的算法:

【蓝桥杯单片机的备赛旅行日记系列】之LED流水灯_第2张图片
两个for循环嵌套的结果是控制每次流水的P0的初始值。

  
  
  大功告成。完整源码移步至【我的github】下载。

你可能感兴趣的:(蓝桥杯单片机)