|
|
看到有不少人入手了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
打赏
-
查看全部打赏
|