pic18f452把12864图片定义到rom中,但是在前面加上const rom后程序运行无法读取到图片
我用的是MCC18编译器,烧写在实物中后,在数组前面加上rom,128*64不能显示,不加的话就可以,想知道这是为嘛?求告知!!!感激不尽!!!难道写进rom后读取的方式不一样么? 是的,在 MCC18 编译器下,const rom 关键字会将数据存入 程序存储器(Flash ROM),而普通的 const 变量通常存入 RAM。因为 PIC18F452 的 Flash ROM 和 RAM 访问方式不同,你不能直接用普通的指针访问 rom 数据,而是需要使用 memcpypgm2ram() 或者 ReadProgramMemory() 这样的方式来读取数据。 #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 显示
}
const rom unsigned char imgData → 存入 Flash ROM。
unsigned char ramBuffer → RAM 缓冲区。
memcpypgm2ram() 把 Flash ROM 里的数据复制到 RAM,之后才能读取。 使用 ReadProgramMemory()
如果你不想复制整个数组,而是动态读取 Flash 里的数据,可以用 ReadProgramMemory() #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 显示
}
}
在 MPLAB C18 中,使用 rom 关键字将数据存储在 Flash 中后,需要通过特殊方式读取数据。 ROM 和 RAM 的访问方式不同 如果你的代码没有针对 Flash 数据访问进行适配,可能会导致数据读取失败
使用ROM关键字后可以了? 如果你需要频繁更新显示内容或者需要快速读取数组数据,应该将数组存储在 RAM 中,而不是 ROM。 那个老的编译器没法用了吧,都没法激活了。 PIC18F452 中,用 const rom 定义图片到 ROM,需注意访问方式。ROM 数据需用特定函数读取(如 memcpy_P),直接指针访问可能失效。检查是否正确使用 ROM 数据读取函数,确保指针类型匹配,确认编译器对 rom 关键字的支持及内存模型配置是否正确。
pic18f452 的 ROM(程序存储器)读取需用特定指令。加 const rom 后,数据存于程序空间,直接访问会失败。需用 PSV(程序空间可见性)机制,使程序空间数据映射到数据空间,或用查表指令(如 tblrd)读取,否则因访问方式不对,无法读取图片数据。
可能是存储类型声明或读取方式问题。PIC18F452 的 ROM 需用__prog__或const加特定属性声明,仅const rom可能不被编译器正确识别。读取时需用pgm_read_byte()等函数,而非普通内存访问,因 ROM 需特殊指令读取。检查声明语法与读取函数是否匹配。
页:
[1]