首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pic18读取C18 rom常量

用pic18读取C18 rom常量
EN

Stack Overflow用户
提问于 2013-12-02 11:16:23
回答 2查看 2.3K关注 0票数 2

我很难理解为什么我在尝试从存储在rom中的多维表中读取随机数据。

我有一个表的位图字符,我想显示在OLED屏幕上。表的字符太大,不适合在冲压和rom是自然的地方为它。当我试图从表中读取元素时,数据不是存储在表中的数据。

这就是我想要做的。在请求使用C文件时,我已经将位图声明为多维数组:

代码语言:javascript
复制
rom const char number[15][4][20] = { {
{0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0x70, 0x78, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0xf0, 0xe0, 0xc0, 0x00, 0x00},// row 1 columns 19
{0x00,...

在这里,我尝试读取数据并将其打印到屏幕上:

代码语言:javascript
复制
for(i=0; i<4; i++)
    {
        PutImage(number[digit][i],20,4,offset,i+2);
    }

PutImage功能的实现:

代码语言:javascript
复制
void PutImage(char ptr[], unsigned char sizex, unsigned char sizey, unsigned char startx, unsigned char starty)
{
unsigned char _page, _column;

//startx += OFFSET;

OledWriteCommand(0xb0+starty);
OledWriteCommand(startx&0x0F);
OledWriteCommand(0x10 | ((startx>>4)&0x0F));

for(_column=0; _column<sizex; _column++)
{
    OledWriteData(ptr[_column]);
}
}

如果我修改它,使数据适合于ram,它就能正常工作。所以问题必须是数据一开始就没有被正确存储,或者我使用它的方式是不正确的。

我使用的Pic是18F27J53,数据表第7.1节(表读和表写)介绍了用于在程序内存和ram之间移动字节的一些汇编程序操作。由于我使用的是C,我不确定这是否是我需要注意的东西,或者编译器是否知道如何处理它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-02 13:17:10

好的相关问题及其答案让我(希望)回到了正确的轨道:Can I make a function that accepts both ram and rom pointers in Microchip C18?

感谢潘德里指出,如果PutImage的实现可能是原因。我通过创建重复函数PutROMImage使代码工作,它接受“近rom char*”-type,而不是默认为ram的"char*“。

因此,C18不允许指针同时指向ram和rom,而PutImage -function参数默认为ram。因此,将指针传递给位于rom中的数组会导致指针指向随机值。

我没有注意到代码中的这个缺陷,编译器也没有足够聪明去抱怨这一点。

票数 1
EN

Stack Overflow用户

发布于 2013-12-02 11:40:51

将数据存储在ROM (.txt部分)或RAM (.data部分)中与您所面临的问题无关。

假设初始化是正确的,并且初始化所有元素(如果不初始化,则忽略的元素将默认初始化为0),问题可能是函数的实现:PutImage。因为当尺寸变大时你有问题,也许你有一些硬编码的值.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20326962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档