在学习了相关资料,看懂电路原理图后,开始在提供的学习资料中的例程基础上,学习驱动墨水屏显示自己想要显示的字符、汉字。

由电路图和对例程的分析结果看,例程中使用的是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的显示。测试图片如下:




我要赚赏金
