目录
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。
于是乎:这道题的模型被我们简化成:
扫描二维码关注公众号,回复:
10306563 查看本文章
(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】下载。