本章节的主要目标是基于屏幕驱动函数(在屏幕任意位置画点)实现字符的显示,例如显示Hello EEPW & DigiKey 。
到这里可以知道基本的需求是显示,不过在显示之前需要对屏幕进行驱动设计以及初始化,不过由于屏幕的资料比较少,这一部分的驱动也是在教学中提供了,我们直接使用就可以了。
我们熟悉一下我们要是用的函数,除了基础的初始化函数epd_init(void)外,操作函数只有一个写点函数draw_fb_point(int x,int y),咱们要显示字符(不管是ASCII还是汉字都是一个一个点组成的)实际上就是连续的写点,在"epd2.c"中有一个ASCII的字库,16*24的,我们就用这个字库来完成本次的显示。
首先我们要在字库中获取字符对应的初始位置:
ASCII的机器码正好是32-144,所以直接通过上面的算法就可以获得数组的起始位置;接下来就是连续写点:void draw_fb_point(int x,int y){ drawfb[OLED_H - x - 1][y] = 1; } void clear_fb_point(int x, int y){ drawfb[OLED_H - x - 1][y] = 0; } void draw_fb_ASCII(int x, int y, char word) { const uint8_t *pData = epd2_get_font_16_24h(word); unsigned char idxX, idxY; int lineData; for (idxY = 0; idxY < 24; idxY++) { lineData = pData[idxY * 2 + 1]; lineData = lineData << 8; lineData = lineData | pData[idxY * 2]; for (idxX = 0; idxX < 16; idxX++) { if (lineData & (0x01 << idxX)) { draw_fb_point(x + idxX, y + idxY); } else { clear_fb_point(x + idxX, y + idxY); } } } } void draw_fb(int x, int y, char *data) { short int word,ASCII_FONT_H,ASCII_FONT_W; int i; ASCII_FONT_H = 24; ASCII_FONT_W = 16; for (i = 0; data[i] != 0;) { if ((x + ASCII_FONT_W) > EPD_H) { x = 0; y += ASCII_FONT_H; } draw_fb_ASCII(x, y, data[i]); x += ASCII_FONT_W; i++; } }
添加了这些基础的显示函数后,我们就可以在main中添加显示内容了。
效果如下: