FC2ブログ
2017-11-06 18:41 | カテゴリ:PIC応用回路
さらにライブラリーを製作しています。

時計文字盤の大きさに合うように、ドット数を小さくした数字(3x5ドット)を任意の位置に書き込む関数と、以前に製作したASCIIコードから文字ドットパターン(5x7)を取得して、任意の位置に表示する関数を製作しました。


(小さい文字の表示例)
MTX50.jpg



続きは、、、、、


小さな時計文字盤にフィットする数字フォントを表示する関数です。

//---------------------------------------------------------------------------
// 指定された配列の文字盤数字パターンtm(8x8)を指定位置(x、y)に
// 出力する。LEDからはみ出す部分は無視
//---------------------------------------------------------------------------

void Set_Clock_time(unsigned char Ptn[][8], int x, int y, int tm) {
int N, M, L, K;
unsigned char Temp, TP1, TP2;

cnt2 = 7;
N = x / 8;
L = y / 8;
K = x % 8;
M = y % 8;


// xy座標から、LEDの場所を計算しています。

if (K == 0) {// 文字がLEDをまたがず、フィットする場合
St01:
Data_Buff[L][N][M] = revers_bit8(Ptn[tm][cnt2]); //格納時にビットのMSBとLSBを反転
cnt2 = cnt2 - 1;
if (cnt2 < 0) return;
M = M + 1;
if (M < 8) goto St01;
M = 0;
L = L + 1;
if (L < 4) goto St01;
return;

} else {// 文字がLEDをまたぐ場合

St02:
TP1 = revers_bit8(Data_Buff[L][N][M]);
TP1 = TP1 >> K;
TP1 = TP1 << K;
TP2 = Ptn[tm][cnt2] >> K;
Data_Buff[L][N][M] = revers_bit8(TP1 | TP2);
cnt2 = cnt2 - 1;
if (cnt2 >= 0) {
M = M + 1;
if (M < 8) goto St02;
M = 0;
L = L + 1;
if (L < 4) goto St02;
}

N = N + 1;
if (N >= 4) return;

cnt2 = 7;
M = y % 8;
L = y / 8;
St03:
TP1 = revers_bit8(Data_Buff[L][N][M]);
TP1 = TP1 << K;
TP1 = TP1 >> K;
TP2 = Ptn[tm][cnt2] << (8 - K); // 注意
Data_Buff[L][N][M] = revers_bit8(TP1 | TP2);
cnt2 = cnt2 - 1;
if (cnt2 < 0) return;
M = M + 1;
if (M < 8) goto St03;
M = 0;
L = L + 1;
if (L < 4) goto St03;
return;
}
return;
}



また、これに与えるフォントの配列を定義していきます。



//=====================================================
// 時計文字板数字個別表示用データ(8x8の内3x5を使用)
// 数字の周りは非点灯のまま
//=====================================================
const unsigned char CF_data[15][8] = {
{
0b00000000, // ダミー
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
},
{
0b00001000, // 1
0b00001000,
0b00001000,
0b00001000,
0b00001000,
0b00000000,
0b00000000,
0b00000000
},
{
0b00011100, // 2
0b00000100,
0b00011100,
0b00010000,
以下省略します。


8x8のドットのうち、3x5を使用しています。


次にASCIIコードを表示する関数です。


//----------------------------------------------------------
// 指定された配列のパターン(8x8)を指定位置(x、y)に
// 出力する。LEDからはみ出す部分は無視
//----------------------------------------------------------

void Set_Ascii_Chr(unsigned char Aptn[8], int x, int y) {
int N, M, L, K;
unsigned char Temp, TP1, TP2;

cnt2 = 0;
N = x / 8;
L = y / 8;
K = x % 8;
M = y % 8;

if (K == 0) {// 文字がLEDにフィットする場合
St01:
Data_Buff[L][N][M] = Aptn[cnt2]; //格納時にビット位置反転
cnt2 = cnt2 + 1;
if (cnt2 > 7) return;
M = M + 1;
if (M < 8) goto St01;
M = 0;
L = L + 1;
if (L < 4) goto St01;
return;

} else {// 文字がLED境界をまたぐ場合

St02:
TP1 = Data_Buff[L][N][M];
TP1 = TP1 << (8 - K);
TP1 = TP1 >> (8 - K);
TP2 = Aptn[cnt2] << K;
Data_Buff[L][N][M] = TP1 | TP2;
cnt2 = cnt2 + 1;
if (cnt2 <= 7) {
M = M + 1;
if (M < 8) goto St02;
M = 0;
L = L + 1;
if (L < 4) goto St02;
}

N = N + 1;
if (N >= 4) return;

cnt2 = 0;
M = y % 8;
L = y / 8;
St03:
TP1 = Data_Buff[L][N][M];
TP1 = TP1 >> (8 - K);
TP1 = TP1 << (8 - K);
TP2 = Aptn[cnt2] >> (8 - K); // 注意
Data_Buff[L][N][M] = TP1 | TP2;
cnt2 = cnt2 + 1;
if (cnt2 > 7) return;
M = M + 1;
if (M < 8) goto St03;
M = 0;
L = L + 1;
if (L < 4) goto St03;
return;
}
return;
}

基本的な考え方は同じです。

MTX51.jpg


これで製作した例です。

MTX52.jpg


次回は、ちょっと横道ですが、昔のTVゲームのテニスゲームの様にドットを縦横斜めに移動させる関数をご紹介する予定です。

関連記事

管理者のみに表示する