Wei Dongshan Embedded Introductory Notes-アプリケーション開発の基礎(6)

第6章テキスト表示

6.2ドットマトリックス文字の表示

6.2.1ASCII文字の表示

1.ドットマトリックスの原理

LCDにASCII文字、つまり英字を表示するには、最初のステップは、文字に対応するドットマトリックスを見つけることです。Linuxカーネルのソースコードに次のファイルがあります:lib \ fonts \ font_8x16.c。これは、各文字のドットマトリックスを次のような配列の形式で格納します。

配列fontdata_8x16は、これらのドットを記録します。
ここに画像の説明を挿入します
ドットマトリックスの各文字は16バイトを占め、ドットマトリックスの16行に対応します。ドットマトリックスの各行の各ビットは、LCDの対応する位置のピクセルに対応し、「0 「」はオフを意味し、「1」は点灯を意味します。たとえば、次の図は「A」のドットマトリックスです。
ここに画像の説明を挿入します
図に示すように、3行目のビット4は1で、点灯しているピクセル、およびすべてのピクセルです。 LCDで点灯それらを組み合わせて、キャラクターの外観を表示します。

したがって、文字を表示する場合は、ASCIIコードに従ってfontdata_8x16配列でドットマトリックスを見つけ、これらの16バイトを取り出して16行のピクセルを描画します。

2、ソースコード分析

コア関数はvoidlcd_put_ascii(int x、int y、unsigned char c)で、LCDの(x、y)位置の右下に文字cを表示します。コードは次の図のようになります
ここに画像の説明を挿入します
。1 。ドットマトリックスを取得します。
文字cの場合、ドットマトリックスを取得する方法は次のとおりです。

unsigned char *dots = (unsigned char *)&fontdata_8x16[c*16];

fontdata_8x16配列では、文字が16バイトを占めるため、fontdata_8x16 [c * 16]がこの文字の開始バイトになり、その後の呼び出しを容易にするために開始アドレスがポインタードットに割り当てられます。

2.ポイントを描く

for (i = 0; i < 16; i++)
{
    
    
	byte = dots[i];
	for (b = 7; b >= 0; b--)
	{
    
    
		if (byte & (1<<b))
		{
    
    
			/* show */
			lcd_put_pixel(x+7-b, y+i, 0xffffff); /* 白 */
		}
		else
		{
    
    
			/* hide */
			lcd_put_pixel(x+7-b, y+i, 0); /* 黑 */
		}
	}
}

(1)16行あるため、最初に16回ループする大きなループが必要であり、次に各行に8ビットが必要です。したがって、各大きなループにも8回ループする小さなループが必要です。

(2)小さなループでは、ビットが1の場合は白で塗りつぶされ、ビットが0の場合は黒で塗りつぶされます。これにより、背景が黒で輪郭が白の英字を表示できます。

(3)あるビットが0か1かを判断するには、フェーズとを通じてそのビットの情報を抽出する必要があります。ソースコードでは、次の文を使用して判断します。

if (byte & (1<<b))

たとえば、b = 2の場合、bit2:とドットマトリックスおよび00000100を抽出します。

(4)色を表示するには、以前に取得した描画ポイント関数lcd_put_pixelを使用します。ドットマトリックスの左上隅は(x、y)であり、i番目の行のb位置の位置は(x + 7-b、y + i)

3.メイン関数
メイン関数では、最初にLCDデバイスを開き、フレームバッファーパラメーターを取得し、lcd_put_pixel関数を実装します。次に、lcd_put_asciiを呼び出して文字を描画します。コードは次のように表示されます。

int main(int argc, char **argv)
{
    
    
	fd_fb = open("/dev/fb0", O_RDWR); 
	if (fd_fb < 0)
	{
    
    
		printf("can't open /dev/fb0\n"); 
		return -1;
	}
	if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
	{
    
    
		printf("can't get var\n"); 
		return -1;
	}

	line_width = var.xres * var.bits_per_pixel / 8; 
	pixel_width = var.bits_per_pixel / 8;
	screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
	fbmem = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); 
	if (fbmem == (unsigned char *)-1)
	{
    
    
		printf("can't mmap\n"); 
		return -1;
	}

	/* 清 屏 : 全 部 设 为 黑 色 */ 
	memset(fbmem, 0, screen_size);
	lcd_put_ascii(var.xres/2, var.yres/2, 'A'); /*在屏幕中间显示8*16的字母A*/ 
	munmap(fbmem , screen_size);
	close(fd_fb);
	return 0;
}

4. c file show_ascii.c
コンパイルコマンドをコンパイルします。arm -linux-gnueabihf-gcc-oshow_asciishow_ascii.c
注:コンパイルツールのプレフィックスは、ボードごとに異なる場合があります。

5.コンピューターでの実験
show_asciiプログラムをボードに置き、次のコマンドを実行します。./show_ascii
実験が成功すると、画面の中央に白い文字「A」が表示されます。

6.クラス後の宿題
lcd_put_ascii関数を変更して、文字の色を指定します。
lcd_put_str関数を実現し、文字列を出力して、折り返すことができます。
show_ascii.cに基づいて漢字の表示を実現します。漢字ライブラリを見つけ、ピクセルの配置順序を理解し、漢字コードを取得します。

おすすめ

転載: blog.csdn.net/San_a_fish_of_dream/article/details/113829587