<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【90.1 多任務并行處理。】 兩路速度不同的跑馬燈,代表了兩路獨立運行的任務,單片機如何“并行”處理這兩路任務,就涉及到“多任務并行處理的編程思路”。 ![](https://img.kancloud.cn/0f/49/0f49cc4e7b34f0e8c13dd7e514906c88_214x279.png) 上圖90.1.1 灌入式驅動8個LED 第1路跑馬燈 ![](https://img.kancloud.cn/1a/a6/1aa6512c1a2da257a8d80b5f06d97f89_244x287.png) 上圖90.1.2 灌入式驅動4個LED 新增加的第2路跑馬燈 如上圖,本節特別值得一提的是,新增加的第2路跑馬燈用的是4個LED,這4個LED的驅動IO口是“散裝的”,因為,前面3個是P1口的(P1.4,P1.5,P1.6),最后1個是P3口的(P3.3),這種情況下,肯定用不了“移位”的處理思路,只能用跑馬燈第3種境界里所介紹的“狀態切換非阻塞”思路,可見,“IO口拆分”和“switch狀態切換”又一次充分體現了它們“程序框架萬能擴展”的優越性。代碼如下: \#include "REG52.H" void T0\_time(); void SystemInitial(void) ; void Delay(unsigned long u32DelayTime) ; void PeripheralInitial(void) ; void Led\_1\_Task(void); void Led\_2\_Task(void); \#define BLINK\_TIME\_1 1000 //控制第1路跑馬燈的速度,數值越大“跑動”越慢。 \#define BLINK\_TIME\_2 200 //控制第2路跑馬燈的速度,數值越大“跑動”越慢。 sbit P0\_0=P0^0; sbit P0\_1=P0^1; sbit P0\_2=P0^2; sbit P0\_3=P0^3; sbit P0\_4=P0^4; sbit P0\_5=P0^5; sbit P0\_6=P0^6; sbit P0\_7=P0^7; sbit P1\_4=P1^4; sbit P1\_5=P1^5; sbit P1\_6=P1^6; sbit P3\_3=P3^3; volatile unsigned char vGu8TimeFlag\_1=0; volatile unsigned int vGu16TimeCnt\_1=0; volatile unsigned char vGu8TimeFlag\_2=0; volatile unsigned int vGu16TimeCnt\_2=0; void main() { SystemInitial(); Delay(10000); PeripheralInitial(); while(1) { Led\_1\_Task(); //第1路跑馬燈 Led\_2\_Task(); //第2路跑馬燈 } } void T0\_time() interrupt 1 { if(1==vGu8TimeFlag\_1&&vGu16TimeCnt\_1>0) //軟件定時器1 { vGu16TimeCnt\_1--; } if(1==vGu8TimeFlag\_2&&vGu16TimeCnt\_2>0) //軟件定時器2 { vGu16TimeCnt\_2--; } TH0=0xfc; TL0=0x66; } void SystemInitial(void) { TMOD=0x01; TH0=0xfc; TL0=0x66; EA=1; ET0=1; TR0=1; } void Delay(unsigned long u32DelayTime) { for(;u32DelayTime>0;u32DelayTime--); } void PeripheralInitial(void) { } //第1路跑馬燈 void Led\_1\_Task(void) { static unsigned char Su8Step=0; //加static修飾的局部變量,每次進來都會保留上一次值。 switch(Su8Step) { case 0: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=1; //第0個燈熄滅 P0\_1=0; P0\_2=0; P0\_3=0; P0\_4=0; P0\_5=0; P0\_6=0; P0\_7=0; Su8Step=1; //切換到下一個步驟,精髓語句! } break; case 1: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=1; //第1個燈熄滅 P0\_2=0; P0\_3=0; P0\_4=0; P0\_5=0; P0\_6=0; P0\_7=0; Su8Step=2; //切換到下一個步驟,精髓語句! } break; case 2: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=0; P0\_2=1; //第2個燈熄滅 P0\_3=0; P0\_4=0; P0\_5=0; P0\_6=0; P0\_7=0; Su8Step=3; //切換到下一個步驟,精髓語句! } break; case 3: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=0; P0\_2=0; P0\_3=1; //第3個燈熄滅 P0\_4=0; P0\_5=0; P0\_6=0; P0\_7=0; Su8Step=4; //切換到下一個步驟,精髓語句! } break; case 4: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=0; P0\_2=0; P0\_3=0; P0\_4=1; //第4個燈熄滅 P0\_5=0; P0\_6=0; P0\_7=0; Su8Step=5; //切換到下一個步驟,精髓語句! } break; case 5: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=0; P0\_2=0; P0\_3=0; P0\_4=0; P0\_5=1; //第5個燈熄滅 P0\_6=0; P0\_7=0; Su8Step=6; //切換到下一個步驟,精髓語句! } break; case 6: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=0; P0\_2=0; P0\_3=0; P0\_4=0; P0\_5=0; P0\_6=1; //第6個燈熄滅 P0\_7=0; Su8Step=7; //切換到下一個步驟,精髓語句! } break; case 7: if(0==vGu16TimeCnt\_1) //時間到 { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; //重裝定時的時間 vGu8TimeFlag\_1=1; P0\_0=0; P0\_1=0; P0\_2=0; P0\_3=0; P0\_4=0; P0\_5=0; P0\_6=0; P0\_7=1; //第7個燈熄滅 Su8Step=0; //返回到第0個步驟重新開始往下走,精髓語句! } break; } } //第2路跑馬燈 void Led\_2\_Task(void) { /\* 疑點講解(1): 這里第2路跑馬燈的“Su8Step”與第1路跑馬燈的“Su8Step”雖然同名,但是,因為它們是靜態的局部變量,在兩個不同的函數內部,是兩個不同的變量,這兩個變量所分配的RAM內存地址是不一樣的,因此,它們雖然同名,但是不矛盾不沖突。 \*/ static unsigned char Su8Step=0; //加static修飾的局部變量,每次進來都會保留上一次值。 switch(Su8Step) { case 0: if(0==vGu16TimeCnt\_2) //時間到 { vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=BLINK\_TIME\_2; //重裝定時的時間 vGu8TimeFlag\_2=1; P1\_4=1; //第0個燈熄滅 P1\_5=0; P1\_6=0; P3\_3=0; Su8Step=1; //切換到下一個步驟,精髓語句! } break; case 1: if(0==vGu16TimeCnt\_2) //時間到 { vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=BLINK\_TIME\_2; //重裝定時的時間 vGu8TimeFlag\_2=1; P1\_4=0; P1\_5=1; //第1個燈熄滅 P1\_6=0; P3\_3=0; Su8Step=2; //切換到下一個步驟,精髓語句! } break; case 2: if(0==vGu16TimeCnt\_2) //時間到 { vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=BLINK\_TIME\_2; //重裝定時的時間 vGu8TimeFlag\_2=1; P1\_4=0; P1\_5=0; P1\_6=1; //第2個燈熄滅 P3\_3=0; Su8Step=3; //切換到下一個步驟,精髓語句! } break; case 3: if(0==vGu16TimeCnt\_2) //時間到 { vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=BLINK\_TIME\_2; //重裝定時的時間 vGu8TimeFlag\_2=1; P1\_4=0; P1\_5=0; P1\_6=0; P3\_3=1; //第3個燈熄滅 Su8Step=0; //返回到第0個步驟重新開始往下走,精髓語句! } break; } }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看