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

volatile u nsigned c har vGu8KeyS ec=0; unsigned c har Gu8Ru nStart=0; //控制 跑马灯启动的 总开关 unsigned c har Gu8Ru nStatus=0; //标识 跑马灯当前的 状态。0 代表 停止,1 代表启动, 2 代表暂停。 unsigned c har Gu8Ru nDirection=0 ; //标识跑马灯 当前的方向。0 代表往右跑,1 代表…

100%1 / 836
LED 灯挨个依次循环的变亮给人“跑”起来的感觉。此时如果再按一次【启动暂停】按键 K1则跑马灯
处于“暂停”状态,如果再按一次【启动暂停】按键 K1,跑马灯又变回“启动”状态。因此【启动暂停
按键 K1 是专门用来切换“启动”和“暂停”这两种状态。
(2)【速度】按键 K2。每按一次【速度】按键 K2,跑马灯就在“慢”“中”“快”三档速度之间切换。
(3)【方向】按键 K3。跑马灯上电后默认处于“往右跑”的方向。每按一次【方向】按键 K3,跑马灯
就在“往右跑”与“往左跑”两个方向之间切换
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_FILTER_TIME 25
#define RUN_TIME_SLOW 500 //“慢”档速度的时间参数
#define RUN_TIME_MIDDLE 300 //“中”档速度的时间参数
#define RUN_TIME_FAST 100 //“快”档速度的时间参数
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 代表往左跑。
unsigned char Gu8RunSpeed=0; //当前的速度档位。0 表“慢”,1 代表“中”,2 代表“快
unsigned int Gu16RunSpeedTimeDate=0; //承接各速度档位的时间参数的变
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;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
//跑马灯处于初始化的状态
P1_4=0; //第 1 个灯
P1_5=1; //第 2 个灯
P1_6=1; //第 3 个灯
P3_3=1; //第 4 个灯
//根据当前的速度档 Gu8RunSpeed,来初始化速度时间参数 Gu16RunSpeedTimeDate
if(0==Gu8RunSpeed)
{
Gu16RunSpeedTimeDate=RUN_TIME_SLOW; //赋值“慢”档的时间参数
}
else if(1==Gu8RunSpeed)
{
Gu16RunSpeedTimeDate=RUN_TIME_MIDDLE; //赋值“中”档的时间参数
}
else
{
Gu16RunSpeedTimeDate=RUN_TIME_FAST; //赋值“快”档的时间参数
}
}
void BeepOpen(void)
{
P3_4=0;
}
void BeepClose(void)
{
P3_4=1;
}