📄 clock.c
字号:
/******************************************************************************/
/* */
/* 多任务程序设计 */
/* */
/******************************************************************************/
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include <reg51.h>
//定义各任务
#define INIT 0
#define CLOCK_RUN 1
#define CLOCK_DISPLAY 2
#define KEY_SCAN 3
#define KEY_DEAL 4
#define CLOCK_BEEP 5
//增加一个任务:CLOCK_BEEP
//定义各个键值
#define UPKEY 6
#define DOWNKEY 5
#define MODEKEY 3
//定义数码管显示字符0-9,数码管是共阴极
unsigned char numcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//定义显存,buf[0]对应最左边数码管,buf[7]对应最右边数码管
unsigned char buf[8];
struct Clock_Struc
{
unsigned char hour;
unsigned char minute;
unsigned char second;
} Clock,Beep_Clock,Display_Clock;
sbit BEEP = P2^3;
unsigned char keyvalue;
unsigned char status;
/*
status =0--Clock Run ; 1--Change Clock Minute 2--Change Clock Hour 3--Change Alarm Minute 4--Change ALARM hour
status =1--Change Clock.minute
status =2--Change Clock.hour
status =3--Change Beep_Clock.minute
status =4--Change Beep_Clock.hour
*/
/******************************************************************************/
/* Task 0 'job0': RTX-51 tiny starts execution with task 0 */
/******************************************************************************/
void job0 (void) _task_ INIT
{
Clock.hour = 11;
Clock.minute = 59;
Clock.second = 50;
Beep_Clock.hour = 12;
Beep_Clock.minute = 0;
Beep_Clock.second = 0;
status = 0;
os_create_task (CLOCK_RUN); /* start task 1 */
os_create_task (CLOCK_DISPLAY); /* start task 2 */
os_create_task (KEY_SCAN);
os_create_task (KEY_DEAL);
os_create_task (CLOCK_BEEP);
//创建 CLOCK_BEEP 任务
os_delete_task (INIT); /* stop init task (no longer needed) */
}
/******************************************************************************/
/* Task 1 'job1': Clock Run */
/******************************************************************************/
void job1 (void) _task_ CLOCK_RUN
{
while(1)
{
os_wait (K_IVL, 50, 0); /* wait interval: 1 second */
os_send_signal(CLOCK_BEEP);
Clock.second ++ ;
if(Clock.second>=60)
{
Clock.second = 0 ;
Clock.minute ++;
if(Clock.minute>=60)
{
Clock.minute = 0;
Clock.hour++;
if(Clock.hour>=24)
Clock.hour = 0;
}
}
}
}
/******************************************************************************/
/* Task 2 'job2': Clock Display */
/******************************************************************************/
void job2 (void) _task_ CLOCK_DISPLAY
{
unsigned char i,j;
while(1)
{
if(status<=2)
Display_Clock = Clock;
else
Display_Clock = Beep_Clock;
buf[0] = numcode[Display_Clock.hour/10];
buf[1] = numcode[Display_Clock.hour%10];
buf[2] = 0x40;
buf[3] = numcode[Display_Clock.minute/10];
buf[4] = numcode[Display_Clock.minute%10];
buf[5] = 0x40;
buf[6] = numcode[Display_Clock.second/10];
buf[7] = numcode[Display_Clock.second%10];
for(i=0;i<=7;i++)
{
P1 = buf[i];
P3 = i ;
for(j=0;j<20;j++)
;
P1 = 0x00;
}
}
}
void job3 (void) _task_ KEY_SCAN
//此任务是不停地侦听是否有键按下
{
unsigned char i;
while(1)
{
os_wait (K_IVL, 10, 0);
i = P2&0x07 ;
if(i!=0x07)
{
keyvalue = i ;
//在此添加一条语句,发送信号量给KEY_DEAL任务,告知有键按下
os_send_signal(KEY_DEAL);
while(i!=0x07)
i = P2&0x07; //等待键释放
}
}
}
void job4 (void) _task_ KEY_DEAL
{
//此任务是进行按键处理
while(1)
{
//等待有键按下的信号量
os_wait(K_SIG,0,0);
/*
MODEKEY按键处理
当 status = 0 时,按下MODEKEY后,status = 1,系统进入修改走时的分针状态
当 status = 1 时,按下MODEKEY后,status = 2,系统进入修改走时的时针状态
当 status = 2 时,按下MODEKEY后,status = 3,系统进入修改闹时的分针状态
当 status = 3 时,按下MODEKEY后,status = 4,系统进入修改闹时的时针状态
当 status = 4 时,按下MODEKEY后,status = 0,系统进入正常的走时状态
UPKEY处理
当status = 1,走时的分针加1
当status = 2,走时的时针加1
当status = 3,闹时的分针加1
当status = 4,闹时的时针加1
DOWNKEY处理
当status = 1,走时的分针减1
当status = 2,走时的时针减1
当status = 3,闹时的分针减1
当status = 4,闹时的时针减1
*/
if(keyvalue==MODEKEY)
{
status++;
if(status>=5)
status=0;
keyvalue=0;
}
switch(status)
{
case 1:
if(keyvalue==UPKEY)
{
Clock.minute++;
if(Clock.minute>=60)
Clock.minute=0;
}
if(keyvalue==DOWNKEY)
{
Clock.minute--;
if(Clock.minute==0xFF)
Clock.minute=59;
}
break;
case 2:
if(keyvalue==UPKEY)
{
Clock.hour++;
if(Clock.hour>=24)
Clock.hour=0;
}
if(keyvalue==DOWNKEY)
{
Clock.hour--;
if(Clock.hour==0xFF)
Clock.hour=23;
}
break;
case 3:
if(keyvalue==UPKEY)
{
Beep_Clock.minute++;
if(Beep_Clock.minute>=60)
Beep_Clock.minute=0;
}
if(keyvalue==DOWNKEY)
{
Beep_Clock.minute--;
if(Beep_Clock.minute==0xff)
Beep_Clock.minute=59;
}
break;
case 4:
if(keyvalue==UPKEY)
{
Beep_Clock.hour++;
if(Beep_Clock.hour>=60)
Beep_Clock.hour=0;
}
if(keyvalue==DOWNKEY)
{
Beep_Clock.hour--;
if(Beep_Clock.hour==0xff)
Beep_Clock.hour=59;
}
break;
}
}
}
//增加一个任务,当走时Clock与设定的闹时Beep_Clock时间相等(只要时针和分针相同),BEEP驱动LED点亮
void job5(void)_task_ CLOCK_BEEP
{
while(1)
{
os_wait(K_SIG,0,0);
if(Clock.hour==Beep_Clock.hour&&Clock.minute==Beep_Clock.minute)
BEEP=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -