前言
昨晚已经添加完ASCII显示,今天晚上继续添加GB2312的显示。经过半个小时的摸索,终于把显示调出来了。
遇到问题
显示的文字不对
虽然显示出了汉字,但是汉字并不是自己想显示出来的字。从一开始,个人感觉可能是因为大小端问题,发现对调了区码和位码,汉字还是不对。索性直接去查显示的汉字和想要的汉字的区位码,计算出实际寻址公式,计算过程:
从对调区位码开始计算,得到如下数据:
0xB6C8 度
0xC8B7 确
此时有两个发现,区位码不需要对调,另外,教程中的公式,位码少减了1,导致寻址偏移一个字节,因此正确的寻址应该是:
汉字在字库中的位置 = ((区码 - 1) * 94 + (位码 - 1))
有了以上计算,再更换字符验证,发现新的计算逻辑正确。
实际验证代码
和昨天重复部分不再贴出,这里仅贴出修改部分:
my_epd.c
extern const unsigned char acHZK16C[]; #define GB2312_FONT_H 16 #define GB2312_FONT_W 16 void draw_fb_GB2132(int x, int y, int bankCode, int posCode) { const unsigned char *pData = NULL; unsigned char idxX, idxY; int lineData; int pos; pos = ((bankCode - 0xA1) * 94 + (posCode - 0xA1)) * (GB2312_FONT_H * GB2312_FONT_W / 8); pData = acHZK16C + pos; for (idxY = 0; idxY < GB2312_FONT_W; idxY++) { lineData = pData[idxY * 2]; lineData = lineData << 8; lineData = lineData | pData[idxY * 2 + 1]; for (idxX = 0; idxX < GB2312_FONT_H; idxX++) { if (lineData & (0x01 << idxX)) { draw_fb_point(x + GB2312_FONT_H - idxX, y + idxY); } else { clear_fb_point(x + GB2312_FONT_H - idxX, y + idxY); } } } } void draw_fb(int x, int y, char *data) { int i, dataLen = My_strlen(data); for (i = 0; i < dataLen;) { if (data[i] > 127) { if ((x + GB2312_FONT_H) > EPD_H) { x = 0; y += GB2312_FONT_W; } draw_fb_GB2132(x, y, data[i], data[i + 1]); x += GB2312_FONT_H; i += 2; } else { if ((x + ASCII_FONT_H) > EPD_H) { x = 0; y += ASCII_FONT_W; } draw_fb_ASCII(x, y, data[i]); x += ASCII_FONT_H; i++; } } } int main_EPD_test(void) { draw_fb(0, 0, "《仁经》"); // updata_to_epd(DISPLAY_ALL); updata_to_epd(DISPLAY_PART); return 0; }显示效果