使用编译器环境:KEIL5.38A 一根MicUSB线。
实验目标:在墨水屏中显示字符串
首先我们在墨水瓶拓展板的原理图:
SPI通讯方式简单介绍:
SPI(Serial Peripheral Interface)是一种高速全双工的通信总线,是一种通讯协议1。SPI通讯方式具体过程如下2:
主设备向从设备发送一个时钟脉冲,称为时钟起始。同时,主设备将片选信号拉低,以选择从设备。
主设备向从设备发送一个控制字节,控制字节包括数据传输的格式和长度等信息。
主设备向从设备发送数据。数据按照字节的顺序依次传输。在每个字节传输结束后,从设备会回应一个应答信号来确认接收到数据。
当所有的数据传输完成后,主设备将片选信号拉高,表示结束通信。
SPI接口一般使用四条信号线通信:SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。
墨水屏的工作原理:
每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子,悬浮于透明液体中。 利用正负相吸的原理,当电场接通时,该区块对应的黑或白粒子会移动至微胶囊的顶端,使用者在该区块上,就能看见白色或黑色。
所以我们就可以理解,为什么断电之后,墨水瓶上面依然会存在我们上次像输出的图片或者字样了。
软件代码编写的时候基本思路为:控制Pico评估板通过SPI(串行外设接口)与墨水屏通信编写初始化代码,设置墨水屏的参数(分辨率、显示模式等),编写显示代码,实现在墨水屏上显示文本、图形等内容
软件代码:
底层驱动代码:
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); } } } } int My_strlen(char *data) { int i = 0; while (data[i]) { i++; } return i; } void draw_fb(int x, int y, char *data) { short int word; int i, dataLen = My_strlen(data); for (i = 0; i < dataLen;) { 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){ epd_init(); DEV_Delay_ms(2000); fb_init(); draw_fb_point(10,20); draw_fb(0, 20, "let is do DIY two"); draw_fb(0, 60, "HelloEEPW&DigiKey"); draw_fb(0, 90, "autor & keyboard7"); }
测试图片如下:
实验现象:开机之后墨水屏自检(参考例程,这里并为做修改,方便查询功能异常时候,是否为墨水屏在使用过程中出现的质量问题),最后屏幕显示下图字样,同时LED灯闪烁。