这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【墨水屏电子书】Let'sDo第2期任务+过程帖+驱动LED、按钮、墨水屏,动态

共6条 1/1 1 跳转至

【墨水屏电子书】Let'sDo第2期任务+过程帖+驱动LED、按钮、墨水屏,动态显示字符

专家
2024-08-03 23:12:07     打赏

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

图片1.png

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




专家
2024-08-04 08:44:10     打赏
2楼

谢谢分享


专家
2024-08-04 09:12:35     打赏
3楼

感谢楼主分享


专家
2024-08-04 14:59:39     打赏
4楼

学习一下


专家
2024-08-06 13:38:20     打赏
5楼

谢谢分享


助工
2024-08-20 22:34:42     打赏
6楼

谢谢分享


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]