• 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
    
    123" */
    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] == '
    ')
    47             y = y+16;
    48         else if (str[i] == '
    ')
    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 }
  • 相关阅读:
    ZoneJS 的原理与应用
    RxJS 中的观察者和迭代器模式
    前端三大框架:数据绑定与数据流
    Angular 的前世今生
    验证Kubernetes YAML的最佳实践和策略
    GitOps初阶指南:将DevOps扩展至K8S
    如何使用Istio 1.6管理多集群中的微服务?
    5个规则,确保你的微服务优化运行
    使用Thanos实现Prometheus指标联邦
    丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
  • 原文地址:https://www.cnblogs.com/-glb/p/11372157.html
Copyright © 2020-2023  润新知