Hobby Lab 趣味のモノ作り実験のサイトです。
部品 センサー他 LCD_MAR3953 font
1 フォントを描く
 1.1 8×16ドットのフォント
 1.1.1 8×16ドットとは
 1.1.2 ドットとピクセル
 1.1.3 LCDのメモリーマップ
 1.1.4 プログラム上の文字データ
 1.1.5 描画時間
 1.2 その他ドットフォント比較
 1.2.1 比較概要
 1.2.2 比較表
 1.2.3 LCD表示状況
 1.3 フォントをなめらかに
 1.3.1 なめらかにするには
 1.3.2 文字データ量
 1.3.3 文字データ量を減らす
 1.3.4 描画時間と画質比較確認
2 プログラム

 LCD(MAR3953)最初に

Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:OPAMP オペアンプ  LM324
 LM358
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Old Processor他
Ot:Others その他

1 フォントを描く

 1.1 8×16ドットのフォント

 1.1.1 8×16ドットとは

文字を表す横×縦の点数を表現しています。
なぜ8や16が出てくるかと言うと。
コンピューターのデータ処理単位である「1バイト(8ビット)」と技術的な親和性が高く、かつアルファベットや数字を読みやすく表現できる最小単位だったから。
なお漢字は横が8では表現しにくいため、8の倍数である16が最小点になっている。 右図は数字の 9 を拡大したものです。

 1.1.2 ドットとピクセル

これからピクセルと言う言葉が出てくるので、簡単にドットと合わせ説明する。
ピクセルとは、デジタル画像の最小単位(色情報を持つ画素)。
ドットとは、印刷物やモニターにおける物理的な点の粒(物理的な最小単位)。
一般的に、画像データ上では「1ピクセル=1ドット」として扱われます。

 1.1.3 LCDのメモリーマップ

LCD内部では1ドットの色表現をRGBで表現し、その色情報は1ピクセルあたり16bit(2Byte)で表現しています。
このため、1.1で説明したフォントの場合は、8×16(ドット)×2※(ピクセル) = 256(Byte)のメモリーを使用している。
※Byte数は、1Byte=8bitなので
1ピクセルは 16 / 8 = 2になる。
なおピクセル情報の
黒は0x0000、緑は0x07E0です。
また表中のX軸、Y軸に記載の項目はメモリーの相対アドレスを示す。


 1.1.4 プログラム上の文字データ

プログラム上ではできるだけメモリーの使用量を小さくしたい。
文字データはドットの集まりで通常1文字は1つのカラーで表現できるため、ピクセルデータからドットデータになるため容量は以下の様になる
8×16(ドット) / 8 = 16(Byte)にできる。
ちなみに先に説明で表示させた『9』は 右図の様に表され
データの並びは0x00,0x00,0x00,0x18,・・・・・となる
なおプログラムではこの文字データにコードを付けて文字データを呼び出すようにしており、簡単なものとして英数字を表示させる場合昔から使用している アスキーコードを使用して1(Byte)で『0x39』と表記され文字データと対応させているものもある。
受信機プログラムでは不要なアスキーコードが有るため、アスキーコードは使用していない。

 1.1.5 描画時間

SYSCLK_FREQ_96MHz_HSI
関数 Lcd_ShowString (10, 10, Green, Black, "9");で
1文字表示に必要な時間は
360(us)

プログラムについては後で記載する。

 1.2 その他ドットのフォントと比較

 1.2.1 比較概要

表示する文字は『9』で実施する。
(1) 8x16 :比較元の横8ドット、縦16ドットのフォントデータで表示させる場合
  使用関数名 Lcd_ShowString (10, 10, Green, Black, "9");
(2) 2倍 :8x16のデータを×2して16x32のフォントを表示させる場合
  使用関数名 Lcd_ShowString_Resized (26, 10, White, Black, "9", 2);
(3) 16x32:横16ドット、縦32ドットのフォントデータで表示させる場合
  使用関数名 Lcd_16Char(26,42, Green, Black);
(4) 3倍 :8x16のデータを×3して24x32のフォントを表示させる場合
  使用関数名 Lcd_ShowString_Resized (48, 10, White, Black, "9", 3);
(5) 24x48:横24ドット、縦48ドットのフォントデータで表示させる場合
  使用関数名 Lcd_24Char(48,58, Green, Black);
(6) 32x64:横32ドット、縦64ドットのフォントデータで表示させる場合
  使用関数名 Lcd_32Char(96,10, Green, Black);

 1.2.2 比較表

比較概要No(1)(2)(3)(4)(5)(6)
8x162倍16x323倍24x4832x64
LCDメモリ量(Byte)2561,0241,0242,3042,3044,096
MCUメモリ量(Byte)16166416144256
描画時間(ms)0.361.361.393.112.985.5

 1.2.3 LCD表示状況

左から(1)(2)(4)(6)
    (3)(5)

(2)(4)では(1)のフォントデータを2や3倍する方法のため文字が線ではなくドットになっています。
(3)(5)(6)は、(2)(4)より線に近いですが、なめらかな線ではありません。
これをどうするか次で説明します。

 1.3 フォントをなめらかに

例として前項の(5)24×48ドットのフォントで確認していく。

 1.3.1 なめらかにするには

アンチエイリアシングと言う手法を使用します。
アンチエイリアシング(Anti-aliasing)とは、コンピュータ上の画像や文字に現れる「ジャギー」と呼ばれる階段状のギザギザを、境界周辺を中間色で埋めることで滑らかに見せる技術です。
解像度不足による輪郭のガタつきを軽減し、自然な見た目にするため、PCゲーム、3Dグラフィックス、動画編集、印刷などで広く使用されます。
コンピュータでこのような処理をするわけですが、今回はMCUを使用するので、アンチエイリアシング処理したデータを文字データとして使用したいと思います。

 1.3.2 文字データ量

24×48の単色データをアンチエイリアシング処理したデータ
プログラム上の文字データは 1.1.3 で説明したとおり、文字データが単色であることからメモリを省力化するため、ピクセルデータではなくドットの有無データになっています。
それがアンチエイリアシングにより単色でなくなり、多くのカラー情報を入れなければならないため、そのままではLCDのメモリーと同じ容量が必要となり、24×48では1文字につき2.3(KByte)必要となります。
文字データとしては
(1)8×16dドット文字 16×94種類= 数字+幾つかの英文字を24×48で使用すると 2.3(KByte)×20(予定) = 46(KByte)必要となります。
また数字だけになりますが、32×64も使用するとなると 4(KByte)×10 = 40(KByte)で合わせて86(KByte)必要になります。
今回使用する MCU の CH32V203C8T6 では Flash memory が64(KByte)で不足してしまいます。
文字データをSDカードに入れることも考えられますが、受信機の画面では0.1(s)以下の周期で画面の更新をするため間に合わないと考えられるので、文字データの縮小化を考える必要があります。

 1.3.3 文字データ量を減らす

今回受信で使用する大きな文字は緑又は黄などの単色を用いるため、単純に4段階にしてもアンチエイリアシングの効果があるか確認する。 例えばファイル属性 BMP を加工するとして、緑色の文字であれば、下表の様に分けることにする。
(1)4段階の説明
段階データ値RGB参照カラーテーブル
10x000000x0000
0430
20x010x02A0
0850
01280
30x020x0540
01700
02130
40x030x07E0
02550

(2)今までの文字データのおさらい
 比較データ凡例説明
  ① 1.2.1(5)のフォント
  ② アンチエイリアシング処理した色調を4段階に減らしたもの
  ③ アンチエイリアシング処理したピクセルデータRGB16bitのもの

 1.3.4 描画時間と画質比較確認

(1)描画時間
比較内容
描画時間(ms)3.113.092.95
 描画時間の呼び出し関数
  ①Lcd_24Char(48,10, Green, Black);
  ③Lcd_C24char(96,10);
  ②Lcd_C24CopChar(144,10);

(2)画質比較(LCD表示状況)
 左から ①、③、②です。
・①に比べ③②の文字はなめらかになっている。
・②はプログラムメモリ量が③と比べると1/8に削減でき、①の2倍しか増加しない。
以上から受信機プログラムでは②の方法を採用したい。




2 プログラム

MCUはCH32V203C8T6 で MounRiver Studio Ⅱを使用してプログラムしています。




































更新日 2026/04/25 09:33  管理者 平林 剛Hirabayashi Takeshi