18F14K50には、15のDigital I/Oが準備されています。これらに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortAの一部とPortBは、20KΩ程度の抵抗で、Vddにプルアップ(WPUx=1)することもできます。
| デジタル入力として使用する場合 | デジタル出力として使用する場合 |
|---|---|
|
|
| 弱プルアップするには |
|---|
|
*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力を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 |
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 点灯
}
} // ここまで繰り返し
}