新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440 LCD字符顯示

        S3C2440 LCD字符顯示

        作者: 時間:2016-11-21 來源:網絡 收藏
        其實每一字符就是一幅圖像,字符的大小對應于圖像的大小,字符的筆畫對應于圖像的內容。那么如何把字符轉換為圖像呢?簡單的方法是使用“字模提取”之類的軟件,它能夠把任意的字符轉換為一個字節型的數組,數組元素中的每一位代表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,則表示的是中文字符,并且該字節與它的下一個字節組合在一起表示完整的一個漢字。每個漢字及符號以兩個字節來表示。第一個字節稱為“高位字節”(也稱“區字節)”,第二個字節稱為“低位字節”(也稱“位字節”)。

        本文引用地址:http://www.104case.com/article/201611/319209.htm

        貼出使用字庫顯示漢字和字符的代碼

        [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. 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. }



        關鍵詞: S3C2440LCD字符顯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 徐汇区| 贵溪市| 翁牛特旗| 新竹县| 敦煌市| 独山县| 麻城市| 勃利县| 保山市| 襄垣县| 金寨县| 名山县| 沾益县| 扎囊县| 喀什市| 新和县| 宝兴县| 蒙山县| 明溪县| 西华县| 安乡县| 夏津县| 上蔡县| 鹤岗市| 庆安县| 巴林右旗| 桑日县| 濮阳县| 敖汉旗| 潮安县| 车险| 竹山县| 杭锦后旗| 南漳县| 兴文县| 辽阳县| 开封县| 从化市| 孝昌县| 张家界市| 百色市|