トグルスイッチを切り替えると、「入力ピン状態変化割り込み」が発生し、赤色LEDと緑色LEDがウィンカーのように交互に点滅します。
タクトスイッチを押すと、「外部割り込み」が発生し、赤色/緑色、いずれかのLEDが点滅している場合は、すべてのLEDが消灯し、すべてのLEDが消灯している場合は、ハザードのように両方のLEDが点滅します。
この記事は「PIC16F88の 「入力ピン状態変化割り込み」と「外部割り込み」をトグルスイッチとタクトスイッチを使って確認しよう」のPIC16F88をPIC16F1827に置き換えて実験したものです。
PIC16F1827はPIC K150では書込むことができないので、PICkit3と同等品を準備します。
実験準備
実験に必要な機器とキットの部品を準備します。
機器
「MPLAB X IDE 6.20」をインストールしたWindows11搭載のパソコンとPICkit3(PICマイコンライタ)を準備します。
▶️Windows11搭載のパソコン
「MPLAB X IDE 6.20」のインストールについてはこちらを参考にしてください。
▶️PICkit3(PICマイコンライタ)
PICkit3にPIC16F1827を接続するために、PIC ICD2 PICKIT2 PICKIT3 プログラミングアダプターを接続します。
Microchip社の純正PIKkit3は現在販売されていませんので、同等品を使用する場合は仕様を確認の上、ご利用ください。

部品
赤色LEDと固定抵抗等、実験に使う部品を準備します。
部 品 名 | 規 格 | 数 量 | 取扱い店(参考) |
PICマイコン | PIC16F1827 -I/P | 1 | 電子工作ステーション |
LED | 5mm 赤色 (同等品) | 1 | 電子工作ステーション |
LED | 5mm 緑色 (同等品) | 1 | 電子工作ステーション |
カーボン抵抗 | 1/4W 330Ω | 2 | 電子工作ステーション |
カーボン抵抗 | 1/4W 10KΩ | 3 | 電子工作ステーション |
カーボン抵抗 | 1/4W 1KΩ | 1 | 電子工作ステーション |
タクトスイッチ | 7mm | 1 | 電子工作ステーション |
電解コンデンサ | 10μF/50V/105℃ | 1 | 電子工作ステーション |
積層セラミックコンデンサ | 0.1μF(+80%/-20%) / 50V / | 4 | 電子工作ステーション |
ブレッドボード・ ジャンパーワイヤーSET | 14種×10本 | 1 | 電子工作ステーション |
2入力NANDゲート | TC74HC00AP | 1 | 秋月電子通商 |
6回路シュミットトリガー インバーター | TC74HC14AP | 1 | 秋月電子通商 |
ブレッドボード | EIC-8032 | 1 | 秋月電子通商 |
12W級ACアダプター3.3V2A | LTE10UW-S0-BS01 | 1 | 秋月電子通商 |
ブレッドボード用DC ジャックDIP化キット | AE-DC-POWER-JACK-DIP | 1 | 秋月電子通商 |
※ブレッドボード用 トグルスイッチ | AE-BBTGLSW-CONV | 1 | 秋月電子通商 |
※ブレッドボード用トグルスイッチは半田付けが必要です。
配線
準備した部品を回路図に従ってジャンパーワイヤーで接続し、実験回路を製作します。
回路図

回路について
割り込みラインに接続されているタクトスイッチ(SW1)やトグルスイッチ(SW2)は、機械的なスイッチですのでチャタリング(バウンス)が発生する可能性があります。
チャタリングにより、マイコンは複数の割込みが発生したと認識し、不安定な動作となります。
回路図-1のタクトスイッチには、抵抗とコンデンサを組み合わせた積分回路にシュミットトリガ(74HC14)を接続して、チャタリングを防止しています。
トグルスイッチについては、NANDゲート(74HC00)を2個使ってSRラッチ回路を制作し、チャタリングを防止しています。
両方の回路とも、出力をオシロスコープで確認したところ、チャタリングは確認できませんでした。
なお、現在ではプログラムによるチャタリング防止が主流となっているようです。
MPLABでC言語プログラミング
MPLAB X IDE v6.20 を使って、PIC16F1827をC言語プログラムで制御します。
プロジェクトの新規作成
「MPLAB X IDE v6.20」を起動し、メニューの「File」をクリックし、リストボックスから、「New Project…」をクリックします。

New Project-Choose Projectダイアログが表示されますので、Categories:リストから「Microchip Embedded」を選択し、Projects:から「Application Ploject(S)」を選択後、「Next>」をっクリックします。

New Project-Select Deviceダイアログが表示されますので、次のように選択します。
項 目 | 設 定 内 容 |
Fmily: | Mid-Range 8-bit MCUs (PIC10/12/16/MCP) |
Device: | PIC16F1827 |
Tool: | PICkit3-SN:(シリアル番号) |
選択後、「Next>」をクリックします。

New Project-Select Headerダイアログが表示されますので、「Next>」をクリックします。

New Project-Select Compilerダイアログが表示されますので、「XC8(v3.00)[xxxx]」を選択後、「Next>」をクリックします

New Project-Select Project Name and Folderダイアログが表示されますので、次のように設定、選択します。
項 目 | 設 定 内 容 |
Project Name: | 任意(ここでは、16f1827_turn_signal) |
Project Location: | 任意 |
Encoding: | Shift JIS |

選択後、「Finish」をクリックすると、「Projects」ウィンドウに作成したプロジェクトの内容が表示されます。

ソースファイルの作成
プログラムを記述するソースファイルを作成します。
Project(16f1827_turn_signal)内の「Source Files」を右クリックします。

表示されたリストボックスから、「New 」→「main.c…」と選択します。

New AssemblyLFile.asm-Nae and Locationダイアログが表示されますので、File nameに「任意の名前(16f1827_turn_signal_src)」を入力し、Extentionに「c」を選択後、「Finish」をクリックします。

Source Files に作成した「ソースファイル(16f1827_turn_signal_src.c)」が追加され、右側にC言語のひな形が入力された「エディタ」画面が表示されます。

メニューの「File」をクリックし、リストボックスから、「Exit」をクリックし、「MPLAB X IDE v6.20」を終了します。

コンフィグレーションビット
コンフィグレーションビットは、PIC16F1827の基本的な動作設定を行い、プログラム作成時にのみ変更できる特殊なビットの集まりで、リセット時に読み出され、PIC16F1827のハードウェア機能を有効または無効にします。
「MPLAB X IDE v6.20」を起動し、メニューの「Window」→「Target Memory Views」→「Configuration Bits」をクリックします。

「Configuration Bits」ウィンドウが、Outputエリア内に表示されます。

▶️コンフィグレーションビットの設定
コンフィグレーションビットを「Option」を次のように設定し、「Generare Source Code to Outoput」をクリックします。
Field | Option | 説 明 |
コンフィグレーションビット1 | ||
FSOC | INTOSC | 内部RC発振回路を利用します(RA6、RA7ピンは入出力) |
WDTE | OFF | ウォッチドッグタイマを無効にします |
PWRTE | ON | パワーアップタイマーを有効にします |
MCLRE | OFF | 入出力ピンとして使用します |
CP | OFF | プログラムメモリーを保護はしない |
CPD | OFF | データメモリを保護をしない |
BOREN | ON | 電源電圧降下常時監視機能を有効にします |
CLKOUTEN | OFF | CLKOUTピンを無効にします(RA4ピンは入出力) |
IESO | OFF | 内部から外部クロックへの切替えでの起動はしない |
FCMEN | OFF | 外部クロックの監視はしない |
コンフィグレーションビット2 | ||
WRT | OFF | プログラムメモリへの書込みを保護しない(書込める) |
PLLEN | OFF | 4xPLLを動作させない |
STVREN | OFF | スタックがオーバフローやアンダーフローしてもリセットしない |
BORV | LO | 電源電圧降下常時監視の電圧設定を1.9Vにする |
DEBUG | OFF | インサーキットデバッガーを無効にする |
LVP | OFF | 低電圧プログラミングを行なわない |

「Output – Config Bits Source」ウィンドウに設定したフィギュレーション・ビットのコードが、自動的に生成されますので、このコードをコピーしてソース・ファイルに貼り付けます。
※今回は貼りつけは行いません

または、「Output – Config Bits Source」ウィンドウ上で、「Ctrl」+「s」キーを押すと、「Save Output As」ダイアログが表示されますので、任意のフォルダとファイル名を設定して保存し、プロジェクトに追加します。

「MPLAB X IDE v6.20」を終了します。
プログラムの作成とビルド
ソースファイル(16f1827_turn_signal_src.c)のエディタに、トグルスイッチとタクトスイッチの割り込み処理で、LEDを500ms間隔で点滅させるC言語プログラムを作成します。
プログラムの入力
「MPLAB X IDE v6.20」を起動し、「Projects」ウィンドウのソースファイル(16f1827_turn_signal_src.c)のエディタを表示ます。(表示されていない場合は、ソースファイルをダブルクリックします)
次のプログラムをエディタに入力するか、コピー、貼り付けします。
/*------------------------------------------------------------------------------
LEDウィンカー/ハザードプログラム
* File: 16f1827_turn_signal_src.c
* Author: Hagetamaboti
* Created on 2025/mm/dd
------------------------------------------------------------------------------
ライセンス:SPDX-License-Identifier: MIT
------------------------------------------------------------------------------*/
/******************************************************************************
* PIC16F187 コンフィグレーションビットの設定
*******************************************************************************/
//コンフィグレーションビット1
#pragma config FOSC = INTOSC // 内部RC発振回路を利用します(RA6、RA7ピンは入出力)
#pragma config WDTE = OFF // ウォッチドッグタイマを無効にします
#pragma config PWRTE = ON // パワーアップタイマーを有効にします
#pragma config MCLRE = OFF // 入力ピンとして使用します
#pragma config CP = OFF // プログラムメモリーを保護はしない
#pragma config CPD = OFF // データメモリを保護をしない
#pragma config BOREN = ON // 電源電圧降下常時監視機能を有効にします
#pragma config CLKOUTEN = OFF // CLKOUTピンを無効にします(RA4ピンは入出力)
#pragma config IESO = OFF // 内部から外部クロックへの切替えでの起動はしない
#pragma config FCMEN = OFF // 外部クロックの監視はしない
// コンフィグレーションビット2
#pragma config WRT = OFF // プログラムメモリへの書込みを保護しない(書込める)
#pragma config PLLEN = OFF // 4xPLLを動作させない
#pragma config STVREN = OFF // スタックがオーバフローやアンダーフローしてもリセットしない
#pragma config BORV = LO // 電源電圧降下常時監視の電圧設定を1.9Vにする
#pragma config DEBUG = OFF // インサーキットデバッガーを無効にする
#pragma config LVP = OFF // 低電圧プログラミングを行なわない
/******************************************************************************
* ヘッダファイルの取り込み
*******************************************************************************/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
/******************************************************************************
* 定数定義
*******************************************************************************/
#define _XTAL_FREQ 8000000 // 遅延関数(__delay_ms)を使用するためにシステムクロック(8MHz)を設定
#define RED_LED 0x01 // 赤LED点灯
#define GREEN_LED 0x02 // 緑LED点灯
#define RED_GREEN_LED 0x03 // 赤緑LED点灯
/******************************************************************************
* グローバル変数定義
*******************************************************************************/
//Ledの状態設定
unsigned char led_sts = 0; // 0:消灯、1:赤LED点灯、2:緑LED点灯、3:赤緑LED点灯
/******************************************************************************
* プロトタイプ宣言
*******************************************************************************/
//LED点灯・消灯関数
void Led_On_Off(void);
/******************************************************************************
* メイン関数
*******************************************************************************/
void main(void) {
//SFR(特殊機能レジスタ)設定
OSCCON = 0x70; // システムクロックを内部8MHzに設定
OSCTUNE = 0x00; // オシレーター調整なし
ANSELA = 0x00; // アナログ入力Aは使用しない(すべてデジタルに設定)
ANSELB = 0x00; // アナログ入力Bは使用しない(すべてデジタルに設定)
CM1CON0 = 0x00; // コンパレータ1を無効にする
CM2CON0 = 0x00; // コンパレータ2を無効にする
DACCON0 = 0x00; // D/Aコンバータを無効にする
SRCON0 = 0x00; // SRラッチを無効にする
MDCON = 0x00; // DSMを無効にする
CPSCON0 = 0x00; // 静電容量式センシングルを無効にする
PORTA = 0x00; // PORTA初期化
PORTB = 0x00; // PORTB初期化
TRISA = 0x00; // PORTAはすべて出力(RA5は入力のみ)
TRISB = 0x11; // PORTBのRB0,RB4は入力その他は出力
//割り込みの許可
INTE = 1; // RB0/INT 割り込みの許可
IOCIE = 1; // RB0?RB7 ポート変化割り込み発生を許可
IOCBP4 = 1; // RB4ポート割り込み立上り検出
IOCBN4 = 1; // RB4ポート割り込み立下り検出
GIE = 1; // すべての割込みを許可
//無限ループ
while(1)
{
//LED点灯・消灯関数
Led_On_Off();
}
}
/******************************************************************************
* 割り込み処理
*******************************************************************************/
void __interrupt() isr(void)
{
//プッシュスイッチ (RB0/INT 割込み)
if (INTF)
{
INTF = 0; // 割り込みフラグクリア
if (led_sts == 0)
{
led_sts = RED_GREEN_LED; // 赤緑LED点灯(ハザード)
}
else
{
led_sts = 0; // Led消灯
}
}
//トグルスイッチ (PORTB-RB4) 割込み)
if (IOCBF4)
{
IOCBF4 = 0; // 割り込みフラグクリア
if (RB4 == 1)
{
led_sts = RED_LED; // 赤LED点灯(ウィンカー)
}
else
{
led_sts = GREEN_LED; // 緑LED点灯(ウィンカー)
}
}
}
/******************************************************************************
* LED点灯・消灯処理
*******************************************************************************/
void Led_On_Off()
{
PORTA = led_sts; // Led点灯・消灯設定
__delay_ms(500); // 500ms待ち
PORTA = 0x0; // LED消灯
__delay_ms(500); // 500ms待ち
return;
}
ビルド
ビルドは、ソースファイルから、PICに書込むための実行ファイルを生成しますが、プログラムに文法上のエラー等がある場合は、実行ファイルが生成されません。
ツールバーのビルドアイコンをクリックし「Build for Debugging (xxxxxxx)」を選択すると、ビルドが開始しデバッグ用のファイル(xxxxxx.elf)が作成されます。

▶️正常にビルドが完了
正常にビルドが完了すると「Output – xxxx (Buil. Load)」ウィンドウに「BUILD SUCCESSFUL (total time: xxxms)」が表示されます。

▶️エラーでビルドが完了
エラーがあり、ビルドが失敗した場合は、ツールバーのデバッグアイコンをクリックし、デバッグモードを開始します。

デバッグ用ツールバーに変更されますので、ブレークポイント機能等を利用し、エラーが無くなるまでデバッグを行います。

デバッグ法方については、マイクロチップ社のマニュアル(英語)を参照してください。
トグルスイッチの割り込み処理について
トグルスイッチの割り込みは、「入力ピン状態変化割り込み」に割り当てられている、RB0~RB7の内のRB4で検出します。
「入力ピン状態変化割り込み」は、設定により入力ピン(ここではRB4)の立上りまたは立下り時に、割り込みを検出しますので、トグルスイッチを切り替える度に、割り込みが検出されよう設定します。
RB0~RB7 割り込みを許可するビット(IOCIE)とすべての割込みを許可するビット(GIE)が有効のなっていれば、RB4の立上り検出(IOCBP4)、立下り検出(IOCBN4)の設定に従い、割込みを検出し、現在進行中の処理は中断され、割り込み処理(void __interrupt() isr(void))が実行されます。
割り込み処理(void __interrupt() isr(void))は、RB0~RB7 割り込み以外の割り込みが発生した場合でも実行されますので、フラグ(IOCBF4)で発生元がRB4 割り込みであることを判定し、フラグ(IOCBF4)をクリアした後、RB4に該当する処理を実行します。
RB4の割り込みは立上り、立下りの両方で検出するように設定されていますので、RB4のHigt/Lowの状態により、赤緑のLEDのどちらかを点滅させます。
割り込み処理終了後、中断した処理の次の処理(命令)が実行されます。
タクトスイッチの割り込み処理について
タクトスイッチの割り込みは、「外部割り込み」のRB0で検出します。
RB0の割り込みは、入力信号の立上りまたは、立下りで割込みを検出します。
立上りまたは、立下りは、SFRにあるOPTION_REGの割り込みエッジ選択ビット(INTEDG)で選択され、電源投入時の初期状態では立上りに設定されています。
RB0の割り込みを許可するビット(INTE)と、すべての割込みを許可するビット(GIE)が有効のなっていれば、入力信号が立上った時に割込みを検出し、現在進行中の処理は中断され、割り込み処理(void __interrupt() isr(void))が実行されます。
割り込み処理(void __interrupt() isr(void))は、RB0の割り込み以外の割り込みが発生した場合でも実行されますので、フラグ(INTF)で発生元がRB0の割り込みであることを判定し、フラグ(INTF)をクリアした後、赤緑両方のLEDを点滅または消灯させます。
割り込み処理終了後、中断した処理の次の処理(命令)が実行されます。
実行ファイルをPICに書込む
MPLAB X IDE v6.20 を使って作成、ビルドしたC言語プログラムを、PICkit3(PICマイコンライタ)を使ってPIC16F1827に書込みます。
PICkit3の電源供給設定
PICkit3からPIC16F1827への書き込み時に、電源を供給するための設定を行います。
「MPLAB X IDE v6.20」が起動していない場合は、起動して16f1827_turn_signalプロジェクトを開き、「Production」→「Set Project Configuration」→「Customize」を選択します。

「Categories :」から「PICkit3」を選択し、「Option categories」から「Power」を選択します。

「Power target circuit from PICkit3」にチェックを入れ、「Voltage Level」を5.0に設定し、「OK」をクリックします。

プログラムの書込み
PICkit3に接続した「PIC ICD2 PICKIT2 PICKIT3 プログラミングアダプター」に、PIC16F1827装着し、「Make and Program Device Main Project」をクリックすると、プログラムのコンパイルが開始され、コンパイルに成功するとPIC16F1827への書き込みが開始されます。

処理が始まると、警告のダイアログボックスが表示されますが、問題ないので「OK」をクリックします。(「Do not show this message again」というチェックボックスにチェックを入れると、次回からは表示されなくなります)

書込みが成功すると、Outputウィンドウに「Programming/Verify complete」と表示されます。

実機で性能確認
C言語プログラムが書き込まれたPIC16F1827を、制作した実験回路 に実装します。
電源を接続し、トグルスイッチを切り替えると、ウィンカーのように赤色LEDと緑色LEDが500ms間隔で交互に点滅します。
タクトスイッチを押すと、赤色/緑色いずれかのLEDが点滅している場合は、すべてのLEDが消灯し、すべてのLEDが消灯している場合は、ハザードのように両方のLEDが500ms間隔で点滅します。
まとめ
MPLAB X IDE v6.20を使ってC言語でプログラミングを行い、「外部割り込み」と「入力ピン状態変化割り込み」の処理方法を学習しました。
トグルスイッチを切り替えると、「入力ピン状態変化割り込み」が発生し、ウィンカーのように赤色LEDと緑色LEDを交互に点滅させることができました。
タクトスイッチを押すと、「外部割り込み」が発生し、赤色/緑色いずれかのLEDが点滅している場合は、すべてのLEDを消灯させ、すべてのLEDが消灯している場合は、ハザードのように両方のLEDを点滅させることができました。