概要
PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,2個の押しボタンスイッチ(タクトスイッチ)を使用する際のプログラム例を紹介します. 開発環境は下記のとおりです.
PIC | PIC16F88-I/P |
---|---|
MPLAB X IDE | MPLAB X IDE v2.26 |
MPLAB XC8 | MPLAB XC8 C Compiler v1.32 |
PICkit 2 | MPLAB X IDEを使用して書込み |
回路
回路図
電源はPICkit 2から5.0Vを供給し,内蔵クロック 8MHzで動作させています. 各タクトスイッチは,10kΩ抵抗でプルアップされた負論理入力回路となっています. 私がSW1として使用したタクトスイッチはLED内蔵ですが,このLEDは使用していません. 7セグメントLEDの電流制限抵抗には200Ωを使用していますが,330~1kΩ程度の方が良いかもしれません.
回路部品
下表は使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.
番号 | 部品名 | 型番 | 数量 | 参考単価 |
---|---|---|---|---|
U1 | PICマイコン | Microchip PIC16F88-I/P | 1 | 250円 |
SW1 | LED付き タクトスイッチ |
Switronic ST-12-303FC-G (緑,正方形) |
1 | 150円 |
SW2 | タクトスイッチ | 各社 | 1 | 10円 (互換品) |
LED1 | 7セグメントLED | PARA LIGHT C-421E (カソードコモン) |
1 | |
R1 - R3 | 炭素皮膜抵抗 | 各社 1/4W 10kΩ | 3 | 1円 (互換品) |
R4 - R10 | 炭素皮膜抵抗 | 各社 1/4W 200Ω | 7 | 1円 (互換品) |
その他 | リード線など | 適量 |
プログラム
タクトスイッチのチャタリングによる誤動作防止対策
タクトスイッチを使用する際は,チャタリング対策が必要です. 下記のプログラムでは,スイッチの状態を10ミリ秒の間隔を置いて2回確認するようにしています. 1回目と2回目のスイッチの状態が一致し,なおかつ現在のスイッチの状態(sw_state)が前回のスイッチの状態(sw_state_prev)と異なる場合は,スイッチの状態についての判定(switch文)に移行します. これは,スイッチの状態が変化した直後のみ,スイッチの状態に対応する処理を実行するためです.
main.c
下記はソースファイル「main.c」です.参考になれば幸いです.
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 52 53 54 55 56 57 58 59 60 | #include <xc.h> #define _XTAL_FREQ 8000000 // 8MHz // 16F88 // CONFIG1 #pragma config FOSC = INTOSCIO #pragma config WDTE = OFF #pragma config PWRTE = ON #pragma config MCLRE = ON #pragma config BOREN = ON #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CCPMX = RB3 #pragma config CP = OFF // CONFIG2 #pragma config FCMEN = OFF #pragma config IESO = OFF void main( void ) { unsigned char sw_state; unsigned char sw_state_prev = 0x00; OSCCON = 0b01110000; // 内蔵クロックの周波数を8MHzに設定 PORTA = 0x00; // PORTAを初期化 PORTB = 0x00; // PORTBを初期化 TRISA = 0x06; // PORTAの入出力設定 TRISB = 0x00; // PORTBの入出力設定 ANSEL = 0x00; // A/D変換を無効化 ADCON0 = 0x00; ADCON1 = 0x00; while (1){ // 無限ループ sw_state = (PORTA ^ 0xff) & 0x06; // SW1,SW2の状態を反転して格納 __delay_ms(10); // 10ミリ秒の待ち時間 if ((sw_state == ((PORTA ^ 0xff) & 0x06)) // SW1,SW2の状態を再確認および, && (sw_state != sw_state_prev)){ // 前回の状態からの変化有無の確認 switch (sw_state){ case 0x02: // SW1押下 PORTB = 0b00000110; // 7セグメントLED表示 "1" break ; case 0x04: // SW2押下 PORTB = 0b01011011; // 7セグメントLED表示 "2" break ; case 0x06: // SW1およびSW2押下 PORTB = 0b01001111; // 7セグメントLED表示 "3" break ; default : break ; } } sw_state_prev = sw_state; } } |
完成
タクトスイッチと7セグメントLEDの使用例
プログラム教えてください。
返信削除