
2.4 任务4:有规律变化的花样灯——高/低4位交替闪烁

2.4.1 任务要求与分析
1.任务要求
8个LED,高4位的LED与低4位的LED交替闪烁。假设初始状态为高4位的LED灭,低4位的LED亮。
2.任务目标

(1)掌握先分解后主线串联的问题分析方法。
(2)学习现象分析并用表达式表示。
(3)掌握goto语句应用。
(4)灵活应用位运算符及移位函数。
3.任务分析
硬件电路如图2-9所示。P1口控制8个LED。根据亮灯逻辑,引脚电平为高,LED灭;引脚电平为低,LED亮。显示状态只有两种,见表2-11。显然,两种状态的数据正好相反,由状态1到状态2,只要数据按位取反或高/低4位数据互换位置即可。
表2-11 高/低4位交替闪烁的状态

2.4.2 流程与程序设计
高/低4位LED交替闪烁的程序流程图如图2-24所示。

图2-24 高/低4位LED交替闪烁的程序流程图

2.4.3 编译、代码下载、仿真、测判
按第1章所述方法,先在Keil中新建工程LED24,然后添加源程序、设置工程选项并编译,生成代码文件LED24.HEX。参考2.1.7节下载代码,设置振荡频率为12MHz,进行仿真调试。
将代码下载到实物板进行测试。实践记录:是否成功?__________。自评分:__________。
2.4.4 进阶设计与思路点拨4:用“>>”“<<”实现两个亮点相向和相背运动


1.任务要求
(1)8个LED,最高位和最低位的两个亮点(LED)相向运动,相邻时重新循环;
(2)8个LED,中间两个亮点相背运动,到两端后重新循环。
2.任务目标
(1)掌握先分解后主线串联的问题分析方法。
(2)分析现象并推理数据变化规律的表达式。
(3)举一反三,灵活应用“>>”“<<”及位的逻辑运算符。
3.亮点相向任务分析
硬件电路如图2-9所示。P1口控制8个LED。根据亮灯逻辑,引脚电平为高,LED灭;引脚电平为低,LED亮。显示状态只有4种,见表2-12:高4位中为“0”的位逐位向右移;低4位中为“0”的位逐位向左移;移位三次后,从初始化开始重新进入下一个循环。因需要移位移入的都是1,即右移时进入最高位的是1,左移时进入最低位的也是1。所以若用移位运算符,则右移时,最高位与1相或;左移时,最低位与1相或。数据处理步骤如下:
表2-12 用移位运算符实现两个亮点相向运动的数据变化规律推演

(1)对上一状态数据,右移1位,最高位“或”1,得高4位的过程数据;左移1位,最低位“或”1,得低4位的过程数据。
(2)在(1)的基础上,高4位的过程数据&0xF0屏蔽低4位,低4位的过程数据&0x0F屏蔽高4位。
(3)高、低4位的过程数据相或合并为1字节。
编程思路如下,设输出数据初始值状态1为01111110B(十六进制数为0x7E),状态2数据为10111101B,数据变化分析见表2-13。
表2-13 由状态1到状态2的数据变化分析

用移位运算符实现两个亮点相向运动的数据变化规律推演,即四个状态的数据变化见表2-12。请自行写出状态3、状态4的表达式。
4.亮点相向任务实现
根据以上分析,参考图2-25,编程、调试,直到成功。
注意:4个状态依次显示后,重新开始下一个循环。可设置一变量记录显示状态,状态4过后,要复位回到状态1。
根据图2-25把下面程序补充完整。

图2-25 亮点相向运动的程序流程图

5.两个亮点相背运动
可参考表2-12把数据变化规律分析清楚,先完成表2-14。
表2-14 用移位运算符实现两个亮点相背运动的数据变化规律推演

程序流程参考图2-25,注意数据初始化及数据处理的不同。程序参考本节“4.亮点相向任务实现”。
请自行分析、设计,并进行仿真调试。
2.4.5 进阶设计与思路点拨5:用移位函数实现两个亮点相向运动

1.思路点拨
_crol_()、_cror()是8位数封闭循环移动。考虑设置两个变量分别实现高/低4位数据规律演化。设代表高4位数据的初始值为01111111B,代表低4位数据的初始值为11111110B,这两个数据经移位函数后分别得到高、低4位数,见表2-15。
表2-15 用移位函数实现两个亮点相向运动的数据变化规律推演

高、低4位的演化数据再相“或”便可得到每个状态的数据,如由状态1到状态2,具体见表2-16。
表2-16 用移位函数实现两个亮点相向运动的数据变化规律推演

2.程序设计与调试
根据以上分析,参考图2-24画出程序流程图、编程、调试,直到成功。
注意:4个状态依次显示后,重新开始下一循环。可设置一变量记录显示状态,状态4过后,要复位回到状态1。
2.4.6 进阶设计与思路点拨6:用移位函数实现两个亮点相背运动
在理解2.4.5节的基础上,参考表2-15、表2-16,填写表2-17,并完成程序设计与调试。
表2-17 用移位函数实现两个亮点相背运动的数据变化规律推演
