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

ホーム
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 PWM2(*)

T1CKI
CLKIN
SOSCI
OSC1
CLKOUT
SOSCO
CLKR
SDO(*)
T1G
OSC2
T1G(*)
SS(*)
MCLR
D- D+
PORTC RC5 RC4 RC3 RC2 RC1 RC0
Digital I/O I/O I/O I/O I/O I/O
割込み - - - - - INT
PullUp なし なし なし なし なし なし
Analog - - AN7 AN6 AN5 AN4
VREF+
Other PWM1


RX
C1OUT
C2OUT

TX
DACOUT2
CLKR(*)
PWM2
CxIN
DACOUT1
SDO

CxIN
SDA
SDI

CxIN
SCL
SCK

CxIN
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISA TRISA5 TRISA4
TRISC TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC
LATA LATA5 LATA4
LATC LATC5 LATC4 LATC3 LATC2 LATC1 LATC0
PORTA RA5 RA4 RA3 RA1 RA0
PORTC RC5 RC4 RC3 RC2 RC1 RC0
APFCON CLKRSEL SDOSEL SSSEL T1GSEL P2SEL
WPUA WPUA5 WPUA4 WPUA3
OPTION_REG WPUEN INTEDG TMR0CS TMR0SE PSA PS<2-0>
ANSELA ANSA4
ANSELC 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の接続される RA5は、Week Pull Upされている。、
//
//  Notes: 4MHz内部クロック
//        PushSW RA5
//        LED    RC2
//    Language: MPLABX XC8
//    Target: PIC16F1455

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

#define LED    LATC2
#define PushSW 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
    WPUA5  = 1;                        // RA5 弱プルアップ
    nWPUEN = 0;
    TRISC  = 0b11111011;               // 入出力設定
    while(1){                          // 繰り返しループ
         if(PushSW) __delay_ms(100);   // 100mS遅延
              else  __delay_ms(500);   // 500mS遅延
         LED = ! LED;                  // 点滅
    }
}