前言
昨晚已经添加完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;
}显示效果

 
					
				
 
			
			
			
						
			 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

