单片机
返回首页

s3c2440裸机-LCD编程-6-LCD上显示字符

2024-07-04 来源:elecfans

1.字库的移植

字符也是由点构成的,一个个点组成的点阵,其实本质上要显示文字就是把字库移植到对应的自己型号相匹配的board上,字库中的每一个字符都是一些点按照对应格式组合成的集合。

从linux内核源码中随便挑选一个字库文件,比如linux-4.18.16/lib/fonts这个目录下就有对应的很多字库文件。在这里我挑选font_8x16.c,如下图:



其中8x16表示每个字符所占的像素点的大小,表示每个字符占的大小为长*宽=8*16个像素点。

我们来看下一个字符'A'是如何显示的?从font_8x16.c我们找到字符'A'的数据,如下图:

那么我们如何让font_8x16.c这个字库的数据显示到lcd上呢?font_8x16.c见附件。


a. 根据要显示的字符的ascii码作为索引,在fontdata_8x16中得到点阵数据

b. 根据点阵来设置对应象素的颜色

c. 根据点阵的某位决定是否描颜色


void fb_print_char(int x, int y, char c, unsigned int color)

{

    int i, j;


    /* 根据c的ascii码作为索引在fontdata_8x16中得到点阵数据(fontdata_8x16是字库的数据集合)*/

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


    unsigned char data;

    int bit;


    /* 根据点阵来设置对应象素的颜色 */

    for (j = y; j < y+16; j++)

    {

        data = *dots++;

        bit = 7;

        for (i = x; i < x+8; i++)

        {

            /* 根据点阵的某位决定是否描颜色 */

            if (data & (1<                fb_put_pixel(i, j, color);

            bit--;

        }

    }

}

在font_8x16.c里面,每个字符占据16字节,因此想要根据ascii码找到对应的点阵数据,需要对应的乘16,再取地址,得到该字符的首地址。


在显示之前,还需要获取LCD参数:


extern const unsigned char fontdata_8x16[];

/* 获得LCD参数 */

static unsigned int fb_base;

static int xres, yres, bpp;

void font_init(void)

{

    get_lcd_params(&fb_base, &xres, &yres, &bpp);

}

2.显示字符串

如果想显示字符串,那就在每显示完一个字符后,x轴加8即可,同时考虑是否超出屏幕显示范围进行换行处理:


/* 'abcnr123' */

void fb_print_string(int x, int y, char* str, unsigned int color)

{

    int i = 0, j;


    while (str[i])

    {

        if (str[i] == 'n')

            y = y+16;

        else if (str[i] == 'r')

            x = 0;


        else

        {

            fb_print_char(x, y, str[i], color);

            x = x+8;

            if (x >= xres)

            {

                x = 0;

                y = y+16;

            }

        }

        i++;

    }

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 分享一个电网倾角计电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 电谐波图形均衡器示意图

    相关电子头条文章