0.96寸OLED像素排列、漢字顯示和取模

以常見的128x64的OLED爲例。
我們常用的取模軟件PCtoLCD2002爲例,字模選項設置如下:
陰碼
逆向
列行式
每行顯示數據:點陣16 索引16
十六進制
C51格式

在這裏插入圖片描述
一個16x16的宋體“聯“字,取模結果是2行,每行16個字節:

{0x02,0xFE,0x92,0x92,0xFE,0x02,0x00,0x10,0x11,0x16,0xF0,0x14,0x13,0x10,0x00,0x00},
{0x10,0x1F,0x08,0x08,0xFF,0x04,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x00},/*"聯"*/

每個字節在顯示屏上是豎向排列,從上至下依次爲bit0-bit7,我們將值爲1的bit點亮,就顯示了漢字,如下圖:
在這裏插入圖片描述
所以單個漢字顯示,就是將這16x16的像素點根據取模的結果進行控制即可。判斷某個位的常見方法就是取這個字節,與0x01進行與操作,即可判斷最後一位是否爲1,然後將字節右移一位,依次循環8次即可。
簡單代碼片段如下:

void ssd1306_show_chinese(uint8_t chXpos,uint8_t chYpos,uint8_t num,uint8_t fontsize)
{

    uint8_t i,m,n=0,byte_in_char,row_num_in_font;
	uint8_t x0=chXpos,y0=chYpos;
	uint8_t lines_per_char_in_font = fontsize/8;

	while(lines_per_char_in_font--)
	{
		row_num_in_font=num*fontsize/8+n;
		n++;
			for(i=0;i<fontsize;i++)
			{
				if(fontsize==16)
						{byte_in_char=chn_16x16[row_num_in_font][i];}//調用16*16字體
				//還可調用其他大小的字體,當然字體大小如果不是8的倍數代碼複雜度會增加
				else 
				{
					return;
				}
				
				for(m=0;m<8;m++)
                {
                    if(byte_in_char&0x01)
                    {
                        ssd1306_fill_point(chXpos, chYpos, 1);
                    }
                    else 
                    {
                        ssd1306_fill_point(chXpos, chYpos, 0);
                    }
                    byte_in_char>>=1;
                    chYpos++;
                }
                chXpos++;
                if((chXpos-x0)==fontsize)
                {
                    chXpos=x0;y0=y0+8;
                }
                chYpos=y0;
			 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章