📄 trafficlights.c
字号:
*********************************************************************************************************
*/
static void TaskStartDisp (void)
{
char *arr;
int arrow[2] = {49,50};
sprintf(arr,"SetTime: %d ( %c Add, %c Reduce)", SetTime,arrow[0],arrow[1]);
PC_DispStr( 0, 23, arr, DISP_BGND_BLACK+DISP_FGND_WHITE);
}
/*
*********************************************************************************************************
* 创建任务
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
OSTaskCreateExt(TaskClk,
(void *)0,
&TaskClkStk[TASK_STK_SIZE - 1],
TASK_CLK_PRIO,
TASK_CLK_ID,
&TaskClkStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task1,
(void *)0,
&Task1Stk[TASK_STK_SIZE - 1],
TASK_1_PRIO,
TASK_1_ID,
&Task1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task2,
(void *)0,
&Task2Stk[TASK_STK_SIZE - 1],
TASK_2_PRIO,
TASK_2_ID,
&Task2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
/*
*********************************************************************************************************
* 交通灯显示任务
*********************************************************************************************************
*/
void Task1 (void *pdata)
{
int sem = 0;
int change = 0;
INT8U err;
OS_STK_DATA data;
INT16U time;
INT8U i;
char *ss = NULL;
char s[80];
INT32U T;
pdata = pdata;
for (;;) {
sprintf(ss,"%d",LightTime); // 将当前剩余时间转换成为字符串
PC_DispStr(56, 8, ss , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK); // 打印剩余时间
PC_DispStr(23, 16, ss , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
if (LightTime < 10) { // 处理个位显示
PC_DispStr(57, 8, " " , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
PC_DispStr(24, 16, " " , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
}
if (LightTime < 4) { // 通过信号和change变量控制信号灯的逻辑
sem = 1;
if (change && LightTime == 0)
change = 0;
else if (!change && LightTime == 0)
change = 1;
}
if (sem == 1 && LightTime == 0 && change == 0) {
sem = 0;
}
else if (sem == 1 && LightTime == 0 && change == 1) {
sem = 2;
}
DisplayLight(sem);
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
/*
*********************************************************************************************************
* 显示交通灯状态
*********************************************************************************************************
*/
void DisplayLight(int sem)
{
if (sem == 0) // 按照传入信号量的不同设置显示的状态.
{
DisplayLightS();
}
else if (sem == 1)
{
DisplayLightBS();
}
else if (sem == 2)
{
DisplayLightG();
}
}
/*
*********************************************************************************************************
* 交通灯显示 红 绿
*********************************************************************************************************
*/
void DisplayLightS(void)
{
PC_DispStr(57, 7, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
PC_DispStr(24, 15, "G", DISP_FGND_LIGHT_GREEN + DISP_BGND_BLACK);
}
/*
*********************************************************************************************************
* 交通灯显示 绿 红
*********************************************************************************************************
*/
void DisplayLightG(void)
{
PC_DispStr(24, 15, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
PC_DispStr(57, 7, "G", DISP_FGND_LIGHT_GREEN + DISP_BGND_BLACK);
}
/*
*********************************************************************************************************
* 交通灯显示 红 红
*********************************************************************************************************
*/
void DisplayLightBS(void)
{
PC_DispStr(57, 7, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
PC_DispStr(24, 15, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
}
/*
*********************************************************************************************************
* 设置交通灯的残留时间任务
*********************************************************************************************************
*/
void Task2 (void *data)
{
char *s;
int sem = 0;
int i = 0;
data = data;
LightTime = SetTime;
waitTime = 0;
for (;;) {
if (LightTime == -1) { // 如果残留时间减完,则意味着交通灯变换,重设定残留时间
LightTime = SetTime;
sem = 0;
}
OSTimeDlyHMSM(0, 0, 1, 0);
LightTime--;
}
}
/*
*********************************************************************************************************
* 获取时间任务
*********************************************************************************************************
*/
void TaskClk (void *data)
{
char s[40];
data = data;
for (;;) {
PC_GetDateTime(s); //获得系统时间
PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLACK);
OSTimeDly(OS_TICKS_PER_SEC);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -