1. 程式人生 > >OLED/TFT顯示中文

OLED/TFT顯示中文

一:材料準備

stm32微控制器、OLED/TFT一個

二:之前有過學習原子教程的基礎

這裡以OLED顯示中文為例(TFT一樣)

1,顯示一個字元: (16號字型舉例:寬8  高16)

自行理解這一行意思

u8 csize=(size/8 + ((size%8)?1:0)) * (size/2);     //得到字型一個字元對應點陣集所佔的位元組數

/*************************************************************************/
/*         顯示字元函式    
 x: 0~127                                                  
 y: 0~63
size: 12/16/24
mode:0,反白顯示;1,正常顯示     
*/
/*************************************************************************/
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{                   
    u8 temp,t,t1;
    u8 y0=y;
    u8 csize=(size/8+((size%8)?1:0))*(size/2);      //得到字型一個字元對應點陣集所佔的位元組數
    chr=chr-' ';                                    //得到偏移後的值              
    for(t=0;t<csize;t++)
    {   
        if(size==12)temp=asc2_1206[chr][t];         //呼叫1206字型
        else if(size==16)temp=asc2_1608[chr][t];    //呼叫1608字型
        else if(size==24)temp=asc2_2412[chr][t];    //呼叫2412字型
        else return;                                //沒有的字型檔
        for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)OLED_DrawPoint(x,y,mode);
            else OLED_DrawPoint(x,y,!mode);
            temp<<=1;
            y++;
            if((y-y0)==size)
            {
                y=y0;
                x++;
                break;
            }
        }    
    }          
}

2,修改部分   

顯示中文:(16號字型舉例:寬8*2  高16)

自行理解這一行意思

u8 csize=(size/8 + ((size%8)?1:0)) * size;     //得到字型一個字元對應點陣集所佔的位元組數

/*************************************************************************/
/*                
					顯示一個漢字                          
x,y:起點座標
num :字型檔中第幾個漢字
size:字型大小
mode:模式

*/ 
/*************************************************************************/
void OLED_ShowGBK(u8 x, u8 y,  u8 num, u8 size,u8 mode)
{
    u8 temp,t,t1;
    u8 y0=y;
	//u8 size = 16;
    u8 csize=(size/8 + ((size%8)?1:0)) * size;     //得到字型一個字元對應點陣集所佔的位元組數
              
    for(t=0;t<csize;t++)
    {  
		  //  我只定義了16,12號字型   沒有宣告其他字型
        if(size==12)      temp = gbk_1212[num][t];    //呼叫1212字型
        else if(size==16) temp = gbk_1616[num][t];    //呼叫1616字型
//      else if(size==24)temp=asc2_2412[chr][t];    //呼叫2412字型
        else return;                                //沒有的字型檔
		for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)OLED_DrawPoint(x,y,mode);
            else OLED_DrawPoint(x,y,!mode);
            temp<<=1;
            y++;
            if((y-y0)==size)
            {
                y=y0;
                x++;
                break;
            }
        }    
    } 	
}

3,建立中文字型檔(以16號字型為例)

推薦使用PCtoLCD2002.exe漢字取模(取模方式已給出)

//16x16 漢字點陣   
//每個漢字佔32個位元組
//PC2LCD2002取模方式設定:陰碼+逐列式+順向+C51格式
//每個漢字所佔用的位元組數為:(size/8+((size%8)?1:0))*(size),
//其中size:是字型檔生成時的點陣大小(12/16/24...)

const unsigned char gbk_1616[3][32]={      //16x16
	
{0x40,0x00,0x40,0x00,0x47,0xFF,0x44,0x12,
0x44,0x22,0x7F,0xC2,0x44,0x02,0x44,0x02,
0x44,0x02,0x7F,0xC2,0x44,0x22,0x44,0x22,
0x47,0xFF,0x40,0x00,0x40,0x00,0x00,0x00},/*"西",0*/
{0x00,0x02,0x42,0x02,0x41,0x82,0x40,0x62,
0x40,0x02,0x7F,0xFE,0x40,0x02,0x40,0x02,
0x40,0x02,0x7F,0xFE,0x40,0x02,0x40,0x22,
0x40,0xC2,0x43,0x02,0x00,0x02,0x00,0x00},/*"亞",1*/
{0x00,0x11,0x20,0x12,0xFF,0xF4,0x24,0x90,
0x24,0x90,0x24,0x98,0xFF,0xF4,0x20,0x13,
0x00,0x06,0x3F,0xF8,0x22,0x00,0x22,0x00,
0x23,0xFF,0x42,0x00,0x02,0x00,0x00,0x00}, /*"斯",2*/
};

有疑問者請聯絡:QQ:1735915513