- ベストアンサー
SW入力のプログラムについて
- プログラミング初心者の疑問点
- 緑色のヶ所をなぜ「VolUpSw=1;」としているのか?
- タイマー割り込みによるSW入力のプログラムの詳細
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
コンパイラがちゃんとCの規格に沿っていれば、静的領域の変数は実行時に暗黙的に0初期化されます。 どちらかというと、多重割込みを許した場合に連続で割込みが入ってきてもちゃんと動作する、というのを意図しているような気がしますねぇ。
その他の回答 (3)
- R32C
- ベストアンサー率39% (115/290)
あんまりこのコードを追うのもどうかと思う。 たぶん、volumeが、出力データだと思うけど、結局 0にしかならない し、正しく制御されているように思えない。 また、多重割込みを利用するにしても、volumeは一時的に -8されてから、0に戻すというヘンテコな処理をしていますね。 多重割込みを許すなら、 if (Volume < 8 ) Volume = 0; else Volume -=8; と書かないと突然変な値をとる場合があって問題です。 なので、このコードを書いた人のスキルを疑ってみてもよいと 思います。 まぁそういう悪い例の問題を出されたのかもしれませんが。
- D-Matsu
- ベストアンサー率45% (1080/2394)
処理自体がタイマー割り込み内ということは、コンペアマッチ辺りで定期的にスイッチ状態を見ていると思っていいですね? まず、スイッチが押されていない状態ではVolUpSwは0です(一番外のelse)。 で、押されると中の最初のifで++VolUpSwが行われ、1になります。 更に次のifで20以上になっていたらボリュームを上げてカウンタクリア、としていますね。 押しっぱなしにしているとVolUpSwの値が上がっていき、カウンタクリア処理が走らなかった場合は最終的にオーバーフローしますが、そうなった場合には255に戻すという処理が入っています。 #但し、普通は通りえない場所のはずです このコードに意図があるとすれば「スイッチを押している間は、VolUpSWは0にならない」という事でしょう。
- pyonmae
- ベストアンサー率64% (40/62)
こんにちは。 もちろん、他人の作ったプログラムなんですよね? はっきり言って、作った人のみぞ知る、といった所ですが・・・。 カンですが、VolUpSw変数も、キーが押されているフラグとして、どこかで使われているのではないでしょうか。 または、オートリピートの時間調整の結果かも知れませんね。(それだったら20の方を変えるか・・・?) 何にしても、コメントを書くか、せめて定数をdefine定義するとかして欲しいですね・・・。
お礼
ご回答ありがとうございます。 ※記載し忘れたのですが、『Volume=0x00で最大音量、Volume=0xFFで最小音量』になります。 ・コメント→ありません。 ・define定義→ volatile uchar SwitchFlag; volatile uchar Volume; volatile uchar VolUpSw; ・VolUpSw変数→他で使用されている形跡はありません。 特別な意図は無さそうですね。
お礼
ご回答ありがとうございます。 ご指摘頂いたヶ所も少し気になっていたのですが、 (1)VolUpSwがオーバーフローした場合、255に戻す→VolUpSwは20に達するとクリアされるので、オーバーフローすることはないのでは? (2)VolUpSwが20以上の場合→VolUpSwが20の場合では? (1)、(2)ともに電源投入時のVolUpSw(変数宣言時に特に値を定めていません)の不定値に対応していると解釈していたのですが、正しいでしょうか?