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 点灯 } } // ここまで繰り返し }