---
---
12F1822のDigital I/Oに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISAx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortは、20KΩ程度の抵抗で、Vddにプルアップ(WPUAx=1)することもできます。
デジタル入力として使用する場合 | デジタル出力として使用する場合 |
---|---|
|
|
弱プルアップするには |
---|
|
*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELAでデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSAx = 0)する必要があります。
PORTA | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
---|---|---|---|---|---|---|
Digital | I/O | I/O | I | I/O | I/O | I/O |
割込み | IOC | IOC | IOC | IOC | IOC | IOC |
PullUp | WPUA5 | WPUA4 | WPUA3 | WPUA2 | WPUA1 | WPUA0 |
Analog | - | AN4 | - | AN2 | AN1 | AN0 |
出力優先順 | OSC1 T1OSI SRNQ RX/DT(*) CCP1/P1A(*) |
OSC2 CLKOUT T1OSO CLKR SDO(*) P1B(*) |
SRQ C1OUT SDA CCP1/P1A |
SCL RX/DT SCK |
DACOUT MDOUT TX/CK SDO P1B |
(*) は、APFCONで代替えPIN指定「1」したときに有効となる
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
TRISA | TRISA5 | TRISA4 | TRISA3 | TRISA2 | TRISA1 | TRISA0 | ||
LATA | LATA5 | LATA4 | LATA2 | LATA1 | LATA0 | |||
PORTA | RA5 | RA4 | RA3 | RA1 | RA0 | |||
APFCON | RXDTSEL | SDOSEL | SSSEL | T1GSEL | TXCKSEL | P1BSEL | CCP1SEL | |
WPUA | WPUA5 | WPUA4 | WPUA3 | WPUA2 | WPUA1 | WPUA0 | ||
OPTION_REG | WPUEN | INTEDG | TMR0CS | TMR0SE | PSA | PS<2-0> | ||
ANSELA | ANSA4 | ANSA2 | ANSA1 | ANSA0 |
RA5に接続したPushSWを押すと500mS間隔で、離すと100mS間隔で、LEDが点滅する。RA5は、Week Pull Upされている。
プログラム
// File name: Digital I/O // PushSWを離すと100mS間隔で、 // 押すと500mS間隔でLEDが点滅する。 // PushSWの接続される RA5は、Week Pull Upされている。、 // // 1 VDD VSS 8 // PushSW 2 RA5 RA0 7 // 3 RA4 RA1 6 // 4 MCLR RA2 5 LED // // Notes: 4MHz内部クロック // Language: MPLABX XC8 // Target: PIC12F1822 #include <xc.h> #define _XTAL_FREQ 4000000 // delay_ms(x) のための定義 #define LED LATA2 #define PushSW RA5 //#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF //#pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF //#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF // CONFIG1の設定 #pragma config FOSC = INTOSC // 内部クロック使用 #pragma config WDTE = OFF // ウオッチドッグタイマ無効 #pragma config PWRTE = ON // リセットの64ms後に実行開始する #pragma config MCLRE = OFF // RA3をデジタル入力とする #pragma config CP = OFF // プログラムメモリを保護しない #pragma config CPD = OFF // データメモリを保護しない #pragma config BOREN = ON // 電源低下モニタを有効 #pragma config CLKOUTEN = OFF // RA4をデジタルIOとする #pragma config IESO = OFF // 内外クロックの切替え停止 #pragma config FCMEN = OFF // クロックをモニタしない // CONFIG2の設定 #pragma config WRT = OFF // Flashメモリ書込み保護しない #pragma config PLLEN = OFF // PLLを停止 #pragma config STVREN = ON // スタックエラーでリセットをする #pragma config BORV = LO // 電源低下モニタ電圧をLO(1.9V)設定 #pragma config LVP = OFF // 低電圧プログラミング無効 void main(void){ OSCCON = 0b01101010; // 内部クロック4Mhz ANSELA = 0; // 全てデジタルIO WPUA = 0xFF; // 弱プルアップ ON nWPUEN = 0; TRISA = 0b11111011; // 入出力設定 while(1){ // 繰り返しループ if(PushSW) __delay_ms(100); // 100mS遅延 else __delay_ms(500); // 500mS遅延 LED = ! LED; // 点滅 } }