ポインタ変数の応用例 / 2重ループを1重化する

pp.154-157
2次元排列に格納された値を順番にポートBに出力する。

#include <xc.h>

#pragma config FOSC  = INTOSC
#pragma config WDTE  = OFF
#pragma config MCLRE = OFF

#define _XTAL_FREQ 4000000

int main(){
    OSCCON = 0x68; // 4 MHZ

    TRISA  = 0x0f; // ポートAの下位4ビットのIOをINにする。0でOUT、1でIN。
    ANSELA = 0x00; // ポートAを全部ディジタル入力端子にする。

    TRISB = 0x00; // ポートBのIOを全部OUTにする。0でOUT、1でIN。
    LATB  = 0xff; // ポートBに接続されたLEDを一旦全部消す。
    
    const int sute0[4][2] = {{1, 2},
                             {3, 4},
                             {5, 6},
                             {7, 0},};
    
    const int sute1[4][2] = {{0x10, 0x20},
                             {0x30, 0x40},
                             {0x50, 0x60},
                             {0x70, 0x00},};
    
    while(1){
        
        // 普通は2重ループにするが、
        for(int r=0; r<4; r++){
        for(int c=0; c<2; c++){
            LATB = ~sute0[r][c];
            __delay_ms(200);
        }
        }
        
        // 順番に読み出しているだけなのでポインタ変数を使えば1重ループには一往できる。
        int* p = sute1;
        for(int i=0; i<8; i++){
            LATB = ~(*p);
            p++;
            __delay_ms(200);
        }

    }

    return 0;
}