アニメ『タイムボカン24』
昔見てた『タイムボカン』とは違うものですね。今風のかわいいキャラになっていますが、むず痒さを感じます。3悪も登場しますが、キャラが薄い気が。でも、設定は面白いんですよね。世間が知っている歴史は間違った歴史で、でも、真実が暴かれると、教科書を変えないといけないから、企業人の3人組が真実を暴かれないように頑張るっていう。説明が3悪視点ですが。。。
キャラクタLCDに時計を表示します。
「ポート制御にビットフィールドを使う」で作ったプログラムを改造します。今回は時計とまではいかなくて、時を刻むだけのものです。
元のソースです。
int main(void) { clcd_init(); clcd_print("Bit Field!!"); while(1) ; return 0; }
まず、時を刻み続けたいので、whileの中に、キャラクタLCDへの表示処理を入れます。1秒毎に表示更新するため、_delay_ms(1000)とします。
int main(void) { char str[10]; clcd_init(); str[0] = '0'; str[1] = '0'; str[2] = ':'; str[3] = '0'; str[4] = '0'; str[5] = ':'; str[6] = '0'; str[7] = '0'; str[8] = 0; while(1){ clcd_print(str); _delay_ms(1000) } return 0; }
まだこの段階では00:00:00しか表示されません。しかも、ディスプレイのカーソルを左端に戻していないので、00:00:00の表示は、どんどん増えていきます。
では、カーソル位置を左端に戻すため文字列表示前にコマンドを発行します。ただし、カーソルを戻す時間分待つ必要があるので、_delay_ms(2)を追加します。時間の辻褄を合わせるため_delay_ms(1000)の方は、998にしています。
while(1){ /* Return Home RS,RW DB7---4 DB3---0 */ COMMAND(0,0, 0,0,0,0, 0,0,1,0); _delay_ms(2); clcd_print(str); _delay_ms(998) }
次に数値を文字列にする関数を作りましょう。2桁限定ですが、時間を表すために使うだけなのでこれで十分です。
char* to_string(char *str, int num) { if(num >= 10){ *str++ = (num / 10)+'0'; num %= 10; }else{ *str++ = '0'; } *str++ = num +'0'; *str = 0; return str; }
時分秒それぞれ数値を文字列にする関数も用意しておきます。
void get_clock_string(char *str, int h, int m, int s) { str = to_string(str,h); *str++ = ':'; str = to_string(str,m); *str++ = ':'; str = to_string(str,s); }
最終的に、main関数はこのようになりました。マイコンを起動すると、00:00:00から時を刻み始めます。
int main(void) { char str[10]; int h,m,s; h=0; m=0; s=0; clcd_init(); while(1){ /* Return Home RS,RW DB7---4 DB3---0 */ COMMAND(0,0, 0,0,0,0, 0,0,1,0); _delay_ms(2); get_clock_string(str,h,m,s); clcd_print(str); _delay_ms(998); if(++s >= 60){ s=0; if(++m >= 60){ m=0; if(++h >= 24){ m=h; } } } } return 0; }
しかし、内部クロックなので精度が良いとは言えません。ストップウォッチと時間がズレてます。
レポジトリ。
~$ git clone https://github.com/takkete/bread.git ~$ cd bread/mcu/avr/attiny2313/device/clock
コメント
[…] ← AVRマイコンでキャラクタLCDに時間を表示する(その1) […]
[…] 「AVRマイコンでキャラクタLCDに時間を表示する(その1)」の、クロックの精度を上げたいと思います。 […]