⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 1、学习Proteus的使用
💻 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 + -