找回密码
 立即注册
搜索
热搜: RA8889 RA8876 RA8875
查看: 509|回复: 0

RA8889/RA8876显示缩进自定义ASCII字符方法

[复制链接]

4

主题

0

回帖

240

积分

版主

积分
240
发表于 2024-4-11 16:33:42 | 显示全部楼层 |阅读模式
本帖最后由 weran 于 2024-7-22 09:50 编辑

正常通过RA8889/RA8876显示到液晶屏上自定义的ASCII字符与字符之间的间距不一,有些字符的空白很大组成的词组不够美观,本文介绍一种在显示ASCII字符的基础上显示缩进ASCII字符的方法。

一、实例效果图
未缩进显示效果:

缩进显示效果:



二、缩进ASCII字库的制作
我这里使用CharacterMatrix打点软件生产ASCII字库,再设计字库的时候需要把每个字符左对齐,字符数量为95个,编码区间0x20~0x7E。


三、演示代码
这样我们可以根据字符的每一列是否有数据计算出每个字符的实际宽度,然后将每个字符的实际宽度值存放到数组当中最会以数组的形式输出打印。


1、计算每个字符的实际宽度值并打印的代码如下:
  1. int main(void)
  2. {
  3.     short i,j,w,h,x=0;
  4.     int arry_addr;//每个字符的首地址
  5.     int contrast=0;//相与的值
  6.     int data_line[24];  //字符点阵每行的值
  7.     int font_real_width[95];//字符的有效范围值
  8.     short one_byte,two_byte,three_byte; //字符点阵每行第一、第二、第三字节的地址
  9.     int data_column,temp_column;//字符点阵每列的数据
  10.     //循环95个字符
  11.     for(i=0;i<95;i++)
  12.     {
  13.                 arry_addr = 72*i;         //字符大小24x24
  14.         //计算字符的每一行的值
  15.         for ( j = 0; j < 24; j++)
  16.         {
  17.             one_byte=arry_addr+3*j;
  18.             two_byte=arry_addr+3*j+1;
  19.             three_byte=arry_addr+3*j+2;
  20.             data_line[j]= Arial_arry[one_byte]<<16|Arial_arry[two_byte]<<8|Arial_arry[three_byte];
  21.         }

  22.         contrast=0x800000;
  23.         //每一列的数据相加是否 == 0
  24.         for ( w = 0; w < 24; w++)
  25.         {   
  26.             for ( h = 0; h < 24; h++)
  27.             {
  28.                 data_column = (data_line[h] & contrast);
  29.                 temp_column = data_column+temp_column;

  30.             }
  31.             if (temp_column == 0)
  32.             {
  33.                 font_real_width[i]=x;
  34.                 x=0;
  35.                 break;   
  36.             }
  37.             contrast=contrast>>1;
  38.             temp_column=0;
  39.             x++;
  40.         }        
  41.     }
  42.     //遍历数组中的有效范围值
  43.     printf("const unsigned font_real_width[95]={");  
  44.     for(int xx= 0; xx < 95; xx++)
  45.     {  
  46.         printf("%d,", font_real_width[xx]);   
  47.     }
  48.     printf("}");  
  49.     printf("\n");
  50. }
复制代码

上述代码输出打印的数组格式如下:


2、利用每个字符的实际宽度控制字符的显示宽度:
  1. for (i=0;i<24;i++)                //循环字符点阵的高  H:24
  2.   {
  3.     //字符编码范围0x20~0x7E   
  4.                 //地址按照24x24字符大小计算
  5.                 font_size=code-0x20;
  6.     array_addr = ((code-0x20)*72)+i*3;           //该字符点阵每一行在数组中的地址   w:24 每一行3个字节  24x24字符大小为72字节
  7.     tmp_char = Arial24x24_table[array_addr]<<16|Arial24x24_table[array_addr+1]<<8|Arial24x24_table[array_addr+2];        //该字符点阵每一行的大小  

  8.                 //原每行24点,实际按照空余表打点   +1字符之间留一个间隙
  9.    for (j=0;j<font_real_width[font_size]+1;j++)
  10.    {
  11.     if ( (tmp_char >>23-j) & 0x01==0x01)   putPixel(x+j,y+i,fgcolor);        //打点前景色  字体颜色
  12.     else        
  13.            {
  14.             if(!bg_transparent)                 putPixel(x+j,y+i,bgcolor);        //非透明色 打点景颜色
  15.      }
  16.    }
  17.   }
复制代码


四、程序流程图

该方法是在制作ASCII字库时将每个字符都左对齐之后再生产字符点阵数组,然后利用算法将点阵中每个字符的实际宽度计算出来以数组的格式进行输出打印,最后将制作好的ASCII字库和字符实际宽度的数组放在MCU的FLASH中进行引用,通过编码即可索引,并调用相应字符的数据及字符对应实际宽度值,通过RA8889/RA8876描点显示出来。

ASCII字库和字符实际宽度的数组文件:


五、源代码下载






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Lcdvision Technology ( 苏ICP备10203891号 )

GMT+8, 2024-11-1 10:28 , Processed in 0.072511 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表