こんばんは 鈴木さんが既に指摘されておられますが、補足情報。 > 4)プログラムの考え方について > LCD_DisplayNumber(n)が、メインと割込みの2箇所にでて > きますが、割り込みの中にまとめた方が良いのでは? > メインルーチン(永久ループ)では、条件判断により常に > 何かを表示する?LCDの表示ルーチン?が呼ばれていま > すが、逆に言うと割込みが入らない間はひっきりなしに呼ば > れ続けられています。 > できれば、メインルーチンは何も書かず、割込みの中で何を > 表示するかを決めてLCDのルーチンを呼んだ方がわかり易い > かと思います。 > 尚、割込みルーチンの中で使う変数はスタティック変数で宣言 > しないと内容が保持されませんので注意して下さい。 C言語の関数は、デフォルトでリエントラント(再入可能)に コンパイルされます。 その結果、メイン処理中で、関数LCD_DisplayNumber()を実行の途中で、 (タイマー)割り込みが入ると、割り込み処理の中で、同じ、LCD_DisplayNumber() が同関数の先頭から実行されてしまいます。 LCD_DisplayNumber()がLCDコントローラ制御信号線のアサート /ネゲートする処理をやっていると仮定すると、その信号シーケンス が、(タイマー)割り込みの瞬間に崩れてしまい、その結果 LCD表示が正しく動作しなくなる可能性があると思われます。 このリエントラントの動きを防止するには、ひとつの簡単なやり方には、 メイン処理で、関数LCD_DisplayNumber()をCALLする直前で、 タイマー割り込みをマスクし、同関数のCALL終了後 タイマー割り込みのマスクを解除します。 ほか、気づいた点として、割り込みを解除してからタイマーの初期設計 をやられていますが、考え方としては、処理の順が逆で、 初期設定を完了してから、割り込みを解除します。 そうしないと、初期化処理内容にもよりますが、初期設定にある種の設定確定 時間が必要な場合、割り込み処理が動作した場合、その時間遅れを発生し、初期設定失敗の 原因になりえます。(今回該当するわけではなさそうですが、ハード制御の 初期設定処理の基礎的ノウハウの一つと思います。) dimension