?? 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 + -