第1个回答 2009-06-08
1,因为堆栈也要用到idata部分的RAM,所以当然不能太多。考虑到堆栈的关系,所以idata能定义的数据是不太确定的,与实际程序的复杂性有关。建议对速度要求不高或者使用不频繁的变量尽量不要定义在idata。只有xdata,有多少就可以用多少
2,这个很正常,因为你的XDATA只有256字节,一个汉字就占用2字节,10组的话,一组才25字节左右,并不算多。超过了不会覆盖前面的,只会使用后面的地址,虽然这些地址实际上并没有对应的硬件空间,当然,这样运行也会出错
如果你这个数组在运行的时候不需要修改,建议在前面加个code,这样就不占用RAM了
3,子程序中的RAM是局部变量,程序编译的时候会做覆盖分析,如果编译器确认两个变量对应的子程序不可能同时运行,那这些变量就会别覆盖,能节省RAM
4,汉字字库一般用ROM来扩展,用RAM不好。因为RAM不可能掉电保存数据的,所以实际上你的程序里还得先有个汉字字库,然后拷贝到RAM里,这样就浪费空间了。实际上8051的RAM空间也装不下一个汉字库。建议用串行的EEPROM来装汉字库,这样扩展简单一些。外部RAM里的变量仍然用xdata就行
5,这个就是我上面说的串行存储芯片。串行存储芯片的地址空间无法直接使用在8051的存储空间,当然就不能直接通过变量去访问,只能用函数去访问。所以建议你做一个读取函数,从EEPROM里读取所需汉字的字库内容到一个临时数组里。
RAM扩展可以用常见的SRAM芯片,例如62256,8bit*32K,当然一般还需要个地址锁存器,例如74HC573,更简单的方法是选择内部RAM足够的单片机。有些8051内部集成有8KB SRAM,对于大多数场合来说是够用了
第3个回答 2009-06-08
data【一般不写】:定义低128个字节
idata:定义0~255个字节
xdata:0~65535个字节
如果做汉字库的话,一般我们是定义在rom区的
定义的格式是
unsigned char code HANZIKU[2848] ={
/*保 CB1A3 */
0x10,0x00,0x1B,0xF8,0x12,0x08,0x22,0x08,0x32,0x08,0x63,0xF8,0xA0,0x40,0x2F,0xFE,
0x20,0xE0,0x21,0x60,0x21,0x50,0x22,0x58,0x24,0x4E,0x28,0x44,0x20,0x40,0x00,0x00,
。。。。。