在学习了相关资料,看懂电路原理图后,开始在提供的学习资料中的例程基础上,学习驱动墨水屏显示自己想要显示的字符、汉字。
由电路图和对例程的分析结果看,例程中使用的是Pico中的spi0外设与墨水屏完成通讯。通讯要根据发送的数据/指令,适当改变DC来控制。无论发送数据还是指令(指令其实就是寄存器地址,发送指令,就是给指定的寄存器发送数据,所以要先发送寄存器地址,然后发送给这个寄存器的数据),都需要控制CS为0,这个和SPI的通讯控制没有任何区别。另外还有一点,通讯之前要先确认墨水屏是否忙。只能在墨水屏不忙的时候发送指令和数据。这个和LCD1602中的BUSY是一样的道理,毕竟墨水屏也是有控制器在工作的。
以前没接触过墨水屏,看了资料后,我的理解,墨水屏其实可以视为一种特殊的TFT屏,只不过介质不同、墨水屏的内部控制不同,所以即使在断电后,墨水屏也会保证介质仍然保持在最后的位置,使墨水屏依旧呈现出显示状态。
本次实验,将围绕以下内容进行:
1、闪烁LED
2、驱动墨水屏显示
3、测试三个按钮的动作,并在墨水屏上显示出按钮值
在例程基础上学习编写本次的测试程序,应该不是很难。在这个过程中,需要注意的是墨水屏的清屏动作。在使用学习资料中提供的《电子书测试.uf2》时,发现画面切换时,前面屏幕的数据会遗留痕迹,成为背景。因为对墨水屏的工作原理还不是很懂,猜测是由于在清屏时,处理的时间不够,导致前面屏幕显示的墨水滴没有回归到合适的位置,导致显示残留。就好像潜水艇下潜的位置不够深,在水面上依旧能看到潜水艇的影子那样。这个理解不一定对。后面我会再深入查找资料,印证这个想法、解决这个问题。在这之前,还是要把基本功能调通。
最终修改好的主程序如下:
/** * 接线: * Pico开发板 墨水屏 * ================================================================ * 31:GPIO26 BUSY 低有效 * 27:GPIO21 RESET 低有效 * 26:GPIO20 DC 命令寄存器、数据寄存器选择 * 25:GPIO19 MOSI * 24:GPIO18 SCLK * 22:GPIO17 CS 低有效 * 21:GPIO16 MISO * ================================================================ * * Pico开发板 按钮 * ================================================================ * 16:GPIO12 SWA * 17:GPIO13 SWB * 18:GPIO14 SWC * ================================================================ * * Pico开发板 LED * ================================================================ * GPIO25 LED * ================================================================ ****************************************************************************/ /*============================ INCLUDES ======================================*/ #include "pico/stdlib.h" #include "epd2.h" #include "my_epd.h" #include "my_led.h" #include "my_key.h" // 初始化系统时钟 extern void SystemCoreClockUpdate(); void init_device(void) { // 关联的LED接口初始化(GPIO25) LED_init(); // SWA,SWB,SWC接口初始化 key_init(); // 点亮LED,表示初始化中 LED_ON(); // 初始化墨水屏 epd_init(); //main_EPD_test(); // 显示初始化完成信息 draw_fb(0, 0, "**EEPW & DigiKey**"); draw_fb(0, 24, "Start test ... "); draw_fb(0, 48, "KeyCode = "); updata_to_epd(DISPLAY_PART); // 关闭LED LED_OFF(); } int main(void) { unsigned char keycode = 0; unsigned char tmpstr[32] = {'�'}; // 系统时钟初始化 SystemCoreClockUpdate(); // 初始化设备接口 init_device(); while (true) { keycode = get_key(); if (keycode > 0) { LED_Toggle(); sprintf(tmpstr, "KeyCode = %d", keycode); draw_fb(0, 48, tmpstr); updata_to_epd(DISPLAY_PART); } } }
在主处理逻辑中,墨水屏上的三个按钮的键值分别为1、2、4。每次按下其中任何一个按键,在墨水屏上显示键值的同时,会反转LED的显示。测试图片如下: