AVRモノリシックチュートリアル——キーの状態

4354 ワード

久しぶりに更新して、今日から続けて、日更を勝ち取ります.
 
今日はボタンについてお話しします.開発ボードの右下に4つのボタンがあり、押すと明らかに「カチカチ」という音がします.キーが押されているかどうかを検出するにはどうすればいいですか?まず、キーを直接または間接的に単片機に接続します.従来使用していた4つのLEDとは異なり、4つのボタンは全てモノリシックマシンに接続されていなかった--左側の2つは接続されており、右側の2つはボタンの上にB 2、B 3と表示されたインターフェース(左からB 0、B 1、B 2、B 3)を介して引き出されている.B 2、B 3を使用する場合は、デュポン線で16個のモノリシックマシン引き出しピンに接続されている.
開発ボードライブラリのキーに関連する関数は、ライブラリ関数マニュアルで定義されています.1.1バージョンのライブラリでは、ボタンなどのデバイスを列挙タイプで表す代わりに、整数とマクロ定義は使用されなくなりました(ただし、整数でも互換性があります).Atmel Studio 7.0でコードを書くと、エディタは関数インタフェースをプロンプトし、パラメータタイプに応じて何を書くべきかを知ることができます.
シングルチップマシンでは、キーは入力装置です.プログラムには0個以上の入力があり、1つ以上の出力がありますが、私たちが学んだ唯一の出力装置はLEDです.だから当然、今日はボタンでLEDを制御します:ボタンを押して、LEDが点灯します;キーを上げ、LEDをオフにする.4つのボタンはそれぞれ4つのLEDに対応しています.
まず、1つのボタンと1つのLEDだけを考慮した簡単なバージョンを実現します.
プログラムの流れは:先に初期化します;そしてメインサイクルでbutton_down関数はボタンが押されたかどうかを検出する.押すと、LEDが点灯します.そうしないと明るくなりません.考えてみればLEDの明るさと暗さはbutton_down関数の戻り値.
 1 #include 
 2 #include 
 3 
 4 int main(void)
 5 {
 6     led_init();
 7     button_init(PIN_NULL, PIN_NULL);
 8     while (1)
 9         led_set(LED_RED, button_down(BUTTON_0));
10 }

点灯したLEDについてledを呼び出すと思いますsetを明るくすると問題がありますか?答えはできない.では、すでに点灯している以上、変数を設定して点灯しているかどうかを保存してもいいですか?もちろんいいですが、このような変数を維持するよりも、ledを呼び出す頭がないほうがいいかもしれません.setは早く来ます.LEDについてはそうですが、すべてのデバイスがそうではないので、出会ってからにしましょう.
4つのボタンのバージョンを実現します.以上のループ中のコードを4回コピーすることは可能であるが,これは不良コードの表現である.LEDとボタンを表す列挙定数を配列で格納し,配列に対して以上のループ体を遍歴することができるが,これも必要ない.ヘッダーファイルには、LED_RED 、 BUTTON_0等列挙定数(1.0バージョンではマクロ)は0から始まる数字なので、for文のiで問題を解決できます.
 1 #include 
 2 #include 
 3 
 4 int main(void)
 5 {
 6     led_init();
 7     button_init(PIN_0, PIN_1);
 8     while (1)
 9     {
10         for (int i = 0; i != BUTTON_COUNT; ++i)
11             led_set(i, button_down(i));
12     }
13 }

注意B 2、B 3をそれぞれポート0、1に接続します.もちろん接続ポートを変更できますが、初期化パラメータも変更します.
上のコードでは変数iの上限はBUTTON_COUNT - 1 .どうしてLEDじゃないの?COUNTは?実はそうです.それらは等しいです.しかし、私たちはそれらが永遠に等しいことを保証することはできません.ある日、開発ボード2.0には8つのボタンがあり、LEDは4つであることを想定し、led_setの最初のパラメータは不合理です(ライブラリ関数はこの問題を処理していますが).私たちはここで両者の中で小さい値を書く必要がありますか?必要ありません.その1つは、開発者は世界で最も賢い生物で、彼らは(中の部分)これらの問題をうまく処理することができます;その2、ソフトウェアに比べて、ハードウェアは相対的に安定していて、ハードウェアが変更する時、ソフトウェアは往々にして書き換える必要があって、上限の判断で解決することができません;その3、初心者として、あなたが今日書いたコードは、1ヶ月後にとても簡単だと感じて、後でこのようなコードはすべて手当たり次第で、ここで多重性がないことを考慮します必要です.
 
キーの状態を読み取る方法を学びました.しかし、ボタンが押される動作に関心がある場合がありますが、動作は1つの状態だけでは表現できません.次のチュートリアルでは、実装案を紹介します.