<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一、設置方法所需結構體

      typedef struct TASK_COMPONENTS {
          unsigned char Run;                // 程序運行標記:0-不運行,1-運行  ,這里是程序會不會運行
          unsigned char Timer;              // 計時器, 這個是用于在定時器中減減的
          unsigned char ItvTime;         // 任務運行間隔時間, 這個是用于更新參數的
          void (*TaskHook)(void);       // 要運行的任務函數 函數指針
      } TASK_COMPONENTS;                 // 任務定義

       二、構建任務表

      /**************************************************************************************
      * Variable definition 這里添加你的任務。。。。
      **************************************************************************************/
      static TASK_COMPONENTS TaskComps[] =
      { 
          {0, 0,2, RGB_MODE1},       //任務一
          {0, 0,1000, Led},      //任務二
      };

      三、任務標志檢測,在定時器中斷中調用

      /**************************************************************************************
      * FunctionName   : TaskRemarks()          //放到定時器中
      * Description    : 任務標志處理
      **************************************************************************************/
      void TaskRemarks(void)                            //要放到  timer中斷中
      {
          uchar i;
          uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS);
          for(i = 0; i < TaskMax; i++)
          {
              if(TaskComps[i].Timer)   // 時間不為0 , 可是我有一個問題, 什么時候用 . 什么時候用 ->
              {
                  TaskComps[i].Timer--; 
              }
              else
               {
                      if(TaskComps[i].Timer == 0)            //如果計時到
                   {
                        TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢復計時器值,從新下一次
                          TaskComps[i].Run = 1;                            // 任務可以運行, 任務的延遲已經過了, 可以繼續運行了
                    }
                }
          }
      }

      四、任務處理,在while(1)中調用

      /**************************************************************************************
      * FunctionName   : TaskProcess()
      **************************************************************************************/
      void TaskProcess(void)
      {
          uchar i;
              uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS);
          for (i=0; i<TaskMax; i++)  // 逐個任務時間處理
          {
              if(TaskComps[i].Run)     //如果任務可以運行
              {
                  TaskComps[i].TaskHook(); // 運行任務, 這個是一個函數, 在運行完這個函數后, 我們下一步操作就是清除標志位
                  TaskComps[i].Run = 0;    // 標志清0
              }
          }
      }

       完整程序

      #include "WS51F0030.h"
      #include "RGB.h"
      
      #define Time0Def  65536-2668     //2ms
      #define uchar unsigned char
      #define uint  unsigned int
          
      void Led(void)
      {
              P14 = ~P14;
      }
      
      typedef struct TASK_COMPONENTS {
          unsigned char Run;            // 程序運行標記:0-不運行,1-運行  ,這里是程序會不會運行
          unsigned char Timer;        // 計時器, 這個是用于在定時器中減減的
          unsigned char ItvTime;    // 任務運行間隔時間, 這個是用于更新參數的
          void (*TaskHook)(void); // 要運行的任務函數 函數指針
      } TASK_COMPONENTS;        // 任務定義
      
      /**************************************************************************************
      * Variable definition 這里添加你的任務。。。。
      **************************************************************************************/
      static TASK_COMPONENTS TaskComps[] =
      { 
          {0, 0,2, RGB_MODE1}, 
              {0, 0,1000, Led},
      };
      //2. 任務運行標志出來,此函數就相當于中斷服務函數,需要在定時器的中斷服務函數中調用此函數,這里獨立出來,便于移植和理解。
      /**************************************************************************************
      * FunctionName   : TaskRemarks()          //放到定時器中
      * Description    : 任務標志處理
      **************************************************************************************/
      void TaskRemarks(void)                            //要放到  timer中斷中
      {
          uchar i;
              uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS);
          for(i = 0; i < TaskMax; i++)
          {
              if(TaskComps[i].Timer)   // 時間不為0 , 可是我有一個問題, 什么時候用 . 什么時候用 ->
              {
                  TaskComps[i].Timer--;  // 減去一個節拍
              }
                      else
                      {
                              if(TaskComps[i].Timer == 0)            //如果計時到
                  {
                      TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢復計時器值,從新下一次
                      TaskComps[i].Run = 1;                            // 任務可以運行, 任務的延遲已經過了, 可以繼續運行了
                  }
                      }
          }
      }
      //3. 任務處理:實現任務管理操作, 用于循環判斷哪個任務需要運行了
      /**************************************************************************************
      * FunctionName   : TaskProcess()
      **************************************************************************************/
      void TaskProcess(void)
      {
          uchar i;
              uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS);
          for (i=0; i<TaskMax; i++)  // 逐個任務時間處理
          {
              if(TaskComps[i].Run)     //如果任務可以運行
              {
                  TaskComps[i].TaskHook(); // 運行任務, 這個是一個函數, 在運行完這個函數后, 我們下一步操作就是清除標志位
                  TaskComps[i].Run = 0;    // 標志清0
              }
          }
      }
      
      void delay_1ms(void)
      {
          int j;
          for(j=0; j<17700; ++j);
      }
      /***************************
      *系統時鐘初始化
      ***************************/
      void System_Init(void)
      {
          delay_1ms();
          SCCON = 0x00;//使能HRC
          HRCON |= 0x80;
          delay_1ms();
          SCCON = 0x00;//使能HRC
          HRCON |= 0x80;
          delay_1ms();
      }
      
      /*****************************************************
      *全局中斷打開
      *****************************************************/
      void ISR(void)
      {
          EA = 1;
      }
      
      /*****************************************************
      * 中斷服務函數  1ms
      *****************************************************/
      void timer0_isr (void) interrupt 1
      {
          TL0 = Time0Def & 0xff;       //初始值低字節,TL0 的高 3 位是無效的
          TH0 = Time0Def >> 8;         //初始值高字節(1ms@16MHz)  0.993ms
              TaskRemarks();
      }
      
      /*****************************************************
      *函數功能:Timer0初始化配置
      *****************************************************/
      void Timer0_Init(void)
      {
          ET0 = 0;
          TL0 = Time0Def & 0xff;       //初始值低字節,TL0 的高 3 位是無效的
          TH0 = Time0Def >> 8;         //初始值高字節(1ms@16MHz)  0.993ms
          TMOD = 0x01;                        //定時器,時鐘為系統時鐘 12 分頻
      
          ET0 = 1;    //開中斷 定時器 0 中斷使能控制位
          TR0 = 1;    //啟動定時器
      }
      
      void Gpio_Init(void)
      {
          P14F = 0x02;   //LED
          P05F = 0x02;
      }
      
      int main(void)
      {
          uint i = 0;
          System_Init();
          Gpio_Init();
          Timer0_Init();
          ISR();
      
          while(1)
          {
              TaskProcess();
          }
      }

       

      posted on 2022-10-20 17:22  xiao_fei  閱讀(282)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99精品热在线在线观看视| 亚洲国产欧美在线人成AAAA| 亚洲大尺度无码专区尤物| 香蕉亚洲欧洲在线一区| 免费大片黄国产在线观看| 句容市| 国产精品偷乱一区二区三区| 国产高清一区二区不卡| 日本新janpanese乱熟| 成人动漫在线观看| 狠狠躁夜夜躁人人爽天天5| 国产suv精品一区二区883| 国产老熟女无套内射不卡| 亚洲第一综合天堂另类专| 99热精品国产三级在线观看| 波多野结衣久久一区二区| 亚洲中文字幕成人综合网| 成人看的污污超级黄网站免费| 久久精品国产一区二区三| 亚洲国产精品综合久久网各| 日韩av一区二区三区精品| 元码人妻精品一区二区三区9 | 综合久久婷婷综合久久| 午夜福利你懂的在线观看| 精品久久久久久无码国产| 九九热在线免费视频观看| 免费看成人毛片无码视频| 一区二区丝袜美腿视频| 久久一区二区三区黄色片| 国内少妇偷人精品视频| 日韩人妻少妇一区二区三区| 国产边摸边吃奶边叫做激情视频| 亚洲精品动漫免费二区| 久久综合97丁香色香蕉| 久久午夜夜伦鲁鲁片免费无码| 一区二区在线观看成人午夜| 日本中文字幕亚洲乱码| 亚洲欧美偷国产日韩| 国产精品一区二区色综合| 日本三级香港三级三级人妇久| 久久国产成人精品av|