nrf52811墨水屏时钟程序代码-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug

nrf52811墨水屏时钟程序代码

 

1.epaper-drive.h

#ifndef EPD_DRIVER_H #define EPD_DRIVER_H  #include <stdint.h>  /**  * @brief 初始化墨水屏  */ void epd_init(void);  /**  * @brief 设置局部刷新窗口  * @param x 起始X坐标  * @param y 起始Y坐标  * @param w 宽度  * @param h 高度  */ void epd_set_partial_window(uint16_t x, uint16_t y, uint16_t w, uint16_t h);  /**  * @brief 向局部区域写入数据  * @param data 数据缓冲区指针  * @param size 数据大小  */ void epd_write_partial_data(const uint8_t *data, uint32_t size);  /**  * @brief 执行局部刷新显示  */ void epd_partial_display_update(void);  #endif // EPD_DRIVER_H    

2.epaper_drive.c代码

#include "nrf_drv_spi.h" #include "nrf_gpio.h" #include "nrf_delay.h" #include "app_error.h"  // 定义引脚连接 #define EPD_SPI_INSTANCE  0 #define EPD_CS_PIN        2 #define EPD_DC_PIN        3 #define EPD_RESET_PIN     4 #define EPD_BUSY_PIN      5  // 屏幕尺寸定义 #define EPD_WIDTH         296 #define EPD_HEIGHT        128  static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(EPD_SPI_INSTANCE);  // 初始化SPI通信 static void spi_init(void) {     nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;     spi_config.ss_pin   = EPD_CS_PIN;     spi_config.miso_pin = NRF_DRV_SPI_PIN_NOT_USED;     spi_config.frequency = NRF_SPI_FREQ_4M;     APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL)); }  // 发送命令 static void epd_send_command(uint8_t command) {     nrf_gpio_pin_clear(EPD_DC_PIN);     nrf_drv_spi_transfer(&spi, &command, 1, NULL, 0); }  // 发送数据 static void epd_send_data(uint8_t data) {     nrf_gpio_pin_set(EPD_DC_PIN);     nrf_drv_spi_transfer(&spi, &data, 1, NULL, 0); }  // 等待墨水屏就绪 static void epd_wait_until_idle(void) {     while(nrf_gpio_pin_read(EPD_BUSY_PIN) == 1) {         nrf_delay_ms(10);     }     nrf_delay_ms(200); }  // 墨水屏硬件复位 static void epd_reset(void) {     nrf_gpio_pin_set(EPD_RESET_PIN);     nrf_delay_ms(200);     nrf_gpio_pin_clear(EPD_RESET_PIN);     nrf_delay_ms(10);     nrf_gpio_pin_set(EPD_RESET_PIN);     nrf_delay_ms(200); }  // 初始化墨水屏 void epd_init(void) {     // 配置控制引脚     nrf_gpio_pin_dir_set(EPD_CS_PIN, NRF_GPIO_PIN_DIR_OUTPUT);     nrf_gpio_pin_dir_set(EPD_DC_PIN, NRF_GPIO_PIN_DIR_OUTPUT);     nrf_gpio_pin_dir_set(EPD_RESET_PIN, NRF_GPIO_PIN_DIR_OUTPUT);     nrf_gpio_pin_dir_set(EPD_BUSY_PIN, NRF_GPIO_PIN_DIR_INPUT);          // 初始化SPI     spi_init();          // 复位并初始化屏幕     epd_reset();          epd_send_command(0x12);  // 软复位     epd_wait_until_idle();          epd_send_command(0x01);  // 设置驱动电压     epd_send_data(0x03);     epd_send_data(0x00);     epd_send_data(0x2b);     epd_send_data(0x2b);          epd_send_command(0x3C);  // 边框波形     epd_send_data(0x01);          // 其他初始化命令... }  // 设置局部刷新区域 void epd_set_partial_window(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {     epd_send_command(0x44);  // 设置RAM X地址开始/结束位置     epd_send_data((x >> 3) & 0xFF);     epd_send_data(((x + w - 1) >> 3) & 0xFF);          epd_send_command(0x45);  // 设置RAM Y地址开始/结束位置     epd_send_data(y & 0xFF);     epd_send_data((y >> 8) & 0xFF);     epd_send_data((y + h - 1) & 0xFF);     epd_send_data(((y + h - 1) >> 8) & 0xFF);          epd_send_command(0x4E);  // 设置RAM X地址计数器     epd_send_data((x >> 3) & 0xFF);          epd_send_command(0x4F);  // 设置RAM Y地址计数器     epd_send_data(y & 0xFF);     epd_send_data((y >> 8) & 0xFF); }  // 局部刷新显示 void epd_partial_display_update(void) {     epd_send_command(0x22);  // 显示更新控制2     epd_send_data(0x0F);     // 启用局部刷新     epd_send_command(0x20);  // 触发显示更新     epd_wait_until_idle(); }  // 向局部区域写入数据 void epd_write_partial_data(const uint8_t *data, uint32_t size) {     epd_send_command(0x24);  // 向RAM写入黑色/白色数据     for (uint32_t i = 0; i < size; i++) {         epd_send_data(data[i]);     } }    

3.main.c代码

#include "nrf_drv_rtc.h" #include "nrf_drv_clock.h" #include "nrf_gpio.h" #include "nrf_delay.h" #include "epaper_driver.h" #include <stdio.h>  static const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(0); static char time_str[16]; static uint8_t current_hour = 255; static uint8_t current_minute = 255; static uint8_t current_second = 255;  // RTC中断处理函数 static void rtc_handler(nrf_drv_rtc_int_type_t int_type) {     if (int_type == NRF_DRV_RTC_INT_TICK)     {         uint32_t seconds = nrf_drv_rtc_counter_get(&rtc);         uint8_t hour = (seconds / 3600) % 24;         uint8_t minute = (seconds / 60) % 60;         uint8_t second = seconds % 60;                  // 仅在分钟变化时更新显示,减少刷新次数         if (minute != current_minute)         {             current_hour = hour;             current_minute = minute;             current_second = second;                          // 更新时钟显示             snprintf(time_str, sizeof(time_str), "%02d:%02d:%02d", hour, minute, second);             update_clock_display(time_str);         }     } }  // 初始化RTC实时时钟 static void rtc_init(void) {     nrf_drv_rtc_config_t config = NRF_DRV_RTC_DEFAULT_CONFIG;     config.prescaler = 32768/1 - 1; // 1Hz时钟          APP_ERROR_CHECK(nrf_drv_rtc_init(&rtc, &config, rtc_handler));     nrf_drv_rtc_tick_enable(&rtc, true);     nrf_drv_rtc_enable(&rtc); }  // 更新时钟显示 static void update_clock_display(const char *time_str) {     // 清屏     epd_set_partial_window(0, 0, EPD_WIDTH, EPD_HEIGHT);          // 准备时钟显示数据     uint8_t clock_buffer[EPD_WIDTH * EPD_HEIGHT / 8] = {0};          // 在缓冲区上绘制时钟(这里简化为文字显示,实际应用需要字模库)     draw_text(clock_buffer, 50, 80, time_str, FONT_SIZE_24);          // 更新显示     epd_write_partial_data(clock_buffer, sizeof(clock_buffer));     epd_partial_display_update(); }  // 绘制文字(简化版,实际应用需要字模库支持) static void draw_text(uint8_t *buffer, uint16_t x, uint16_t y, const char *text, uint8_t font_size) {     // 这里需要根据字模库实现文字绘制     // 简化示例,实际应用需要替换为真实的字模绘制代码     // ... }  int main(void) {     // 初始化外设     nrf_drv_clock_init();     nrf_drv_clock_lfclk_request(NULL);     while(!nrf_drv_clock_lfclk_is_running()) {}          // 初始化墨水屏     epd_init();          // 初始化RTC     rtc_init();          // 显示初始时间     update_clock_display("00:00:00");          // 进入低功耗模式     while(1)     {         __WFI();     } }    
请登录后发表评论

    没有回复内容