PIC18F14K50の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
デジタル I/O

18F14K50には、15のDigital I/Oが準備されています。これらに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortAの一部とPortBは、20KΩ程度の抵抗で、Vddにプルアップ(WPUx=1)することもできます。

デジタル入力として使用する場合 デジタル出力として使用する場合
  1. 該当のTRISを 1にセット
  2. アナログ併用ピンなら、
      該当ANSELAのANS bitを0にリセット
  3. 該当のPORTレジスタからデータを読む
  1. 該当のTRISを 0にリセット
  2. 該当のLATレジスタにデータを書く
弱プルアップするには
  1. 該当のWPUxxを 1にセット
  2. INTCON2のRABPU (bit7)を0にリセット

*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELとCMxCON0でデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSx = 0)する必要があります。一方CMxCON0は、デフォルトでコンパレータ機能はOFFに設定されているため、設定を省略することが可能です。

*注意*
RA0、RA1 ピンをデジタル入力で使用する場合は、、状態変化割り込みピンを有効にして(IOCA <1:0> = 11)、さらにUSBモジュールを無効にする必要があります(USBEN = 0)。 IOCA は、デフォルトで無効に設定されているため、デジタル入力で使用するには、必ず該当ピンを状態変化割り込みを有効にする必要があります。一方 USBEN は、デフォルトで無効に設定されているため、設定を省略することが可能です。

PORTA RA5 RA4 RA3 RA1 RA0
Digital I/O I/O I I I
割込み IOC IOC IOC IOC IOC
PullUp WPUA5 WPUA4 WPUA3 - -
Analog - AN3 -   - -
Other OSC1 OSC2 MCLR D- D+
PORTB RB7 RB6 RB5 RB4
Digital I/O I/O I/O I/O
割込み IOC IOC IOC IOC
PullUp WPUB7 WPUB6 WPUB5 WPUB4
Analog AN11 AN10
Other TX SCL RX SDA
PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
Digital I/O I/O I/O I/O I/O I/O I/O I/O
割込み - - - - - INT INT INT
PullUp なし なし なし なし なし なし なし なし
Analog AN9 AN8 - - AN7 AN6 AN5 AN4
VREF+
Other T1OSC0 T1OSC1 Cout Cin Cin Cin Cin
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISA TRISA5 TRISA4
TRISB TRISB7 TRISB6 TRISB5 TRISB4
TRISC TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC
LATA LATA5 LATA4
LATB LATB7 LATB6 LATB5 LATB4
LATC LATC7 LATC6 LATC5 LATC4 LATC3 LATC2 LATC1 LATC0
PORTA RA5 RA4 RA3 RA1 RA0
PORTB RB7 RB6 RB5 RB4
PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
WPUA WPUA5 WPUA4 WPUA3
WPUB WPUB7 WPUB6 WPUB5 WPUB4
INTCON2 RABPU INTEDG0 INTEDG1 INTEDG2 TMR0IP RABIP
ANSEL ANS7 ANS6 ANS5 ANS4 ANS3
ANSELH ANS11 ANS10 ANS9 ANS8

デジタル I/Oのプログラム例

PortC - RC0,RC1 に接続されたLEDが点灯するプログラムを作成しました。 PortB - RB7 に接続された SW を押すと点灯するLEDが替わります。

<プログラム>

//  File name: LED
//  Description: DigitalIO example
//  2つのLEDが点滅する。
//  Notes: 4MHz内部クロック
//        LED0 RC0
//        LED1 RC1
//    Language: MPLABX  xc8(v2.20)
//    Target: PIC18F14K50

#include <xc.h>                  // PIC のハードウエア定義

#pragma config FOSC   = IRC, PLLEN  = ON,  FCMEN  = OFF
#pragma config IESO   = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config PWRTEN = OFF, BOREN  = OFF, WDTEN  = OFF
#pragma config HFOFST = OFF, MCLRE  = OFF
#pragma config STVREN = ON,  BBSIZ  = OFF, LVP    = OFF
#pragma config XINST  = OFF
#pragma config CP0    = OFF, CP1    = OFF, CPB    = OFF
#pragma config WRT0   = OFF, WRT1   = OFF, WRTB   = OFF, WRTC   = OFF
#pragma config EBTR0  = OFF, EBTR1  = OFF, EBTRB  = OFF

void main(void){
    OSCCON = 0b01010010;         // 内部クロック4Mhz
    WPUB7 = 1;                   // RB7 week pullup ON
    RABPU = 0;
    LATC = 0;                    // PortCのすべてのビットを「0」
    TRISC = 0b11111100;          // LEDの接続されているポートを出力に設定
    while(1){                    // 繰り返しループ
        if(PORTBbits.RB7){       // SW(RB7)が1なら
            LATC = 0b00000001;   //     LED 0 点灯
        }else{                   // SW(RB7)が0なら
            LATC = 0b00000010;   //     LED 1 点灯
        }
    }                            // ここまで繰り返し
}