さまざまな点灯パターンを試す

pp.84-99
f:id:ti-nspire:20191128100106p:plain:h250

#include <xc.h>

#define _XTAL_FREQ 4000000 // クロックを定義する(ディレイ函数用)。4 MHz。

__CONFIG(
      FOSC_INTOSC // 内蔵オシレーターを使う。
    & MCLRE_OFF   // MCLRを無効化する。だからRA5が使える。
    & WDTE_OFF    // ウォッチドッグタイマーを無効化する。
);

int main(){
    
    OSCCON = (0b1101 << 3); // OSCILLATOR CONTROL REGISTER。4 MHz。
    
    TRISB = 0x00; // ポートBのIOを全部OUTにする。0でOUT、1でIN。
    LATB  = 0xff; // 一旦ポートBを全部Hにする。シンクなので全部のLEDが消える。
    
    int leds;
    while(1){
        
        // 0~255を順番にポートBに表示する。
        for(int i=0; i<255; i++){
            LATB = ~i;
            __delay_ms(20);
        }
        
        // 点灯するLEDを右から左へ1つずつずらす。
        for(int i=0; i<8; i++){
            LATB = ~(1 << i);
            __delay_ms(200);
        }
        
        // 点灯するLEDを左から右へ1つずつずらす。
        for(int i=0; i<8; i++){
            LATB = ~(0b10000000 >> i);
            __delay_ms(200);
        }
        
        // 点灯するLEDを右から左へ1つずつ積んでゆく。
        leds = 0;
        for(int i=0; i<8; i++){
            leds |= (1 << i);
            LATB = ~leds;
            __delay_ms(400);
        }
        
        // 点灯するLEDを左から右へ1つずつ積んでゆく。
        leds = 0;
        for(int i=0; i<8; i++){
            leds |= (0b10000000 >> i);
            LATB = ~leds;
            __delay_ms(400);
        }
    }

    return 0;
}

f:id:ti-nspire:20191128100229p:plain:w500