字符取模显示原理

n年前写的,现在忘了,来回顾一下:
下面主要对字符的编码,即把字符转化为字节数组,字符如何显示在屏幕上即字符解码工作做了一些原理性分析,虽然有很多编码和解码方式,这是其中一种,但是最终目的是一样的,就是如何把汉字显示在屏幕上。一下仅供参考。

字符编码原理

图片.png

备注:
表示像素没有上色,用0表示该位。
表示像素上色,用1表示该位。

请看上面图:显示汉字“人”,每一小格表示一个像素,显示“人”字一共用了1616个像素,如果每个像素用1位二进制表示的话,那么一共用1616/8=32个字节表示一个字符。如果像素是从左到右,从上到下的方式扫描的:那么

第一行第一个字节是0x01,第二个字节是0x00;

第二行第一个字节是0x01,第二个字节是0x80;依次类推。

那么我们就会得到这样一个字节数组:const unsigned char ren[]=

{0x01,0x00,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x80,0x04,0x40,0x08,0x60,0x08,0x30,0x10,0x18,0x20,0x0E,0x40,0x04,0x00,0x00}; /"人",0/

这个字节数组就是对各种字符取模的结果,把所有字符拆成一个字节数组,大小为32个字节。

所谓字符取模就是汉字的笔画用一个个像素表示,然后按一定顺序(从左到右,从上到下顺序)将这些像素组成一个字节数组。其中每个字节中的1,表示上色处理(颜色可以自己选择),如》》

,0表示不上色处理(就是,还是默认背景色),如》》
。通过对32位字节分别上色,这样就在屏幕上显示了汉字和其它字符了。

下面是屏幕上显示原理:

//绘制大小为16×16的中文字符,扫描每一行16个像素,一共扫描16行即16*16,

相当于字符解码工作

void Draw_Text16(UINT32 x,UINT32 y,UINT32 color,const unsigned char ch[])

{

// UINT32是自己定义的一个数据类型,相当于int 类型,使用c语言的typedef函数定义数据类型,如typedef  unsigned int UINT32。

//x,y这个坐标是指定在屏幕上哪一个位置显示,const unsigned char  ren[]表示字符取模后的字节数组,color表示上哪一种颜色,如果颜色是8位的那么有256中可供选择

      unsigned short int i,j;

      unsigned char mask,buffer;

     

      for(i=0;i<16;i++)

      {

        //1、i表示行数,每一行16个像素、一共16行,所以每一行16/8=2个字节。

        //2、为什么分成两部分写,因为char类型是8位的,而每一行是16位的,所以就分成第一个字节和第二字节了。

        //3、每个字节8位,所以分别扫描每一位的值是1还是0,如果是1表示要上色,0表示不上色,然后选择要上哪一种颜色。如果不上色颜色选择白色,一般上色选择黑色。相当于这个word 文档显示方式。

        //4、mask不断右移说明要把字节中每一位都要扫描到。

              mask=0x80;                  //掩码

              buffer=ch[i*2];             //提取一行的第一个字节

              for(j=0;j<8;j++)

              {                  

                     if(buffer&mask)

                     {

                           PutPixel(x+j,y+i,color);        //为笔画上色,其实就是把颜色值写到帧内存中相应地址中去,帧就是一幅画面,那么这幅画面就有很多颜色了,每个颜色都有一个固定地址。

                     }

                    mask=mask>>1; //扫描字节的每一位,所以mask每扫描一次,就向右移一位。           

              }

              mask=0x80;                  //掩码,主要是用来扫描每一个字节的每一位是否为1的,如果是1那么就表示要上色,如果为0,表示不上色。

              buffer=ch[i*2+1];         //提取一行的第二个字节

              for(j=0;j<8;j++)

              {                  

                     if(buffer&mask)

                     {

                           PutPixel(x+j+8,y+i,color);          //为笔画上色

                     }

                     mask=mask>>1;                  

              }

      }

}

PutPixel(x+j+8,y+i,color)函数是为笔画上色的,请看下面

//绘制像素点,给每个像素上色

voidPutPixel(U32 x,U32 y, U32 c )

{

// U32和上面分析的UINT数据类型一样。

LCD_BUFFER[y][x] = c;
// LCD_BUFFER数组表示帧内存的起始地址,y,x就是像素的坐标了,c就是颜色的序号,一共256种颜色,每一种颜色的编号是0-255,就是把颜色写到对应的帧内存地址中去。

}

如果把每个像素用一位来表示,按一定顺序扫描(从左到右,从上到下,这样就确定每一位在屏幕上的位置了),如果这一位是1****表示上色,如果是****0表示不上色,如果一个字符在****1616****个像素面积上显示,那么可以用1616/8=32****个字节来表示这个面积上所有的像素,,注意字节的顺序哦(从右到左,从上到下,这些顺序相当于确定这个汉字笔画的相对位置(i****,****j)了)。如果在****LCD****上给出要显示汉字绝对坐标(x****,****y),那么即可确定汉字每一个像素在****LCD****上显示绝对位置(x+i,y+j****),同时也确定汉字在帧内存中位置(地址)。对于上色问题,我们用****32****个字节中每一位是1****还是****0来做标志,如果是****1****,那么把指定的颜色写到其帧内存位置中去,如是0****就不上色,即默认背景颜色写到帧内存地址中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容