从单片机基础到程序框架(全集 2019pdf版).pdf - 第560页
第一百零九节: 按键控制跑马灯的方向。 【109.1 按键控制跑马灯的方向。 】 上图 10 9.1.1 独立按键 上图 10 9.1.2 LED 电路 上图 10 9.1.3 有源蜂鸣器 的电路 之前 10 8 节讲到跑马灯的 启动、暂停、 停止 , 本节 在此基础上 , 增加 一个“方向” 的控 制, 除了 加深理 解输 入设 备 如何 关 联应 用 程序 的 程序 框 架之 外 ,还 有 一个 知 识点 值 得一 提 ,就 是 如…

P1_5=1; //第 2 个灯灭
P1_6=1; //第 3 个灯灭
P3_3=0; //第 4 个灯亮
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=RUN_TIME; //用于控制跑马灯跑动速度的定时器
vGu8RunTimerFlag=1; //启动定时器
Su8RunStep=1; //返回到第 1 步,重新开始下一轮的循环!!!
}
break;
}
}

第一百零九节: 按键控制跑马灯的方向。
【109.1 按键控制跑马灯的方向。】
上图 109.1.1 独立按键
上图 109.1.2 LED 电路
上图 109.1.3 有源蜂鸣器的电路
之前 108 节讲到跑马灯的启动、暂停、停止,本节在此基础上,增加一个“方向”的控制,除了加深理
解输入设备如何关联应用程序的程序框架之外,还有一个知识点值得一提,就是如何通过灵活切换 switch
的“步骤变量”来达到随心所欲的过程控制,本节的“方向”的控制就用到这个方法。
本节例程的功能如下:

(1)【启动暂停】按键 K1。按下【启动暂停】按键 K1 启动之后,跑马灯处于“启动”状态,4 个 LED
灯挨个依次循环的变亮,给人“跑”起来的感觉。此时如果再按一次【启动暂停】按键 K1,则跑马灯处于“暂
停”状态,如果再按一次【启动暂停】按键 K1,跑马灯又变回“启动”状态。因此,【启动暂停】按键 K1
是专门用来切换“启动”和“暂停”这两种状态。
(2)【停止】按键 K2。当跑马灯处于“启动”或者“暂停”或者“停止”的状态时,只要按下【停止】
按键 K2,当前的运动状态就终止,强制变回初始的“停止”状态,类似“复位”按键的作用。当跑马灯处于
“停止”状态时,此时再按下【启动暂停】按键 K1 之后,跑马灯又处于“启动”状态。
(3)【方向】按键 K3。跑马灯上电后默认处于“往右跑”的方向。每按一次【方向】按键 K3,跑马灯
就在“往右跑”与“往左跑”两个方向之间切换。
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_FILTER_TIME 25
#define RUN_TIME 200 //跑马灯的跑动速度的时间参数
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void BeepOpen(void);
void BeepClose(void);
void VoiceScan(void);
void KeyScan(void);
void KeyTask(void);
void RunTask(void); //跑马灯的任务函数
//4 个跑马灯的输出口
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P3_3=P3^3;
//蜂鸣器的输出口
sbit P3_4=P3^4;
sbit KEY_INPUT1=P2^2; //【启动暂停】按键 K1 的输入口。
sbit KEY_INPUT2=P2^1; //【停止】按键 K2 的输入口。
sbit KEY_INPUT3=P2^0; //【方向】按键 K3 的输入口。
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;