lcd顯示漢字——取模加顯示

1、顯示漢字,有專門的的字庫,但是漢字很多,每一個漢字都需要專門的編碼,需要更大的存儲空間存放字庫,因此需要外部 flash

2、無論是漢字還是英文,顯示的原理都是一樣的——都是像素點的亮滅,顯示出我們想要的形狀,不同lcd的分辨率會有不一樣。

像素點展示

3、如同上面一個漢字“實”,編碼如下(陰碼——1為亮,0為滅;陽碼——1為滅,0為亮)

{0x08,0x20,0x30,0x21,0x20,0x21,0x21,0x22,0x28,0xE2,0x26,0x24,0xA0,0x28,0x60,0x30,

 0x2F,0xE0,0x20,0x30,0x20,0x28,0x20,0x24,0x20,0x22,0x28,0x21,0x30,0x20,0x00,0x00},/*"實",4*/

那么我們在顯示的時候,在為1 的地方一個點就好,為0的地方就;

0x08:——0000 1000,再看看第一張圖片,從上往下找,第五個像素點就點亮

相應(yīng)的,16 x 16 的漢字就需要16 x 16個像素點才能顯示一個漢字,一個16進制數(shù)為8位,還差8位,因此需要兩個16進制數(shù)才能顯示一列的像素點。

4、取模軟件使用的是:PCtoLCD2002完美版,軟件界面如下圖所示。主要設(shè)置字的大小就好就好,注意:在字的大小上面還有一個對應(yīng)的英文大小,這個是取英文字母字模大小,但是,誰會去取英文字母的模呢,除非尺寸不和要求。

[PCtoLCD2002完美版界面圖]

之后點擊界面1 的齒輪,進行設(shè)置。怎么選擇的取模方式,那么在寫顯示函數(shù)的時候就得使用相同的方式進行對像素點進行處理。

設(shè)置界面

1、陰碼——1為亮,0為滅;陽碼——1為滅,0為亮;

2、取模方式:怎么取的就怎么進行顯示就好,如逐列式,就是一列一列讀;像oled比較特殊,需要列行式,顯示的時候也是八行顯示像素點為一個陣列。

3、方向是哪個方向得看 ——取模走向,順向就從上往下??;

4、C51時使用C語言取模的固定操作;

5、點陣大小就是最后生成的數(shù)組是多少個一行,如24,那么就是24個數(shù)據(jù)一行,剩下的就在下一行,這個不影響數(shù)據(jù)內(nèi)容,只是最后你復(fù)制的時候需不需要進行改一下格式,好看一點而已,至于前綴后綴那些也只是最后生成的數(shù)組是什么樣的。如下數(shù)據(jù):
{0x08,0x20,0x30,0x21,0x20,0x21,0x21,0x22,0x28,0xE2,0x26,0x24,0xA0,0x28,0x60,0x30,0x2F,0xE0,0x20,0x30,0x20,0x28,0x20,0x24}, {0x20,0x22,0x28,0x21,0x30,0x20,0x00,0x00},/*"實",0*/
最后在數(shù)組里面使用的時候肯定要改一下格式而已,要不然如何使用。

5、程序源碼

  • 相關(guān)程序的編寫得參考你是用的LCD或者OLED屏,查看顯示字符的函數(shù),知道掃描方向(當(dāng)然取模的時候就知道掃描方向了),哪個是x,哪個是y,加以修改就可得到顯示漢字的函數(shù)。
const unsigned char Word[100] = "實踐班";//將取模的漢字全部放在這
const unsigned char WordCode[10][32] = {//漢字的模,一 一對應(yīng),不能亂了順序
{0x08,0x20,0x30,0x21,0x20,0x21,0x21,0x22,0x28,0xE2,0x26,0x24,0xA0,0x28,0x60,0x30,
0x2F,0xE0,0x20,0x30,0x20,0x28,0x20,0x24,0x20,0x22,0x28,0x21,0x30,0x20,0x00,0x00},/*實",0*/
 
{0x00,0x04,0x7C,0xFC,0x44,0x04,0x47,0xF8,0x44,0x88,0x7C,0x88,0x00,0x02,0x09,0x02,
0x09,0x04,0xFF,0xC8,0x09,0x30,0x92,0x28,0x52,0x44,0x12,0x82,0x02,0x1F,0x00,0x00},/*"踐",1*/
 
{0x21,0x08,0x21,0x0C,0x3F,0xF8,0x21,0x10,0x21,0x11,0x00,0x42,0x1F,0x84,0x00,0x18,
0xFF,0xE0,0x00,0x00,0x21,0x04,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x00,0x00},/*"班",2*/
};
 //顯示一個漢字,16*16
void DisplayWord(u8 x0,u8 y0,u8 *buf)     
{
    u8 temp = 0,t1 = 0,i = 0,j = 0,x = x0,y = y0,num = 0;
    for(i=0;i<strlen((char *)Word);i++)
    {
        if(buf[i]==Word[i]&&buf[i+1]==Word[i+1])num = i/2;      //一個漢字占兩個字節(jié)
    }
    for(i = 0;i < 32;i++)//32 是由于一列16 個像素點,需要兩個編碼才能控制一列,因此需要在32個8位編碼
    {
        temp = WordCode[num][i];
        for(t1 = 0;t1 < 8;t1++)
        {               
            if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);//點亮一個像素點
            temp <<= 1;//依次找完
            y++;
            if(y >= y0 + 16)
            {
                y = y0;
                x++;//換列
            }
        }
    }
}
//顯示漢字字符串,16*16
void DisplayStringWord(u8 x,u8 y,u8 *buf,u16 color)
{    
    u8 i = 0,j = 0, x1 = x, y1 = y;
    POINT_COLOR = color;
    
    for(i=0;i<strlen((char *)buf);i+=2)
    {
        DisplayWord(x1,y1,&buf[i]);
        x1 = x1 + 16;
    }
}

最后

如果你不理解上面的敘述,那么你可以將某個英文的編碼找出來,然后按照順序一個一個按照二進制進行排列,
如:上面 “實” 的編碼

{0x08,0x20,0x30,0x21,0x20,0x21,0x21,0x22,0x28,0xE2,0x26,0x24,0xA0,0x28,0x60,0x30,
0x2F,0xE0,0x20,0x30,0x20,0x28,0x20,0x24,0x20,0x22,0x28,0x21,0x30,0x20,0x00,0x00}
0x08——0000 1000
0x20——0010 0000
.......
依次寫完,你會理解像素點顯示的奧秘

就這樣寫下來,你會發(fā)現(xiàn),怎么有點像,好像之后一半,然后再組合下,在倒一下......,真的比較神奇。
當(dāng)然最好的對象是數(shù)字——0,不信你自己試試看,試了之后再來理解我說的話,再看下文章,你會豁然開朗。

這個方法是出自我們創(chuàng)新班的一位大佬,我看他這樣搞,我也試著這樣做。
當(dāng)然了,不同的顯示屏的驅(qū)動代碼不同,自然顯示方式也有差異,因此,必須的參考代碼中是怎么顯示英文的,然后試著改怎么顯示中文。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容