STM32学习笔记---- OLED显示中文

原文链接: https://blog.csdn.net/qq_33508087/article/details/83503785

一:材料准备

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*/
    };

你可能感兴趣的:(STM32笔记)