Wei Dongshan Embedded Notes d'introduction - Principes de base du développement d'applications (6)

Chapitre 6 Affichage de texte

6.2 Affichage des caractères de la matrice de points

6.2.1 Affichage des caractères ASCII

1. Le principe de la matrice de points

Pour afficher un caractère ASCII sur l'écran LCD, c'est-à-dire des lettres anglaises, la première étape consiste à trouver la matrice de points correspondant au caractère. Il y a ce fichier dans le code source du noyau Linux: lib \ fonts \ font_8x16.c, qui stocke la matrice de points de chaque caractère sous la forme d'un tableau, tel que:

Le tableau fontdata_8x16 enregistre ces points.
Insérez la description de l'image ici
Chaque caractère de la matrice de points occupe 16 octets, correspondant à 16 lignes de la matrice de points. Chaque bit de chaque ligne de la matrice de points correspond au pixel à la position correspondante sur l'écran LCD, et "0 "signifie désactivé," 1 "signifie allumé, par exemple, la figure ci-dessous est une matrice de points de" A ":
Insérez la description de l'image ici
comme indiqué sur la figure, le bit4 de la troisième ligne est 1, les pixels y sont allumés et tous les pixels allumé sur l'écran LCD Combinez-les ensemble pour afficher l'apparence des caractères.

Ainsi, lorsque vous souhaitez afficher un caractère, recherchez sa matrice de points dans le tableau fontdata_8x16 en fonction de son code ASCII, puis retirez ces 16 octets pour dessiner 16 lignes de pixels.

Deux, analyse du code source

La fonction principale est void lcd_put_ascii (int x, int y, unsigned char c) , qui affiche le caractère c en bas à droite de la position (x, y) de l'écran LCD. Le code est comme indiqué dans la figure ci-dessous:
Insérez la description de l'image ici
1 . Récupère la matrice de points.
Pour le caractère c, il La méthode d'obtention de la matrice de points est la suivante:

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

Dans le tableau fontdata_8x16, un caractère occupe 16 octets, donc fontdata_8x16 [c * 16] est l'octet de départ de ce caractère, puis l'adresse de départ est affectée aux points du pointeur pour faciliter les appels suivants.

2. Dessinez des points

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) Comme il y a seize lignes, il doit y avoir une grande boucle qui boucle 16 fois en premier, puis il y a 8 bits dans chaque ligne, donc chaque grande boucle a également besoin d'une petite boucle qui boucle 8 fois.

(2) Dans la petite boucle, si le bit est 1, il est rempli de blanc, et si le bit est 0, il est rempli de noir. De cette façon, les lettres anglaises avec fond noir et contours blancs peuvent être affichées.

(3) Pour juger si un certain bit est 0 ou 1, vous devez extraire les informations de ce bit à travers la phase et. Les phrases suivantes sont utilisées dans le code source pour juger:

if (byte & (1<<b))

Par exemple, b = 2, puis extraire bit2: et la matrice de points et 00000100

(4) Pour afficher la couleur, utilisez la fonction de point de dessin précédemment obtenue lcd_put_pixel, le coin supérieur gauche d'une matrice de points est (x, y), puis la position de la position b dans la i-ème ligne est (x + 7-b, y + i)

3. Fonction principale Dans la
fonction principale, ouvrez d'abord le périphérique LCD, obtenez les paramètres Framebuffer et implémentez la fonction lcd_put_pixel, puis appelez lcd_put_ascii pour dessiner des caractères. code montrer comme ci-dessous:

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. Compilez la
commande de compilation show_ascii.c du fichier c : arm-linux-gnueabihf-gcc -o show_ascii show_ascii.c
Remarque: Le préfixe de l'outil de compilation peut être différent pour différentes cartes.

5. Expérience sur l'ordinateur
Mettez le programme show_ascii sur le tableau et exécutez la commande: ./show_ascii
Si l'expérience est réussie, nous verrons une lettre blanche «A» affichée au milieu de l'écran.

6. Devoirs après la classe
Modifiez la fonction lcd_put_ascii pour spécifier la couleur des caractères.
Réalisez la fonction lcd_put_str, sortez la chaîne, vous pouvez envelopper.
Réalisez l'affichage des caractères chinois sur la base de show_ascii.c: trouvez la bibliothèque de caractères chinois, comprenez l'ordre de disposition des pixels et récupérez le code des caractères chinois.

Je suppose que tu aimes

Origine blog.csdn.net/San_a_fish_of_dream/article/details/113829587
conseillé
Classement