新聞中心

S3C2440 LCD字符顯示

作者: 時(shí)間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
其實(shí)每一字符就是一幅圖像,字符的大小對(duì)應(yīng)于圖像的大小,字符的筆畫對(duì)應(yīng)于圖像的內(nèi)容。那么如何把字符轉(zhuǎn)換為圖像呢?簡(jiǎn)單的方法是使用“字模提取”之類的軟件,它能夠把任意的字符轉(zhuǎn)換為一個(gè)字節(jié)型的數(shù)組,數(shù)組元素中的每一位代表LCD上的一個(gè)像素點(diǎn),當(dāng)為1時(shí),表示該位置為字符的一個(gè)筆畫,需要上色,而為0時(shí),表示不是筆畫,學(xué)過12864無(wú)字庫(kù)液晶的相信肯定會(huì)使用LCD字符顯示。比較簡(jiǎn)單,貼兩個(gè)函數(shù)僅供參考。

  1. /**************************************************************
  2. *在LCD屏幕上指定坐標(biāo)點(diǎn)寫ASCII碼(8X16)
  3. *取模方式為陰碼逐行式順向十六進(jìn)制數(shù)C51格式(使用軟件為(PCtoLCD2002))
  4. *參數(shù)x,y為字符左上點(diǎn)坐標(biāo)
  5. *c為字體顏色bk_c為字體背景色
  6. *st為1時(shí)不使用背景色為0時(shí)使用背景色
  7. *pZK為字符的數(shù)組
  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屏幕上指定坐標(biāo)點(diǎn)寫漢字(16X16)
  36. *取模方式為陰碼逐行式順向十六進(jìn)制數(shù)C51格式(使用軟件為(PCtoLCD2002))
  37. *參數(shù)x,y為漢字左上點(diǎn)坐標(biāo)
  38. *c為字體顏色bk_c為字體背景色
  39. *st為1時(shí)不使用背景色為0時(shí)使用背景色
  40. *pZK為漢字的數(shù)組
  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. }


如果要在程序中顯示大量的中文字符,是不是要把這些字符都取模啊?回答是肯定的,但前人已經(jīng)為我們完成了這一步,做成了數(shù)據(jù)庫(kù),并且進(jìn)行了編碼,只要按照編碼規(guī)則調(diào)用該庫(kù)文件,就可以檢索到相要的字符。下面就來說說編碼規(guī)則:每個(gè)漢字是由兩個(gè)字節(jié)表示的,前一個(gè)字節(jié)表示的區(qū)號(hào),后一個(gè)字節(jié)表示的位號(hào),那么漢字在漢字庫(kù)中的位置為:94×(區(qū)號(hào)-1)+(位號(hào)-1)。94表示的是每個(gè)區(qū)里一共有94個(gè)漢字,減1表示的是數(shù)組是從0開始,而區(qū)號(hào)和位號(hào)是從1開始的。具體到漢字在某一數(shù)據(jù)庫(kù)中的位置,還需要乘以一個(gè)漢字字模所占的字節(jié)數(shù),即[94×(區(qū)號(hào)-1)+(位號(hào)-1)]×一個(gè)漢字字模所占字節(jié)數(shù)。如一個(gè)字模大小為16×16的宋體數(shù)據(jù)庫(kù),庫(kù)里每個(gè)漢字所占的字節(jié)為16×16÷8=32,則每個(gè)漢字在該宋體數(shù)據(jù)庫(kù)中的位置為:[94×(區(qū)號(hào)-1)+(位號(hào)-1)]×32。ASCII碼的字符調(diào)用比漢字字符要簡(jiǎn)單,只要把它乘以字模所占字節(jié)數(shù)即可找到該字符所在字庫(kù)的位置,如8×16的ASCII字庫(kù),ASCII碼在該字庫(kù)的位置為ASCII×16。如果中文字符和ASCII碼混合在一樣,如何區(qū)分它們呢?其實(shí)也很簡(jiǎn)單,ASCII碼的最高位是0,而中文的最高位是1,因此當(dāng)讀取到的一個(gè)字節(jié)的最高位是0,則該字節(jié)為ASCII碼,它的下一個(gè)字節(jié)與這個(gè)字節(jié)無(wú)關(guān);當(dāng)取得到的字節(jié)的最高位是1,則表示的是中文字符,并且該字節(jié)與它的下一個(gè)字節(jié)組合在一起表示完整的一個(gè)漢字。每個(gè)漢字及符號(hào)以兩個(gè)字節(jié)來表示。第一個(gè)字節(jié)稱為“高位字節(jié)”(也稱“區(qū)字節(jié))”,第二個(gè)字節(jié)稱為“低位字節(jié)”(也稱“位字節(jié)”)。

本文引用地址:http://m.butianyuan.cn/article/201611/319209.htm

貼出使用字庫(kù)顯示漢字和字符的代碼

[cpp]view plaincopy
  1. /**************************************************************
  2. 在LCD屏幕上指定坐標(biāo)點(diǎn)寫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屏幕上指定坐標(biāo)點(diǎn)寫漢字
  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個(gè)漢字或字符
  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. casen:
  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. }



關(guān)鍵詞: S3C2440LCD字符顯

評(píng)論


技術(shù)專區(qū)

關(guān)閉