从单片机基础到程序框架(全集 2019pdf版).pdf - 第728页
void Delay (unsigned l ong u32Delay Time) ; void Perip heralInit ial(void) ; void KeySc an(void); void KeyTa sk(void); void RunTa sk(void); //跑马 灯的任务函数 void Voice Scan(void ); void Displ ayScan(vo id); void Displ ayTask(…

上图 124.1.4 LED 电路
本节小项目,意在“人机界面”与“过程控制”如何关联的练习。
程序功能如下:
(1)数码管显示的格式是“S.D.CC”。其中 S 是代表 3 档速度,能显示的数字范围是“1、2、3”,分别
代表“慢、中、快”3 档速度。D 代表方向,往右跑显示符号“r”(right 的首字母),往左跑显示符号“L”
(Left 的首字母)。CC 代表计数器,跑马灯每跑完一次,计数器自动加 1,范围是 0 到 99。
(2)【速度】按键 K1。每按一次【速度】按键 K1,速度档位显示的数字在“1、2、3”之间切换。
(3)【方向】按键 K2。跑马灯上电后默认处于“往右跑”的方向,默认显示字符“r”。每按一次【方向】
按键 K2,跑马灯就在“往右跑”与“往左跑”两个方向之间切换,显示的字符在“r、L”之间切换。
(4)【启动暂停】按键 K3。上电后,按下【启动暂停】按键 K3 启动之后,跑马灯处于“启动”状态,4
个 LED 灯挨个依次循环的变亮,给人“跑”起来的感觉,此时再按一次【启动暂停】按键 K3,则跑马灯处于
“暂停”状态,接着又按一次【启动暂停】按键 K3,跑马灯又变回“启动”状态。因此,【启动暂停】按键
K3 是专门用来切换“启动”和“暂停”这两种状态。
代码如下:
#include "REG52.H"
#define KEY_FILTER_TIME 25
#define SCAN_TIME 1
#define VOICE_TIME 50
#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 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;