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

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

16F145xの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. 該当のWPUAxを 1にセット
  2. OPTION_REGのWPUEN (bit7)を0にリセット

*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELAでデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSAx = 0)する必要があります。

(*) は、APFCONで代替えPIN指定「1」したときに有効となる。
Other欄の出力指定は上段ほど優先度が高い。

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 T1CKI
CLKIN
SOSCI
OSC1
CLKOUT
SOSCO
CLKR
T1G
OSC2
T1G(*)
SS(*)
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
SCK
RX SDA
SDI
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
PullUp なし なし なし なし なし なし なし なし
Analog AN9 AN8 - - AN7 AN6 AN5 AN4
VREF+
Other SDO PWM2
SS
PWM1
T0CK1
C1OUT
C2OUT
TX
DACOUT2
CLKR(*)
PWM2
CxIN
DACOUT1
CxIN
CxIN CxIN
レジスタ 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
APFCON CLKRSEL SSSEL T1GSEL
WPUA WPUA5 WPUA4 WPUA3
WPUB WPUB7 WPUB6 WPUB5 WPUB4
OPTION_REG WPUEN INTEDG TMR0CS TMR0SE PSA PS<2-0>
ANSELA ANSA4
ANSELB ANSB5 ANSB4
ANSELC ANSC7 ANSC6 ANSC3 ANSC2 ANSC1 ANSC0

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

RA5に接続したPushSWを押すと500mS間隔で、離すと100mS間隔で、LEDが点滅する。RA5は、Week Pull Upされている。

プログラム

//  File name: Digital I/O
//  PushSWを離すと100mS間隔で、
//          押すと500mS間隔でLEDが点滅する。
//  PushSWの接続される RA3は、Week Pull Upされている。、
//
//  Notes: 4MHz内部クロック
//        PushSW RA3
//        LED    RC2
//    Language: MPLABX XC8
//    Target: PIC16F1459

#include <xc.h>
#define _XTAL_FREQ 4000000      // delay_ms(x) のための定義

#define LED    LATCbits.LATC2
#define PushSW PORTAbits.RA5

#pragma config FOSC  = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP  = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO  = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF

void main(void){
    OSCCON = 0b00110110;               // 内部クロック4Mhz
    WPUAbits.WPUA5  = 1;               // RA5 弱プルアップ
    OPTION_REGbits.nWPUEN = 0;
    TRISC  = 0b11111011;               // 入出力設定
    while(1){                          // 繰り返しループ
         if(PushSW) __delay_ms(100);   // 100mS遅延
              else  __delay_ms(500);   // 500mS遅延
         LED = ! LED;                  // 点滅
    }
}