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

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

裸機中的戰(zhàn)斗機,一個裸機調(diào)度器

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


#include <stc89c51.h>
 #include <stdio.h>
 
 /*****************小小調(diào)度器部分開始********************************************/ 

這里開始是重點 
 #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__:
這里是重點的結(jié)束

 
 struct TASK {
   char td;
   void (*fp)();
 };
 #define MAXTASKS 5
 struct TASK tasks[MAXTASKS];
 
 //設(shè)置定時器
 void settimer(char *lc,char  line,char  tmrid,int d){
   *lc=line;
   tasks[tmrid].td=d;
 }
 //邏輯定時器處理,在定時器中斷里調(diào)用
 void dectimers() { 
  unsigned char i;   
  for (i=0;i<MAXTASKS;i++){ 
    if (tasks[i].td>0)  tasks[i].td--;  
  }
 }
 //任務(wù)調(diào)度函數(shù),在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();
  }  
  }  
  }
 }
 /****************小小調(diào)度器部分結(jié)束*******************************************************/
 
 
 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;  
 
 //任務(wù)一,狀態(tài)機寫法
 void ontimer0(){ 
   LED1=!LED1;  // LED1引腳接在發(fā)光管負極,LED1=0 為亮,LED1=1為滅。
 
   //重裝定時器
   if (LED1) tasks[0].td=45;  //450mS 滅
   else tasks[0].td=5;  //50ms  亮
 }
 
 //任務(wù)二,狀態(tài)機寫法
 char keycount=0;
 void task1(){
  if(KEY==0) {
    keycount++;
    if (keycount>20) IAP_CONTR = 0x60;
  }
  else{
     keycount=0;
  }
  //重裝定時器
  tasks[1].td=5;
 }
 
 
 //任務(wù)三,偽線程寫法
神一樣的代碼就在這里了。 
 void  task2()
 {
  static char i;
 _SS
 
 while(1){
 
  for(i=0;i<=9;i++){ //從0--9快速顯示,間隔200mS
   WaitX(2,20);        這里是一個delay,但是,程序退出了,然后下一次時間到了之后直接就回到這里執(zhí)行了。太強大了。一直沒有想到可以用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;   //關(guān)閉看門狗
  P1 = 0xff;         //關(guān)顯示
 
    clr_wdt();
 
  InitT0();
 
  KEY =1; //按鍵IO口
  KeyNum=0; //按下次數(shù)
 
     //裝載任務(wù):
  tasks[0].fp=ontimer0; 
  tasks[1].fp=task1; 
  tasks[2].fp=task2; 
  
     //循環(huán)調(diào)度
  while(1){
  runtasks();
  clr_wdt();
  }
 }
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 青青久草 | 国产九九精品视频 | www.色.com | 久久精品亚洲精品国产欧美 | 免费精品久久久久久中文字幕 | 亚洲精选一区 | 日韩成人性视频 | 7777在线 | 黄色大片在线免费观看 | 日日操av| 久久亚洲一区二区三区四区 | 亚洲 成人 在线 | 欧美福利在线 | 蜜臀久久99精品久久久久久宅男 | 亚洲人成人一区二区在线观看 | aaa一区 | 国产96在线 | 国产日产精品一区二区三区四区 | a级黄色片视频 | 久久久久国产一区二区三区四区 | 久久精品中文 | 久久精品aaa| 日韩一区二区免费视频 | 麻豆一区二区三区精品视频 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | av片免费| 国产精品免费看 | 视频一区二区在线观看 | 日韩波多野结衣 | 91社影院在线观看 | 人人草人人干 | 国产精品1区2区3区 一区中文字幕 | 久久免费高清视频 | 精品国产乱码久久久久久丨区2区 | 国产精品一码二码三码在线 | 亚洲福利一区二区 | 在线电影日韩 | 久草在线在线精品观看 | 精品日韩| 日韩一区二区三区视频 | 91视频久久 |