本次DIY学习活动的最终成果是实现电子书基本功能,实现按键翻页(上一页、下一页等),有关硬件部分我们就不在赘述了,主要介绍软件部分的实现。
通过过程学习我们基本掌握了按键,LED控制以及墨水屏显示的基本操作,接下来就是进一步将各个模块功能进行扩展例如,显示汉字,然后使用例程的《礼记》选段进行电子书的翻页展示。
汉字显示部分,我们使用的库是16*16的库,一个汉字占用两个字节,而且所有的汉字一定是大于144的,所以针对汉字显示,我们设计一个单字的显示函数:
void draw_fb_GB2132(int x, int y, unsigned int bankCode, unsigned int posCode) { const uint8_t *pData; unsigned char idxX, idxY; int lineData; int pos; short int FONT_H,FONT_W; FONT_H = GB2312_FONT_H; FONT_W = GB2312_FONT_W; pos = ((bankCode - 0xA1) * 94 + (posCode - 0xA1)) * (FONT_H * FONT_W / 8); pData = acHZK16C; pData += pos; for (idxY = 0; idxY < FONT_W; idxY++) { lineData = pData[idxY * 2]; lineData = lineData << 8; lineData = lineData | pData[idxY * 2 + 1]; for (idxX = 0; idxX < FONT_H; idxX++) { if (lineData & (0x01 << idxX)) { draw_fb_point(x + FONT_H - idxX, y + idxY); } else { clear_fb_point(x + FONT_H - idxX, y + idxY); } } } for (idxY = FONT_W; idxY < FONT_W; idxY++) { for (idxX = 0; idxX < FONT_H; idxX++) { clear_fb_point(x + FONT_H - idxX, y + idxY); } } }
接下来就是在draw_fb(int x, int y, unsigned char *data)中添加显示判断:
if(data[i] > 0x80){ FONT_H = GB2312_FONT_H; FONT_W = GB2312_FONT_W; if ((x + FONT_W) > EPD_H) { x = 0; if(y+FONT_H>=EPD_W) break; else y += FONT_H; } draw_fb_GB2132(x, y, data[i], data[i+1]); x += FONT_W; i += 2; }
加下来就是在main中加入按键控制,A键上翻,C键下凡,B键到第一页:
if(get_key(INKY_KEYA_PIN) == 1) { if(offise >= 288){ offise -= 288; draw_fb(0, 0, dx_dzs+offise,FONT_Mode); updata_to_epd(DISPLAY_PART); } } if(get_key(INKY_KEYB_PIN) == 1) { offise = 0; draw_fb(0, 0, dx_dzs,FONT_Mode); updata_to_epd(DISPLAY_PART); } if(get_key(INKY_KEYC_PIN) == 1) { if(offise < My_strlen(dx_dzs)){ offise += 288; draw_fb(0, 0, dx_dzs+offise,FONT_Mode); updata_to_epd(DISPLAY_PART); } }
到这里我们也基本上完成了本次DIY的基础任务,由于也没有购买扩展任务的器件,也就不在进行相关DIY设计了,本次的DIY活动接触了全新的墨水屏器件,也是在学习过程中掌握了基于Keil进行Raspberry Pi Pico的调试之法,可以说一种全新的体验。不过说实话对于前期的任务来说还好,可以一次少次就调试成功,不过每次进入BOOT还是比较麻烦的,对于后面问题比较多的时候就不比较不方便了。在本次的DIY学习中用到了很多的指针,这方面的锻炼还是挺有用的。
期待下一次活动的到来。
相关视频会发布在视频网站,地址在二楼。