ディジタル入力を試す / 問題2-6-6

p.106
問題2-6-6の別解

#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。

    int leds = 0;
    while(1){
        
        // スイッチがどれも押されていなかったら、
        // 点灯するLEDを右から左へ1つずつずらす、を繰り返す。
        while(PORTA == 0xf){
            for(int i=0; i<8; i++){
                LATB = ~(1 << i);
                __delay_ms(100);
            }
        }
        
        // スイッチがどれか押されていたら、
        // 点灯するLEDを右から左へ1つずつ積んでゆく、を繰り返す。
        leds = 0;
        for(int i=0; i<8; i++){
            leds |= (1 << i);
            LATB = ~leds;
            __delay_ms(100);
        }
        
    }

    return 0;
}