从单片机基础到程序框架(全集 2019pdf版).pdf - 第729页
0x6f, //9 序号 9 0x00, //不显 示 序号 10 0x40, //横杠- 序号 11 0x38, //字符 L 序号 12 0x70, //字符 r 序号 13 }; volatile u nsigned c har vGu8Scan TimerFlag =0; volatile u nsigned i nt vGu16ScanTi merCnt=0; volatile u nsigned c har vGu8Beep…

void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void KeyScan(void);
void KeyTask(void);
void RunTask(void); //跑马灯的任务函数
void VoiceScan(void);
void DisplayScan(void);
void DisplayTask(void);
void Wd1(void); //窗口 1。
void BeepOpen(void);
void BeepClose(void);
sbit KEY_INPUT1=P2^2;
sbit KEY_INPUT2=P2^1;
sbit KEY_INPUT3=P2^0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P3_4=P3^4;
//4 个跑马灯的输出口
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P3_3=P3^3;
//数码管转换表
code unsigned char Cu8DigTable[]=
{
0x3f, //0 序号 0
0x06, //1 序号 1
0x5b, //2 序号 2
0x4f, //3 序号 3
0x66, //4 序号 4
0x6d, //5 序号 5
0x7d, //6 序号 6
0x07, //7 序号 7
0x7f, //8 序号 8

0x6f, //9 序号 9
0x00, //不显示 序号 10
0x40, //横杠- 序号 11
0x38, //字符 L 序号 12
0x70, //字符 r 序号 13
};
volatile unsigned char vGu8ScanTimerFlag=0;
volatile unsigned int vGu16ScanTimerCnt=0;
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
unsigned char Gu8Wd=0; //窗口选择变量。人机交互程序框架的支点。
unsigned char Gu8WdUpdate=0; //整屏更新变量。
unsigned char Gu8PartUpdate_1=0; //局部 1 的更新变量,
unsigned char Gu8PartUpdate_2=0; //局部 2 的更新变量
unsigned char Gu8PartUpdate_3=0; //局部 3 的更新变量,
volatile unsigned char vGu8Display_Righ_4=0;
volatile unsigned char vGu8Display_Righ_3=0;
volatile unsigned char vGu8Display_Righ_2=0;
volatile unsigned char vGu8Display_Righ_1=0;
volatile unsigned char vGu8Display_Righ_Dot_4=1; //需要显示的小数点
volatile unsigned char vGu8Display_Righ_Dot_3=1; //需要显示的小数点
volatile unsigned char vGu8Display_Righ_Dot_2=0;
volatile unsigned char vGu8Display_Righ_Dot_1=0;
volatile unsigned char vGu8KeySec=0;
unsigned char Gu8RunCounter=0; //计数器,范围是 0 到 99
unsigned char Gu8RunStep=0; //运行的步骤
unsigned char Gu8RunStart=0; //控制跑马灯启动的总开关
unsigned char Gu8RunStatus=0; //标识跑马灯当前的状态。0 代表停止,1 代表启动,2 代表暂停。
unsigned char Gu8RunDirection=0; //标识跑马灯当前的方向。0 代表往右跑,1 代表往左跑。
unsigned char Gu8RunSpeed=1; //当前的速度档位。1 代表“慢”,2 代表“中”,3 代表“快”。
unsigned int Gu16RunSpeedTimeDate=0; //承接各速度档位的时间参数的变量
volatile unsigned char vGu8RunTimerFlag=0; //用于控制跑马灯跑动速度的定时器
volatile unsigned int vGu16RunTimerCnt=0;

void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
KeyTask(); //按键的任务函数
DisplayTask(); //数码管显示的上层任务函数
RunTask(); //跑马灯的任务函数
}
}
void RunTask(void) //跑马灯的任务函数,放在主函数内
{
if(0==Gu8RunStart) //如果是停止的状态
{
return; //如果是停止的状态,退出当前函数,不扫描余下代码。
}
switch(Gu8RunStep) //屡见屡爱的 switch 又来了
{
case 0:
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=0; //定时器清零
Gu8RunStep=1; //切换到下一步,启动
break;
case 1:
if(1==Gu8RunStatus&&0==vGu16RunTimerCnt) //当前处于“启动”状态,并且定时器等于 0
{
P1_4=0; //第 1 个灯亮
P1_5=1; //第 2 个灯灭
P1_6=1; //第 3 个灯灭
P3_3=1; //第 4 个灯灭
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=Gu16RunSpeedTimeDate; //速度时间参数变量的大小,决定了速度
vGu8RunTimerFlag=1; //启动定时器
//灵活切换“步骤变量”
if(0==Gu8RunDirection) //往右跑
{