Notas introductorias integradas de Wei Dongshan: fundamentos del desarrollo de aplicaciones (6)

Capítulo 6 Visualización de texto

6.2 Visualización de caracteres de matriz de puntos

6.2.1 Visualización de caracteres ASCII

1. El principio de la matriz de puntos

Para mostrar un carácter ASCII en la pantalla LCD, es decir, letras en inglés, el primer paso es encontrar la matriz de puntos correspondiente al carácter. Existe este archivo en el código fuente del kernel de Linux: lib \ fonts \ font_8x16.c, que almacena la matriz de puntos de cada carácter en forma de matriz, como por ejemplo:

La matriz fontdata_8x16 registra estos puntos.
Inserte la descripción de la imagen aquí
Cada carácter de la matriz de puntos ocupa 16 bytes, correspondientes a 16 filas de la matriz de puntos. Cada bit en cada fila de la matriz de puntos corresponde al píxel en la posición correspondiente en la pantalla LCD, y "0 "significa Apagado," 1 "significa encendido, por ejemplo, la figura siguiente es una matriz de puntos de'A ':
Inserte la descripción de la imagen aquí
Como se muestra en la figura, el bit4 de la tercera fila es 1, los píxeles están encendidos y todos los píxeles iluminado en la pantalla LCD Combínelos para mostrar la apariencia de los personajes.

Entonces, cuando desee mostrar un carácter, busque su matriz de puntos en la matriz fontdata_8x16 de acuerdo con su código ASCII, y luego saque estos 16 bytes para dibujar 16 filas de píxeles.

Dos, análisis de código fuente

La función principal es void lcd_put_ascii (int x, int y, unsigned char c) , que muestra el carácter c en la parte inferior derecha de la posición (x, y) de la pantalla LCD. El código es como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
1 . Obtener la matriz de puntos.
Para el carácter c, el método de obtención de la matriz de puntos es el siguiente:

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

En la matriz fontdata_8x16, un carácter ocupa 16 bytes, por lo que fontdata_8x16 [c * 16] es el byte inicial de este carácter, y luego la dirección inicial se asigna a los puntos del puntero para facilitar las llamadas posteriores.

2. Dibujar puntos

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) Debido a que hay dieciséis filas, debe haber un bucle grande que se repita 16 veces primero, y luego hay 8 bits en cada fila, por lo que cada bucle grande también necesita un bucle pequeño que se repite 8 veces.

(2) En el bucle pequeño, si el bit es 1 se rellena de blanco y si el bit es 0 se rellena de negro, de esta forma se pueden visualizar letras inglesas con fondo negro y contornos blancos.

(3) Para juzgar si un cierto bit es 0 o 1, necesita extraer la información de ese bit a través de la fase y. Las siguientes oraciones se utilizan en el código fuente para juzgar:

if (byte & (1<<b))

Por ejemplo, b = 2, luego extrae bit2: y la matriz de puntos y 00000100

(4) Para mostrar el color, use la función de punto de dibujo obtenida anteriormente lcd_put_pixel, la esquina superior izquierda de una matriz de puntos es (x, y), luego la posición de la posición b en la fila i-ésima es (x + 7-b, y + i)

3. Función principal En la
función principal, primero abra el dispositivo LCD, obtenga los parámetros Framebuffer e implemente la función lcd_put_pixel, luego llame a lcd_put_ascii para dibujar caracteres. el código se muestra a continuación:

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. Compile el
comando de compilación show_ascii.c del archivo c : arm-linux-gnueabihf-gcc -o show_ascii show_ascii.c
Nota: El prefijo de la herramienta de compilación puede ser diferente para diferentes placas.

5. Experimente en la computadora
Coloque el programa show_ascii en el tablero y ejecute el comando: ./show_ascii
Si el experimento es exitoso, veremos una letra blanca'A ' en el medio de la pantalla.

6. Tarea después de la clase
Modifique la función lcd_put_ascii para especificar el color del carácter.
Realice la función lcd_put_str, genere la cadena, puede envolver.
Realice la visualización de caracteres chinos sobre la base de show_ascii.c: busque la biblioteca de caracteres chinos, comprenda el orden de disposición de los píxeles y obtenga el código de caracteres chinos.

Supongo que te gusta

Origin blog.csdn.net/San_a_fish_of_dream/article/details/113829587
Recomendado
Clasificación