LCD编程_显示文字

在上篇博客中,实现了画点操作,然后在画点的基础上实现了画线、画圆的操作。实际上显示文字也是在画点的基础上实现的。

文字是由点组成的,那么这些点阵是在哪里获得的呢?

随便打开一个内核文件,搜索font,会出来很多文件。在此,选择font_8*16.c。

字符A就显示出来了,这就是文字的显示原理。

首先看一下,观察fontdata_8*16这个数组里面的内容,会发现:

当ascII为0时,占据16个字节。在数组中的初始索引为0

当ascII为1时,占据16个字节。在数组中的初始索引为16

当ascII为c时,在数组中的索引为C*16

如上图所示,每行中有8个像素,每个像素是否显示由点阵中的一个字节决定。

因此在程序中,可以做一个循环,逐行扫描。

 1 extern const unsigned char fontdata_8x16[];
 2 /* 获得LCD参数 */
 3 static unsigned int fb_base;
 4 static int xres, yres, bpp;
 5 
 6 void font_init(void)
 7 {
 8     get_lcd_params(&fb_base, &xres, &yres, &bpp);
 9 }
10 
11 /* 根据字母的点阵在LCD上描画文字 */
12 
13 void fb_print_char(int x, int y, char c, unsigned int color)
14 {
15     int i, j;
16     
17     /* 根据c的ascii码在fontdata_8x16中得到点阵数据 */
18     unsigned char *dots = &fontdata_8x16[c * 16];
19 
20     unsigned char data;
21     int bit;
22 
23     /* 根据点阵来设置对应象素的颜色 */
24     for (j = y; j < y+16; j++)
25     {
26         data = *dots++; /*先将点阵中一行数据取出来,即一个字节,8位。我们需要对这8位数据,依次进行判断,看看是不是需要描点*/
27         bit = 7;
28         for (i = x; i < x+8; i++)
29         {
30             /* 根据点阵的某位决定是否描颜色 */
31             if (data & (1<<bit))
32                 fb_put_pixel(i, j, color);
33             bit--;
34         }
35     }
36 }
37 
38 
39 /* "abc\n\r123" */
40 void fb_print_string(int x, int y, char* str, unsigned int color)
41 {
42     int i = 0, j;
43     
44     while (str[i])
45     {
46         if (str[i] == '\n')
47             y = y+16;
48         else if (str[i] == '\r')
49             x = 0;
50 
51         else
52         {
53             fb_print_char(x, y, str[i], color);
54             x = x+8;
55             if (x >= xres) /* 换行 */
56             {
57                 x = 0;
58                 y = y+16;
59             }
60         }
61         i++;
62     }
63 }

 

posted @ 2019-08-18 13:33  一代枭雄  阅读(1059)  评论(0编辑  收藏  举报