アニメ『タイムボカン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)」の、クロックの精度を上げたいと思います。 […]