[其他产品] 存储空间有限情况下实现数码相框实现功能

[复制链接]
117|0
jinglixixi 发表于 2025-10-25 13:47 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-10-25 13:49 编辑

#申请原创#
@21小跑堂

FireBeetle 2 ESP32 P4开发板是一款体型小巧的板子,尽管有一定的程序存储空间,但要想以这副小身板来存放有较大体量的图片数据则是件难于登天的事。
难得的是该开发板配置了TF卡座,见图1所示。

图1 开发板功能分布


如果借助这个TF卡座,来解决存储空间有限的问题,则会突破存储空间的制约,要显示的图片文件只需存放到TF卡中。
在引脚占用方面,TF卡所使用的引脚如图2所示。

图2 引脚占用


那该如何读取图片文件呢?
在通常的开发环境下,对文件进行读写会是一个边界复杂的工作。但在Arduino IDE的开发环境下,这却是一件较为轻松的事情。当然,这是借助库函数的支持。
实现文件读取的程序为:
  1. #include “SD_MMC.h”
  2. void setup() {
  3.     uint8_t i,ch;
  4.     Serial.begin(115200);
  5.     delay(200);
  6.     Serial.println("begin read sd!");
  7.     if (!SD_MMC.begin())
  8.     {
  9.         Serial.println("The storage card failed to mount.");
  10.         return;
  11.     }
  12.     uint8_t cardType = SD_MMC.cardType();
  13. if (cardType == CARD_SDHC)
  14.     {
  15.          Serial.println("An SDHC card is mounted.");
  16.     }
  17.     else
  18.     {
  19.          Serial.println("An unknown storage card is mounted.");
  20.     }
  21.     file = SD_MMC.open("/test.txt", FILE_READ);
  22.     if (file)
  23.     {
  24.        while (file.available())
  25.        {
  26.             ch=(char)file.read();
  27.             Serial.print(ch);
  28.             i=i+1;
  29.        }
  30.     }
  31.     file.close();
  32.     delay(10000);
  33. }

解决了数据的的问题,又该如何解决图像显示问题呢?
方法是以TFT显示屏承担,所使用的引脚连接关系为:
TFT_CS----GPIO49
TFT_RS----GPIO50
TFT_DC----GPIO52
TFT_MOSI----GPIO29
TFT_SCLK----GPIO28
TFT_BL----GPIO51

为便于完成TFT屏的显示驱动,这里采用的是软件模拟的方式。
引脚的配置函数为:


显示屏的软件复位函数为:


模拟SPI方式发送字节数据的函数为:


实现TFT显示屏初始化的函数为:
  1. void LCD_Init(void){
  2.    LCD_Reset();
  3.    delay(120);
  4.    LCD_WR_REG(0XEF);
  5.    LCD_WR_DATA(0X03);
  6.    LCD_WR_DATA(0X80);
  7.    LCD_WR_DATA(0X02);
  8.    LCD_WR_REG(0XCF);
  9.    LCD_WR_DATA(0X00);
  10.    LCD_WR_DATA(0XC1);
  11.    LCD_WR_DATA(0X30);   
  12.    LCD_WR_REG(0XED);
  13.    LCD_WR_DATA(0X64);
  14.    LCD_WR_DATA(0X03);
  15.    LCD_WR_DATA(0X12);  
  16.    LCD_WR_DATA(0X81);
  17.    LCD_WR_REG(0XE8);
  18.    LCD_WR_DATA(0X85);
  19.    LCD_WR_DATA(0X00);
  20.    LCD_WR_DATA(0X78);
  21.    LCD_WR_REG(0XCB);
  22.    LCD_WR_DATA(0X39);
  23.    LCD_WR_DATA(0X2C);
  24.    LCD_WR_DATA(0X00);  
  25.    LCD_WR_DATA(0X34);
  26.    LCD_WR_DATA(0X02);
  27.    LCD_WR_REG(0XF7);
  28.    LCD_WR_DATA(0X20);
  29.    LCD_WR_REG(0XEA);
  30.    LCD_WR_DATA(0X00);
  31.    LCD_WR_DATA(0X00);   
  32.    LCD_WR_REG(0XC0);
  33.    LCD_WR_DATA(0X23);
  34.    LCD_WR_REG(0XC1);
  35.    LCD_WR_DATA(0X10);
  36.    LCD_WR_REG(0XC5);
  37.    LCD_WR_DATA(0X3E);
  38.    LCD_WR_DATA(0X28);   
  39.    LCD_WR_REG(0XC7);
  40.    LCD_WR_DATA(0X86);     
  41.    LCD_WR_REG(0X36);   
  42.    LCD_WR_DATA(0X48);   
  43.    LCD_WR_REG(0X3A);
  44.    LCD_WR_DATA(0X55);
  45.    LCD_WR_REG(0XB1);
  46.    LCD_WR_DATA(0X00);  
  47.    LCD_WR_DATA(0X18);   
  48.    LCD_WR_REG(0XB6);
  49.    LCD_WR_DATA(0X08);
  50.    LCD_WR_DATA(0X82);
  51.    LCD_WR_DATA(0X27);

  52.    LCD_WR_REG(0XF2);
  53.    LCD_WR_DATA(0X00);
  54.    LCD_WR_REG(0X26);
  55.    LCD_WR_DATA(0X01);
  56.    LCD_WR_REG(0XE0);
  57.    LCD_WR_DATA(0X0F);
  58.    LCD_WR_DATA(0X31);
  59.    LCD_WR_DATA(0X2B);  
  60.    LCD_WR_DATA(0X0C);
  61.    LCD_WR_DATA(0X0E);
  62.    LCD_WR_DATA(0X08);
  63.    LCD_WR_DATA(0X4E);
  64.    LCD_WR_DATA(0XF1);  
  65.    LCD_WR_DATA(0X37);
  66.    LCD_WR_DATA(0X07);
  67.    LCD_WR_DATA(0X10);
  68.    LCD_WR_DATA(0X03);
  69.    LCD_WR_DATA(0X0E);
  70.    LCD_WR_DATA(0X09);  
  71.    LCD_WR_DATA(0X00);
  72.    LCD_WR_REG(0XE1);
  73.    LCD_WR_DATA(0X00);
  74.    LCD_WR_DATA(0X0E);
  75.    LCD_WR_DATA(0X14);  
  76.    LCD_WR_DATA(0X03);
  77.    LCD_WR_DATA(0X11);
  78.    LCD_WR_DATA(0X07);
  79.    LCD_WR_DATA(0X31);
  80.    LCD_WR_DATA(0XC1);  
  81.    LCD_WR_DATA(0X48);
  82.    LCD_WR_DATA(0X08);
  83.    LCD_WR_DATA(0X0F);
  84.    LCD_WR_DATA(0X0C);
  85.    LCD_WR_DATA(0X31);
  86.    LCD_WR_DATA(0X36);  
  87.    LCD_WR_DATA(0X0F);   
  88.    LCD_WR_REG(0X11);
  89.    delay(120);
  90.    LCD_WR_REG(0X29);
  91.    LCD_WR_DATA(0X2C);
  92.    digitalWrite(TFT_BL,HIGH);  
  93. }

这样,就为图片的再现提供了可靠的基础。
要实现图片的再现,其基本过程就是打开图片文件,将读取的数据显示到TFT显示屏上。
至于切换显示内容,则是在完成一幅图片显示后,再打开另一个图片文件并进行新的数据读取和显示。
实现数码相框功能的主程序为:
  1. void loop() {
  2.    uint8_t ch;   
  3.    LCD_SetWindows(0,0,240-1,320-1);
  4.    digitalWrite(TFT_CS,LOW);
  5.    digitalWrite(TFT_DC,HIGH);
  6.    if(m==0)
  7.    {
  8.        file = SD_MMC.open("/AIO.bin", FILE_READ);
  9.    }
  10.    if(m==1)
  11.    {
  12.        file = SD_MMC.open("/AIK.bin", FILE_READ);
  13.    }
  14.    if (file)
  15.    {
  16.        while (file.available())
  17.        {
  18.             ch=(char)file.read();
  19.             spi_write_byte(ch);
  20.        }
  21.    }
  22.    . . .
  23.    digitalWrite(TFT_CS,HIGH);
  24.    file.close();
  25.    m=(m+1)%N;
  26.    delay(10000);
  27. }

此外,为了珍惜来之不易的存储空间,还可以对显示的图片文件进行一下深加工,即使用相关软件进行一次数据格式的调整,见图3所示。这样在显示图片时,就无需再涉及图片大小和格式的问题,一律采用统一的格式和大小。

图3 格式变换


经上述的处理,数码相框的显示效果见如4和图5所示。

图4 显示效果1


图5 显示效果2


这种在有限存储空间下,实现数码相框功能的方法是不是很有效,感兴趣的你不妨一试。


演示视频:




本帖子中包含更多资源

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

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

525

主题

2957

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部