PICマイコンでスイッチを使ってLEDを点灯させる

PICマイコンとスイッチを使用し、LEDの点灯と消灯を切り替えます。

次のようなステップになります。

  1. 必要なパーツを揃える
  2. ブレッドボードに回路を作成する
  3. C言語でプログラムを作成する
  4. MPLAB X IDEでプログラムをPICに書き込む
  5. PICをブレッドボードに取り付けてLEDを点灯させる

1. 必要なパーツを揃える

必要なもの

補足

2. ブレッドボードに回路を作成する

PIC16F84AのPORT Bは内部にプルアップ抵抗を持っていますが、今回はPORT Aを使用するため外部にプルアップ抵抗を配置します。

回路図を参考にブレッドボードに回路を作成します。

回路図

Circuit diagram

Circuit diagram

スイッチが押されていない状態ではRA0は電源とつながるになるため、RA0は1になります。
スイッチが押された状態ではRA0はグラウンドとつながるため、RA0は0になります。

2. MPLABのプロジェクトを作成する

前回と同様にプロジェクトを作成します
名前は、pic_0003_switchとします。

3. C言語でプログラムを作成する

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 20000000

// 195 = 10[ms] * 5[MHz] / 256
#define TMR0_VALUE (256 - 195)

void interrupt tc_int(void) {
if (T0IF != 1) {
return;
}

T0IF = 0;

if (PORTAbits.RA0 == 1) {
PORTBbits.RB0 = 0;
} else {
PORTBbits.RB0 = 1;
}

TMR0 = TMR0_VALUE;
}

int main() {
GIE = 1; // Enables all unmasked interrupts
T0IE = 0; // Disable the TMR0 interrupt
T0CS = 0; // Internal instruction cycle clock (CLKOUT)
PSA = 0; // Prescaler is assigned to the Timer0 module

OPTION_REGbits.T0CS = 0; // Internal instruction cycle clock
OPTION_REGbits.PS = 7; // Prescaler Rate = (1:256)
OPTION_REGbits.PSA = 0; // Timer0

TRISBbits.TRISB0 = 0;

TRISAbits.TRISA0 = 1;

TMR0 = TMR0_VALUE;
T0IE = 1; // Enable the TMR0 interrupt

while(1) {
}

return 0;
}

解説

スイッチが押されていない状態(PORTAbits.RA0 == 1)では、LEDを消灯(PORTBbits.RB0 = 0;)させます。
スイッチが押された状態(PORTAbits.RA0 != 1)では、LEDを点灯(PORTBbits.RB0 = 1;)させます。

4. MPLAB X IDEでプログラムをPICに書き込む

省略

5. PICをブレッドボードに取り付けてLEDを点滅させる

省略