probedog 发表于 2025-2-7 23:00

pic18f452把12864图片定义到rom中,但是在前面加上const rom后程序运行无法读取到图片

我用的是MCC18编译器,烧写在实物中后,在数组前面加上rom,128*64不能显示,不加的话就可以,想知道这是为嘛?求告知!!!感激不尽!!!难道写进rom后读取的方式不一样么?

捉虫天师 发表于 2025-2-9 19:53

是的,在 MCC18 编译器下,const rom 关键字会将数据存入 程序存储器(Flash ROM),而普通的 const 变量通常存入 RAM。因为 PIC18F452 的 Flash ROM 和 RAM 访问方式不同,你不能直接用普通的指针访问 rom 数据,而是需要使用 memcpypgm2ram() 或者 ReadProgramMemory() 这样的方式来读取数据。

捉虫天师 发表于 2025-2-9 19:53

#include <p18cxxx.h>
#include <string.h>

// 把图片存入 ROM
const rom unsigned char imgData = { /* 128x64 图片数据 */ };

// RAM 缓冲区
unsigned char ramBuffer;

void LoadImageToRAM()
{
    memcpypgm2ram(ramBuffer, imgData, sizeof(imgData)); // 复制到 RAM
}

void DisplayImage()
{
    LoadImageToRAM();// 先从 ROM 复制到 RAM
    // 这里用 ramBuffer 进行 12864 显示
}

捉虫天师 发表于 2025-2-9 19:53

const rom unsigned char imgData → 存入 Flash ROM。
unsigned char ramBuffer → RAM 缓冲区。
memcpypgm2ram() 把 Flash ROM 里的数据复制到 RAM,之后才能读取。

捉虫天师 发表于 2025-2-9 19:54

使用 ReadProgramMemory()
如果你不想复制整个数组,而是动态读取 Flash 里的数据,可以用 ReadProgramMemory()

捉虫天师 发表于 2025-2-9 19:54

#include <p18cxxx.h>

// ROM 中存储的图片数据
const rom unsigned char imgData = { /* 128x64 图片数据 */ };

unsigned char ReadByteFromROM(unsigned int addr)
{
    unsigned char value;
    ReadProgramMemory((far rom void *) &imgData, &value, 1);
    return value;
}

void DisplayImage()
{
    for (unsigned int i = 0; i < 1024; i++)
    {
      unsigned char pixel = ReadByteFromROM(i);
      // 这里用 pixel 进行 12864 显示
    }
}

裤脚口感好 发表于 2025-2-22 20:03

在 MPLAB C18 中,使用 rom 关键字将数据存储在 Flash 中后,需要通过特殊方式读取数据。

发送到工地施工 发表于 2025-2-22 23:56

ROM 和 RAM 的访问方式不同

雨果喝水 发表于 2025-2-23 02:18

如果你的代码没有针对 Flash 数据访问进行适配,可能会导致数据读取失败

wahahaheihei 发表于 2025-2-26 19:33

使用ROM关键字后可以了?

初级工程渣 发表于 2025-3-26 15:17

如果你需要频繁更新显示内容或者需要快速读取数组数据,应该将数组存储在 RAM 中,而不是 ROM。

xinxianshi 发表于 2025-3-27 11:48

那个老的编译器没法用了吧,都没法激活了。
页: [1]
查看完整版本: pic18f452把12864图片定义到rom中,但是在前面加上const rom后程序运行无法读取到图片