我很难理解为什么我在尝试从存储在rom中的多维表中读取随机数据。
我有一个表的位图字符,我想显示在OLED屏幕上。表的字符太大,不适合在冲压和rom是自然的地方为它。当我试图从表中读取元素时,数据不是存储在表中的数据。
这就是我想要做的。在请求使用C文件时,我已经将位图声明为多维数组:
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,...在这里,我尝试读取数据并将其打印到屏幕上:
for(i=0; i<4; i++)
{
PutImage(number[digit][i],20,4,offset,i+2);
}PutImage功能的实现:
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,我不确定这是否是我需要注意的东西,或者编译器是否知道如何处理它。
发布于 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中的数组会导致指针指向随机值。
我没有注意到代码中的这个缺陷,编译器也没有足够聪明去抱怨这一点。
发布于 2013-12-02 11:40:51
将数据存储在ROM (.txt部分)或RAM (.data部分)中与您所面临的问题无关。
假设初始化是正确的,并且初始化所有元素(如果不初始化,则忽略的元素将默认初始化为0),问题可能是函数的实现:PutImage。因为当尺寸变大时你有问题,也许你有一些硬编码的值.
https://stackoverflow.com/questions/20326962
复制相似问题