久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

裸機中的戰斗機,一個裸機調度器

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年02月01日   【字體:
下面代碼是來自51hei的一個代碼,其中一個是將任務放在一個隊列里面輪轉執行,更重要的是一個—LINE—神一般的應用。


#include <stc89c51.h>
 #include <stdio.h>
 
 /*****************小小調度器部分開始********************************************/ 

這里開始是重點 
 #define  _SS   static char lc=0; switch(lc){   case 0: lc=0;
 #define  _EE   }; lc=0; 
 #define  WaitX(a,b)  settimer(&lc,__LINE__,a,b); return ; case __LINE__:
這里是重點的結束

 
 struct TASK {
   char td;
   void (*fp)();
 };
 #define MAXTASKS 5
 struct TASK tasks[MAXTASKS];
 
 //設置定時器
 void settimer(char *lc,char  line,char  tmrid,int d){
   *lc=line;
   tasks[tmrid].td=d;
 }
 //邏輯定時器處理,在定時器中斷里調用
 void dectimers() { 
  unsigned char i;   
  for (i=0;i<MAXTASKS;i++){ 
    if (tasks[i].td>0)  tasks[i].td--;  
  }
 }
 //任務調度函數,在main里面運行
 void runtasks() {
    unsigned char i;    
    for(i=0;i<MAXTASKS;i++)
    {   
      if (tasks[i].fp!=0){    
    if (tasks[i].td==0){
      tasks[i].td=-1;  
      tasks[i].fp();
  }  
  }  
  }
 }
 /****************小小調度器部分結束*******************************************************/
 
 
 sbit KEY = P3^2;
 unsigned char code numtab[16]={0x24,0x6F,0xE0,0x62,0x2B,0x32,0x30,0x67,0x20,0x22,0x21,0x38,0xB4,0x68,0xB0,0xB1};
 
 
 sfr IAP_CONTR = 0xC7;
 sfr WDT_CONTR = 0xC1;
 
 //清除看門狗
 void clr_wdt()
 {
   WDT_CONTR =0x3C; 
 }
 
 //初始化定時器
 void InitT0()
 {
  TMOD = 0x21;
  IE |= 0x82;  // 12t
  TL0=0Xff;
  TH0=0Xb7;
  TR0 = 1;
 }
 //定時器中斷
 void INTT0(void) interrupt 1 using 1
 {
  TL0=0Xff;    //10ms 重裝
  TH0=0Xb7;
  dectimers();
 }
 
 sbit LED1= P2^4;  
 
 //任務一,狀態機寫法
 void ontimer0(){ 
   LED1=!LED1;  // LED1引腳接在發光管負極,LED1=0 為亮,LED1=1為滅。
 
   //重裝定時器
   if (LED1) tasks[0].td=45;  //450mS 滅
   else tasks[0].td=5;  //50ms  亮
 }
 
 //任務二,狀態機寫法
 char keycount=0;
 void task1(){
  if(KEY==0) {
    keycount++;
    if (keycount>20) IAP_CONTR = 0x60;
  }
  else{
     keycount=0;
  }
  //重裝定時器
  tasks[1].td=5;
 }
 
 
 //任務三,偽線程寫法
神一樣的代碼就在這里了。 
 void  task2()
 {
  static char i;
 _SS
 
 while(1){
 
  for(i=0;i<=9;i++){ //從0--9快速顯示,間隔200mS
   WaitX(2,20);        這里是一個delay,但是,程序退出了,然后下一次時間到了之后直接就回到這里執行了。太強大了。一直沒有想到可以用LINE+switch case這么使用。
   P1=numtab[i];
  }
  for(i=0;i<=9;i++){ //從0--9慢速顯示,間隔500mS
   WaitX(2,50);        
   P1=numtab[i];
  }
 }
 
 _EE
 }
 
 
 
 void main()
 {
  unsigned char KeyNum;
  P3M0 = 0x00;
  P3M1 =0x00;
  //WDT_CONTR= 0x00;   //關閉看門狗
  P1 = 0xff;         //關顯示
 
    clr_wdt();
 
  InitT0();
 
  KEY =1; //按鍵IO口
  KeyNum=0; //按下次數
 
     //裝載任務:
  tasks[0].fp=ontimer0; 
  tasks[1].fp=task1; 
  tasks[2].fp=task2; 
  
     //循環調度
  while(1){
  runtasks();
  clr_wdt();
  }
 }
關閉窗口

相關文章

主站蜘蛛池模板: 红桃av在线| 成人免费视频视频 | 亚洲视频一区二区 | 亚洲国产黄色 | 欧美在线性爱视频 | 久久视频免费在线观看 | 青青国产视频 | 日韩精品在线一区二区 | 免费视频国产 | 天天操天天操天天操 | 天堂8中文| 国产av毛片 | 欧洲一区二区 | 性高潮久久久久久久 | 97精品国产 | 国产美女一区 | 天天搞天天搞 | 欧美另类视频 | 久久毛片视频 | 欧美激情网站 | 亚洲人天堂 | 韩国免费理论片 | 永久免费av | 国产伦精品一区二区三区免.费 | 美女综合网 | 天天干天天舔 | 欧美日韩中文字幕在线 | 成人午夜激情视频 | 小镇姑娘国语版在线观看免费 | 国产免费一区二区三区免费视频 | 99精品久久久 | 亚洲精品国产精品乱码不卡 | 日韩理论在线 | 青草免费视频 | 中文字幕在线免费视频 | 大尺度做爰呻吟舌吻网站 | 国产精品日韩在线 | 精品久久久久久久久久久久久 | 日本a在线观看 | 久在线视频 | 久草网在线 |