PICでCの練習 2007.05.06(日)〜 LessonC_11。 スイッチ押しをカウントします。
著作者名: 中野 良知 作成開始: 2007.05.05(土) 更新 : 2007.05.06(日) キーワードの項目を作成。 : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. main()のwhile(1){}は 4.2. key_in()のif(++key_chat == 10){} 4.3. キー入力のチャッタリング除去 4.4. LED出力タイミングチャート 4.5. 答 6. 実験回路 1. 目的 if文でスイッチ入力をテストし、LEDをON/OFFさせます。 2. ゼネラルフローチャート (main) ↓ ポートの初期化 ↓ ├←────────────────┐ │ no │ < スイッチオン? > →─────────┤ ↓yes │ カウンターインクリメント │ │ │ カウンター値をポートBへ出力 │ │ │ ├←───────────┐ │ │ no │ │ < スイッチオフ? > ─────┘ │ ↓yes │ └─────────────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_11 // 作者 : ioio // 目的 : if文でスイッチをテストし、押した回数をカウントします。 // マイコン : PIC16F84A // クロック : 20MHz // Config : PROTECT=OFF, WDTE=OFF, XTAL // Compiler : PICC Lite(V9.6)。 HI-TEC software製。 // Compile : >picl -16f84a lesson.c // ASM List : >picl -16f84a --ASMLIST lesson.c //***************************************************************************** // 変更履歴 // 2007.05.05(土) 作成 // 2007.05.14(月) configでXTALをHS_OSILLATORに変更 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR //----------------------------------------------------------------------------- // 関数定義 void delay_msec(unsigned int); void key_in(void); //----------------------------------------------------------------------------- // グローバル変数定義 unsigned char key_fix; // チャタリング処理したkey入力 unsigned char key_old; // 前回サンプリングしたキーの入力 int key_chat; // キー入力のチャタリング処理カウンタ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { unsigned char bin_cnt; // 符号無し1バイト変数。 TRISB = 0x00; // PortB b0,b1,b2,b3,b4,b5,b6,b7=Out TRISA = 0x0F; // PortA b0,b1,b2,b3=In key_fix = 0x01; // キーオフに初期化 key_old = 0x01; // キーオフに初期化 bin_cnt = 0x00; // バイナリカウンタ初期化 PORTB = 0x00; // ポートB初期化 while(1){ key_in(); // キー入力とチャタリング処理 if(key_fix == 0){ // スイッチオンなら bin_cnt++; // バイナリカウンタをインクリメント PORTB = bin_cnt; // LEDにカウント値を出力 // キーオフ待ち while(key_fix == 0){ key_in(); // キー入力とチャタリング処理 } } } } //----------------------------------------------------------------------------- // タイトル : キー入力チャタリング処理関数 // 作成 :2007.05.05(土) //----------------------------------------------------------------------------- void key_in(void) { unsigned char key_new; delay_msec(1); // 1msecの遅延 key_new = PORTA & 0x01; // RA0をサンプリング if( key_new == key_old){ // 前回と同じ入力なら if(++key_chat == 10){ // 10msec連続してキー入力が安定したら key_fix = key_old; // キー確定 key_chat--; } }else{ // 前回と異なる入力なら key_old = key_new; // サンプリングしたキーデータを保存 key_chat = 0; // チャタリング処理カウンターをクリア } } //----------------------------------------------------------------------------- // タイトル : msec単位の遅延関数 // 作成 :2007.05.04(金) //----------------------------------------------------------------------------- #define D1MSEC 500 void delay_msec(unsigned int msec) { unsigned int cnt; while(msec--){ cnt = D1MSEC; while(cnt--); } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. main()のwhile(1){}は キー押しが無いときに何秒でループするでしょうか?。 4.2. key_in()のif(++key_chat == 10){} と if(key_chat++ == 10){} との働きの違いは何でしょうか?。 4.3. キー入力のチャッタリング除去 ──────┐ ┌─────── キー入力 └───────────┘ ────────┐ ┌───── key_fix └───────────┘ →├─┤← およそ何秒? キー入力が1から0になってから、key_fixが0になるまでおよそ何秒掛かりますか? 4.4. LED出力タイミングチャート bin_cnt=0で、以下のキー押しがあった時のRB0,RB1,RB2,RB3の出力タイミングチャー トはどの様に変化するでしょうか? ───┐ ┌───┐┌────┐ ┌── キー入力 └─────┘ └┘ └────┘ │←───→│ →││← │←──→│ 100msec 5msec 100msec RB0 ──? RB1 ──? RB2 ──? RB3 ──? 4.5. 答 こちら をご覧下さい。 5. 実験回路 PIC16F84A ┌────┐14 │ VDD├──────●──────●────●──── +5V │ │ │ │0.1u │ │ │ R10K ┴ /50V │┴│100u/16V │ │4 │ 0.1u/50V ┬ └┬┘ │ -MCLR├──────●─┤├───●────┘ │ │ │ │ │16 ┌ ─ ─ ─ ┐ │ │ OSC1├───●─┤├──┐ │ │ │ │┴ ││ │ │ │ □ 20MHz │ │ │ │15 │┬ ││ │ │ OSC2├───●─┤├──● │ │ │ └ ─ ─ ─│┘ │ │ │5 ┌───────┘ │ │ Vss├─●───────────● │ │ │ │ │ LED │ │ │6 ┌─┬┐K │ │ RB0├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │7 ┌─┬┐K │ │ RB1├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │8 ┌─┬┐K │ │ RB2├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │9 ┌─┬┐K │ │ RB3├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │10 ┌─┬┐K │ │ RB4├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │11 ┌─┬┐K │ │ RB5├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │12 ┌─┬┐K │ │ RB6├──┤ │├─R220──● │ │ └─┴┘ │ │ │ LED │ │ │13 ┌─┬┐K │ │ RB7├──┤ │├─R220──● │ │ └─┴┘ │ │ │ │ │ │ +5V │ │ │ │ │ │ │ R10K S1 │ │ │17 │ / │ │ RA0├──●───○ ○────● │ │ │ │ │ │ └────┘ ┴ GND 0.1u/50VのコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system