从单片机基础到程序框架(全集 2019pdf版).pdf - 第561页

(1 ) 【 启 动暂 停 】按 键 K 1。 按 下【 启 动暂 停 】按 键 K1 启动 之 后, 跑 马灯 处 于“ 启动 ” 状态 , 4 个 LED 灯挨个依 次循环的变亮, 给人 “跑” 起来的感 觉。 此时如果再按一 次 【启动暂停】 按键 K 1, 则跑 马灯处于 “暂 停” 状 态 ,如 果 再 按 一 次 【 启动 暂 停 】 按 键 K 1, 跑 马灯 又 变 回 “ 启 动 ” 状 态 。因 此 , 【 启动 暂…

100%1 / 836
第一百零九节: 按键控制跑马灯的方向。
【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;
volatile unsigned char vGu8KeySec=0;
unsigned char Gu8RunStart=0; //控制跑马灯启动的总开关
unsigned char Gu8RunStatus=0; //标识跑马灯当前的状态。0 代表停止,1 代表启动,2 代表暂停。
unsigned char Gu8RunDirection=0; //标识跑马灯当前的方向。0 代表往右跑,1 代表往左跑。
volatile unsigned char vGu8RunTimerFlag=0; //用于控制跑马灯跑动速度的定时器
volatile unsigned int vGu16RunTimerCnt=0;
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
KeyTask(); //按键的任务函数
RunTask(); //跑马灯的任务函数
}
}
void T0_time() interrupt 1
{
VoiceScan();
KeyScan();
if(1==vGu8RunTimerFlag&&vGu16RunTimerCnt>0) //用于控制跑马灯跑动速度的定时
{
vGu16RunTimerCnt--;
}
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;