您的位置 首页 设计

S3C2440 LCD字符显现

其实每一字符就是一幅图像,字符的大小对应于图像的大小,字符的笔画对应于图像的内容。那么如何把字符转换为图像呢?简单的方法是使用

其实每一字符便是一幅图画,字符的巨细对应于图画的巨细,字符的笔画对应于图画的内容。那么怎么把字符转换为图画呢?简略的办法是运用“字模提取”之类的软件,它能够把恣意的字符转换为一个字节型的数组,数组元素中的每一位代表LCD上的一个像素点,当为1时,表明该方位为字符的一个笔画,需求上色,而为0时,表明不是笔画,学过12864字库液晶的信任必定会运用LCD字符显现。比较简略,贴两个函数仅供参考。

  1. /**************************************************************
  2. *在LCD屏幕上指定坐标点写ASCII码(8X16)
  3. *取模方法为阴码逐行式顺向十六进制数C51格局(运用软件为(PCtoLCD2002))
  4. *参数x,y为字符左上点坐标
  5. *c为字体色彩bk_c为字体背景色
  6. *st为1时不运用背景色为0时运用背景色
  7. *pZK为字符的数组
  8. **************************************************************/
  9. voidLcd_PutASCII(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,unsignedchar*pZK)
  10. {
  11. unsignedshortinti,j;
  12. unsignedcharmask,buf;
  13. for(i=0;i<16;i++)
  14. {
  15. mask=0x80;
  16. buf=pZK[i];
  17. for(j=0;j<8;j++)
  18. {
  19. if(buf&mask)
  20. {
  21. PutPixel(x+j,y+i,c);
  22. }
  23. else
  24. {
  25. if(!st)
  26. {
  27. PutPixel(x+j,y+i,bk_c);
  28. }
  29. }
  30. mask=mask>>1;
  31. }
  32. }
  33. }
  34. /**************************************************************
  35. *在LCD屏幕上指定坐标点写汉字(16X16)
  36. *取模方法为阴码逐行式顺向十六进制数C51格局(运用软件为(PCtoLCD2002))
  37. *参数x,y为汉字左上点坐标
  38. *c为字体色彩bk_c为字体背景色
  39. *st为1时不运用背景色为0时运用背景色
  40. *pZK为汉字的数组
  41. **************************************************************/
  42. voidLcd_PutHZ(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,unsignedchar*pZK)
  43. {
  44. unsignedshortinti,j;
  45. unsignedcharmask,buf;
  46. for(i=0;i<16;i++)
  47. {
  48. //左
  49. mask=0x80;
  50. buf=pZK[i*2];
  51. for(j=0;j<8;j++)
  52. {
  53. if(buf&mask)
  54. {
  55. PutPixel(x+j,y+i,c);
  56. }
  57. else
  58. {
  59. if(!st)
  60. {
  61. PutPixel(x+j,y+i,bk_c);
  62. }
  63. }
  64. mask=mask>>1;
  65. }
  66. //右
  67. mask=0x80;
  68. buf=pZK[i*2+1];
  69. for(j=0;j<8;j++)
  70. {
  71. if(buf&mask)
  72. {
  73. PutPixel(x+j+8,y+i,c);
  74. }
  75. else
  76. {
  77. if(!st)
  78. {
  79. PutPixel(x+j+8,y+i,bk_c);
  80. }
  81. }
  82. mask=mask>>1;
  83. }
  84. }
  85. }

假如要在程序中显现很多的中文字符,是不是要把这些字符都取模啊?答复是必定的,但前人现已为咱们完成了这一步,做成了数据库,而且进行了编码,只需依照编码规矩调用该库文件,就能够检索到相要的字符。下面就来说说编码规矩:每个汉字是由两个字节表明的,前一个字节表明的区号,后一个字节表明的位号,那么汉字在汉字库中的方位为:94×(区号-1)+(位号-1)。94表明的是每个区里一共有94个汉字,减1表明的是数组是从0开端,而区号和位号是从1开端的。详细到汉字在某一数据库中的方位,还需求乘以一个汉字字模所占的字节数,即[94×(区号-1)+(位号-1)]×一个汉字字模所占字节数。如一个字模巨细为16×16的宋体数据库,库里每个汉字所占的字节为16×16÷8=32,则每个汉字在该宋体数据库中的方位为:[94×(区号-1)+(位号-1)]×32。ASCII码的字符调用比汉字字符要简略,只需把它乘以字模所占字节数即可找到该字符地点字库的方位,如8×16的ASCII字库,ASCII码在该字库的方位为ASCII×16。假如中文字符和ASCII码混合在相同,怎么区别它们呢?其实也很简略,ASCII码的最高位是0,而中文的最高位是1,因而当读取到的一个字节的最高位是0,则该字节为ASCII码,它的下一个字节与这个字节无关;当取得到的字节的最高位是1,则表明的是中文字符,而且该字节与它的下一个字节组合在一起表明完好的一个汉字。每个汉字及符号以两个字节来表明。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。

贴出运用字库显现汉字和字符的代码

[cpp]view plaincopy

  1. /**************************************************************
  2. 在LCD屏幕上指定坐标点写ASCII码
  3. **************************************************************/
  4. voidLcd_PutASCII(unsignedintx,unsignedinty,unsignedcharch,unsignedintc,unsignedintbk_c,unsignedintst)
  5. {
  6. unsignedshortinti,j;
  7. unsignedchar*pZK,mask,buf;
  8. pZK=&__VGA[ch*16];
  9. for(i=0;i<16;i++)
  10. {
  11. mask=0x80;
  12. buf=pZK[i];
  13. for(j=0;j<8;j++)
  14. {
  15. if(buf&mask)
  16. {
  17. PutPixel(x+j,y+i,c);
  18. }
  19. else
  20. {
  21. if(!st)
  22. {
  23. PutPixel(x+j,y+i,bk_c);
  24. }
  25. }
  26. mask=mask>>1;
  27. }
  28. }
  29. }
  30. /**************************************************************
  31. 在LCD屏幕上指定坐标点写汉字
  32. **************************************************************/
  33. voidLcd_PutHZ(unsignedintx,unsignedinty,unsignedshortintQW,unsignedintc,unsignedintbk_c,unsignedintst)
  34. {
  35. unsignedshortinti,j;
  36. unsignedchar*pZK,mask,buf;
  37. pZK=&__CHS[(((QW>>8)-1)*94+(QW&0x00FF)-1)*32];
  38. for(i=0;i<16;i++)
  39. {
  40. //左
  41. mask=0x80;
  42. buf=pZK[i*2];
  43. for(j=0;j<8;j++)
  44. {
  45. if(buf&mask)
  46. {
  47. PutPixel(x+j,y+i,c);
  48. }
  49. else
  50. {
  51. if(!st)
  52. {
  53. PutPixel(x+j,y+i,bk_c);
  54. }
  55. }
  56. mask=mask>>1;
  57. }
  58. //右
  59. mask=0x80;
  60. buf=pZK[i*2+1];
  61. for(j=0;j<8;j++)
  62. {
  63. if(buf&mask)
  64. {
  65. PutPixel(x+j+8,y+i,c);
  66. }
  67. else
  68. {
  69. if(!st)
  70. {
  71. PutPixel(x+j+8,y+i,bk_c);
  72. }
  73. }
  74. mask=mask>>1;
  75. }
  76. }
  77. }
  78. //———————-
  79. voidLcd_printf(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,char*fmt,…)
  80. {
  81. char__LCD_Printf_Buf[256];//能够显现128个汉字或字符
  82. va_listap;
  83. unsignedchar*pStr=(unsignedchar*)__LCD_Printf_Buf;
  84. unsignedinti=0;
  85. va_start(ap,fmt);
  86. vsprintf(__LCD_Printf_Buf,fmt,ap);
  87. va_end(ap);
  88. while(*pStr!=0)
  89. {
  90. switch(*pStr)
  91. {
  92. case\n:
  93. {
  94. break;
  95. }
  96. default:
  97. {
  98. if(*pStr>0xA0&*(pStr+1)>0xA0)//中文输出
  99. {
  100. Lcd_PutHZ(x,y,(*pStr-0xA0)*0x0100+*(pStr+1)-0xA0,c,bk_c,st);
  101. pStr++;
  102. i++;
  103. x+=16;
  104. }
  105. else//英文输出
  106. {
  107. Lcd_PutASCII(x,y,*pStr,c,bk_c,st);
  108. x+=8;
  109. }
  110. break;
  111. }
  112. }
  113. pStr++;
  114. i++;
  115. if(i>256)break;
  116. }
  117. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/262829.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部