数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 115|回复: 7

[ARM] 2.4寸彩色电子价签在AI的加持下轻松由原主控点亮,还没有点亮的可以试下

[复制链接]
发表于 昨天 16:44 | 显示全部楼层 |阅读模式
    看到有不少人入手了2.4寸彩色电子价签,数码之家也有不少人拆解。大多数重新做底板来驱动这个屏。其实这个价签主控采用的是DA14585,其官方资料还挺详细的。SDK,应用设计参考等挺全的。不像某些国内厂家资料藏着掖着不给看。对照资料略加分析了下,这个价签的DA14585的OTP虽然已写,但有外部flash还可以烧写代码。因此可以用原主控驱动屏,甚至可以重写固件,实现原来价签的功能,通过蓝牙传输图片。这些都有代码可参考。
    现代AI时代,写代码真是太方便了,万用表测量了接口定义,把需求提交给AI,片刻代码就出来了,拷贝到SDK的点灯工程中,基本不用修改即可点亮。借助AI,简单粗暴,几分钟点亮!




我只买了2块这个价签,板子不同,屏的接口有插件和焊接的,但是经过测量发现到DA14585的接口完全一样。RGB等控制定义也一样,等于说这2款固件是一样的。分析还发现,这个价签固件是没有加密的,可以完全备份下来,玩腻了再刷回去!
修改后代码贴上吧,其实按照以上提示词,都可以产生类似可工作的代码。

#include <stdio.h>
#include "arch_system.h"
#include "uart.h"
#include "uart_utils.h"
#include "user_periph_setup.h"
#include "gpio.h"


#define LED_OFF_THRESHOLD           10000
#define LED_ON_THRESHOLD            400000

/**
****************************************************************************************
* @brief Blinky test function
****************************************************************************************
*/
void blinky_test(void);

/**
****************************************************************************************
* @brief Main routine of the Blinky example
****************************************************************************************
*/
////// LCD driver from   AI

// ===================== LCD硬件接口定义 =====================
#define LCD_RST_PORT    GPIO_PORT_1
#define LCD_RST_PIN     GPIO_PIN_0

#define LCD_MOSI_PORT   GPIO_PORT_2
#define LCD_MOSI_PIN    GPIO_PIN_0

#define LCD_CLK_PORT    GPIO_PORT_0
#define LCD_CLK_PIN     GPIO_PIN_1

#define LCD_CS_PORT     GPIO_PORT_2
#define LCD_CS_PIN      GPIO_PIN_1

#define LCD_DC_PORT     GPIO_PORT_0
#define LCD_DC_PIN      GPIO_PIN_7

#define LCD_BL_PORT     GPIO_PORT_2
#define LCD_BL_PIN      GPIO_PIN_3

// ===================== LCD命令定义 =====================
#define ST7789_NOP       0x00
#define ST7789_SWRESET   0x01
#define ST7789_SLPIN     0x10
#define ST7789_SLPOUT    0x11
#define ST7789_NORON     0x13
#define ST7789_INVOFF    0x20
#define ST7789_INVON     0x21
#define ST7789_DISPOFF   0x28
#define ST7789_DISPON    0x29
#define ST7789_CASET     0x2A
#define ST7789_RASET     0x2B
#define ST7789_RAMWR     0x2C
#define ST7789_COLMOD    0x3A
#define ST7789_MADCTL    0x36

// ===================== 颜色定义(RGB565) =====================
#define RED     0xF800
#define GREEN   0x07E0
#define BLUE    0x001F
#define WHITE   0xFFFF
#define BLACK   0x0000

// 全局变量:颜色切换标志
static uint8_t color_index = 0;
static uint16_t color_table[] = {RED, GREEN, BLUE, WHITE, BLACK};

// ===================== 底层GPIO操作函数 =====================
static void LCD_GPIO_Init(void)
{
    // 初始化所有GPIO为推挽输出
    GPIO_ConfigurePin(LCD_RST_PORT, LCD_RST_PIN, OUTPUT, PID_GPIO, true);
    GPIO_ConfigurePin(LCD_MOSI_PORT, LCD_MOSI_PIN, OUTPUT, PID_GPIO, false);
    GPIO_ConfigurePin(LCD_CLK_PORT, LCD_CLK_PIN, OUTPUT, PID_GPIO, false);
    GPIO_ConfigurePin(LCD_CS_PORT, LCD_CS_PIN, OUTPUT, PID_GPIO, true);
    GPIO_ConfigurePin(LCD_DC_PORT, LCD_DC_PIN, OUTPUT, PID_GPIO, false);
    GPIO_ConfigurePin(LCD_BL_PORT, LCD_BL_PIN, OUTPUT, PID_GPIO, true); // 点亮背光

}

// 写SPI字节(模拟时序)
static void LCD_SPI_WriteByte(uint8_t data)
{
    uint8_t i;
    for(i=0; i<8; i++)
    {
        GPIO_SetInactive(LCD_CLK_PORT, LCD_CLK_PIN); // CLK拉低
        if(data & 0x80)
        {
            GPIO_SetActive(LCD_MOSI_PORT, LCD_MOSI_PIN);
        }
        else
        {
            GPIO_SetInactive(LCD_MOSI_PORT, LCD_MOSI_PIN);
        }
        data <<= 1;
        GPIO_SetActive(LCD_CLK_PORT, LCD_CLK_PIN); // CLK拉高
    }
    GPIO_SetInactive(LCD_CLK_PORT, LCD_CLK_PIN);
}

// 写命令
static void LCD_WriteCmd(uint8_t cmd)
{
    GPIO_SetInactive(LCD_CS_PORT, LCD_CS_PIN);     // CS拉低
    GPIO_SetInactive(LCD_DC_PORT, LCD_DC_PIN);      // DC=命令
    LCD_SPI_WriteByte(cmd);
    GPIO_SetActive(LCD_CS_PORT, LCD_CS_PIN);        // CS拉高
}

// 写数据
static void LCD_WriteData(uint8_t data)
{
    GPIO_SetInactive(LCD_CS_PORT, LCD_CS_PIN);     // CS拉低
    GPIO_SetActive(LCD_DC_PORT, LCD_DC_PIN);        // DC=数据
    LCD_SPI_WriteByte(data);
    GPIO_SetActive(LCD_CS_PORT, LCD_CS_PIN);        // CS拉高
}

// 写16位数据(RGB565)
static void LCD_WriteData16(uint16_t data)
{
    GPIO_SetInactive(LCD_CS_PORT, LCD_CS_PIN);
    GPIO_SetActive(LCD_DC_PORT, LCD_DC_PIN);
    LCD_SPI_WriteByte(data >> 8);
    LCD_SPI_WriteByte(data & 0xFF);
    GPIO_SetActive(LCD_CS_PORT, LCD_CS_PIN);
}

// ===================== 延时函数 =====================
static void LCD_DelayMs(uint32_t ms)
{
    uint32_t i,j;
    for(i=0; i<ms; i++)
        for(j=0; j<1000; j++);
}

// ===================== LCD初始化 =====================
void ST7789_Init(void)
{
    LCD_GPIO_Init();
   
    // 硬件复位
    GPIO_SetInactive(LCD_RST_PORT, LCD_RST_PIN);
    LCD_DelayMs(100);
    GPIO_SetActive(LCD_RST_PORT, LCD_RST_PIN);
    LCD_DelayMs(100);

    // 开始初始化命令
    LCD_WriteCmd(ST7789_SWRESET);  // 软件复位
    LCD_DelayMs(120);
   
    LCD_WriteCmd(ST7789_SLPOUT);   // 退出睡眠
    LCD_DelayMs(120);
   
    LCD_WriteCmd(ST7789_COLMOD);   // 颜色格式
    LCD_WriteData(0x55);            // RGB565, 16位
   
    LCD_WriteCmd(ST7789_MADCTL);   // 显示方向
    LCD_WriteData(0x60);
   
    LCD_WriteCmd(ST7789_INVON);     // 反色开启
    LCD_DelayMs(10);
   
    LCD_WriteCmd(ST7789_NORON);     // 正常显示
    LCD_DelayMs(10);
   
    LCD_WriteCmd(ST7789_DISPON);    // 开启显示
    LCD_DelayMs(120);
}

// ===================== 设置显示窗口 =====================
static void LCD_SetWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    // 列地址设置
    LCD_WriteCmd(ST7789_CASET);
    LCD_WriteData(x1 >> 8);
    LCD_WriteData(x1 & 0xFF);
    LCD_WriteData(x2 >> 8);
    LCD_WriteData(x2 & 0xFF);
   
    // 行地址设置
    LCD_WriteCmd(ST7789_RASET);
    LCD_WriteData(y1 >> 8);
    LCD_WriteData(y1 & 0xFF);
    LCD_WriteData(y2 >> 8);
    LCD_WriteData(y2 & 0xFF);
   
    // 写入内存
    LCD_WriteCmd(ST7789_RAMWR);
}

// ===================== 全屏填充颜色 =====================
void LCD_FillFullScreen(uint16_t color)
{
    uint32_t i;
    LCD_SetWindow(0, 0, 319, 239);
   
    for(i=0; i<320*240; i++)
    {
        LCD_WriteData16(color);
    }
}

// ===================== 1秒定时器回调 =====================
static void Timer_Callback(void)
{
    // 切换颜色
    LCD_FillFullScreen(color_table[color_index]);
    color_index++;
    if(color_index >= 5) color_index = 0;
}

//////  End of LCD  driver
int main (void)
{
    system_init();
    // LCD初始化
    ST7789_Init();       
    blinky_test();
    while(1);
}

void blinky_test(void)
{
    volatile int i=0;

    printf_string(UART, "\n\r\n\r");
    printf_string(UART, "***************\n\r");
    printf_string(UART, "* BLINKY DEMO *\n\r");
    printf_string(UART, "***************\n\r");

                GPIO_SetActive(LED_PORT1, LED_PIN1);  //green
                GPIO_SetActive(LED_PORT2, LED_PIN2);  //red
                GPIO_SetActive(LED_PORT3, LED_PIN3);        //blue
    while(1)
    {
        i++;

        if (LED_OFF_THRESHOLD == i)
        {
            GPIO_SetActive(LED_PORT3, LED_PIN3);
            printf_string(UART, "\n\r *LED ON* ");
                                                Timer_Callback();
        }

        if (LED_ON_THRESHOLD == i)
        {
            GPIO_SetInactive(LED_PORT3, LED_PIN3);
            printf_string(UART, "\n\r *LED OFF* ");
        }

        if (i == 2 * LED_ON_THRESHOLD)
        {
            i = 0;
        }
    }
}


RGB LED灯定义如下:

    #define LED_PORT1                GPIO_PORT_2
    #define LED_PIN1                 GPIO_PIN_5
    #define LED_PORT2                GPIO_PORT_0
    #define LED_PIN2                 GPIO_PIN_2               
    #define LED_PORT3                GPIO_PORT_2
    #define LED_PIN3                 GPIO_PIN_9       

以上接口定义都在代码里面了,有需要的自取就不需要测量了。

看看有没有需要用原主控点亮的,程序在keil中编译,烧代码用SmartSnippets_Toolbox_v5.0.16.3720_windows这个,官网可下载。由于OTP已用,需要按照SUOTA方式烧录就可以使用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +30 收起 理由
慕名而来 + 30 原創內容

查看全部打赏

发表于 昨天 17:43 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 昨天 18:00 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 昨天 19:15 来自手机浏览器 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 昨天 19:45 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 12 小时前 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 7 小时前 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2026-3-26 21:11 , Processed in 0.109200 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz!

© MyDigit.Net Since 2006

快速回复 返回顶部 返回列表