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

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

18F26J 50には、22のDigital I/Oが準備されています。これらに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANCONx = 0)に設定されます。 また、デジタル入力に設定したPortBは、RBPU (INTCON2<7>)を0にクリアすることで20KΩ程度の抵抗でVddにプルアップすることができます。

デジタル入力として使用する場合 デジタル出力として使用する場合
  1. 該当のTRISを 1にセット
  2. アナログ併用ピンなら、
      該当のANCONxを1にセット
  3. 該当のPORTレジスタからデータを読む
  1. 該当のTRISを 0にリセット
  2. 該当のLATレジスタにデータを書く
弱プルアップするには <PortBのデジタル入力のみ>
  1. INTCON2のRBPU (bit7)を0にリセット 
    (デフォルトは1で弱プルアップは適用されていない)

*注意*
汎用ピンをデジタル入力で使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、デジタルに設定にするためにANCONの該当ビットを「1」にセットする必要があります。

PORTA RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0
Digital I/O I/O I/O I/O I/O I/O I/O
PullUp なし なし なし なし なし なし なし
Analog - - AN4 AN3 AN2 AN1 AN0
Remap RP2     RP1 RP0
Other OSC1 OSC2
PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
Digital I/O I/O I/O I/O I/O I/O I/O I/O
割込み IOC IOC IOC IOC INT0
PullUp あり あり あり あり あり あり あり あり
Analog AN11 AN10
Remap RP10 RP9 RP8 RP7 RP6 RP5 RP4 RP3
Other PGD PGC SDA1 SCL1     RTCC
PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
Digital I/O I/O I I   I/O I/O I/O
割込み - - - - - INT INT INT
PullUp なし なし なし なし なし なし なし
Analog AN9 AN8       AN11    
Remap RP18 RP17       RP13 RP12 RP11
Other RX1 TX1 D+ D-     T1OSI T1OSO
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISA TRISA7 TRISA6 TRISA5   TRISA3 TRISA2 TRISA1 TRISA0
TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
TRISC TRISC7 TRISC6       TRISC2 TRISC1 TRISC0
LATA LATA7 LATA6 LATA5   LATA3 LATA2 LATA1 LATA0
LATB LATB7 LATB6 LATB5 LATB4 LATB3 LATB2 LATB1 LATB0
LATC LATC7 LATC6       LATC2 LATC1 LATC0
PORTA RA7 RA6 RA5   RA3 RA3 RA1 RA0
PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
PORTC RC7 RC6 RC5 RC4   RC2 RC1 RC0
INTCON2 RBPU INTEDG0  INTEDG1  INTEDG2  INTEDG3  TMR0IP INT3IP RABIP
ANCON0       PCFG4
(RA5)
PCFG3
(RA3)
PCFG2
(RA2)
PCFG1
(RA1)
PCFG0
(RA0)
ANCON1 VBGEN     PCFG12
(RB0)
PCFG11
(RC2)
PCFG10
(RB1)
PCFG9
(RB3)
PCFG8
(RB2)

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

PPortB - RB0,RB1,RB2,RB3 に接続されたLEDが点灯するプログラムを作成しました。 PortB - RB5 に接続された SW を押すと点灯するLEDが替わります。

<プログラム>

//  File name: LED
//  Description: DigitalIO example
//  PushSWの状態で点灯するLEDが異なる。
//  Notes:  4MHz内部クロック
//        SW  RA5
//        LED RB0
//        LED RB1
//        LED RB2
//        LED RB3
//    Language: MPLAB xc8
//    Target: PIC18F26J50

#include <xc.h>
//
     #pragma config WDTEN = OFF
     #pragma config PLLDIV = 2
     #pragma config STVREN = ON
     #pragma config XINST = OFF
     #pragma config CPUDIV = OSC1
     #pragma config CP0 = OFF
     #pragma config OSC = INTOSC
     #pragma config T1DIG = OFF
     #pragma config LPT1OSC = OFF
     #pragma config FCMEN = OFF
     #pragma config IESO = OFF
     #pragma config WDTPS = 32768
     #pragma config DSWDTOSC = INTOSCREF
     #pragma config RTCOSC = T1OSCREF
     #pragma config DSBOREN = OFF
     #pragma config DSWDTEN = OFF
     #pragma config DSWDTPS = 8192
     #pragma config IOL1WAY = OFF
     #pragma config MSSP7B_EN = MSK7
     #pragma config WPFP = PAGE_1
     #pragma config WPEND = PAGE_0
     #pragma config WPCFG = OFF
     #pragma config WPDIS = OFF

void main(void){
    OSCCON = 0b01100010;     // 内部クロック4Mhz
    LATB = 0;                // PortCのすべてのビットを「0」
    TRISB = 0b11110000;      // LEDの接続されているポートを出力に設定
    ANCON0 = 0b11111111;     // すべてのポートをデジタルに設定
    ANCON1 = 0b00011111;     //
    while(1){                // 繰り返しループ
                if(PORTAbits.RA5 == 1){
                LATB = 0b00001100;          // 左2ケのLEDを点灯
                }else{
                LATB = 0b00000011;          // 右2ケのLEDを点灯
                }
    }                      // ここまで繰り返し
}