用ATmega8写MzL05-12864 液晶驱动,flash只能存几个16*16汉字的字模,程序才4K不到,为什么?
用ATmega8写MzL05-12864 液晶驱动,flash只能存几个16*16汉字的字模,程序才4K不到,flash不是有8K吗?我想存100个汉字进去,难道还要我加存储器,没搞错啊!字库只要大点程序就运行错误,现在只能存10个字的,我驱动是与字数无关的,字模数组是存在程序存储的. 你不会是存到RAM里去了吧? 估计是用的GCC,然后声明字模数据称const了。 2楼说我不错,我是声明字模数据称const了,这样子有什么不对吗,我这前是学51的,AVR是刚学的. 呵呵,GCC先看一下它的文档,pgm部分 我现在用AtmanAvr这个软件也还是这样子,我没有声明字模数据在const 这个gcc和keil c不一样,gcc符合标准。 问题搞清楚了,只要定义字模数组在FLASH里就可以了,然后就是调用的问题了,我试过了好多种方法都不行,都有是在网是找的,读到的数据和我存的不一样,为什么?还有就是ATmega8的FLASH不能存100个汉字的字模,是我算错了. 注意:M8的FLASH为8K字节(4K字)。如果你的程序本身不到4K字节的话,那么可以放100个字的字模(32*100=3200字节)。 在GCC里找到了读FLASH的函数了,现在我把读写的都表上来,其实在芯艺的<<AVR单片机GCC程序设计>>里面就有,我最近弄AVR就是一直参考他的这本书的,太有帮助了,真是太感谢他了!
flash 中的变量
在 flash 空间声明变量,GCC 规定使用关键字 __attribute__((progmem))。为了应用上方便,在 <progmem.h>文件中定义了 flash 空间的数据类型,可以直接使用他们定义 flash 变量。表 5-1 列出了这些数据类型。
表 5-1 flash 空间的数据类型
--------------------------------------------------------------------------------
类型 定义
prog_void void __attribute__((progmem))
prog_char char __attribute__((progmem))
prog_uchar unsigned char __attribute__((progmem))
prog_intint __attribute__((progmem))
prog_longlong __attribute__((progmem))
prog_long_longlong long __attribute__((progmem))
PGM_Pprog_char const*
PGM_VOID_Pprog_void const*
--------------------------------------------------------------------------------
flash 空间的变量定义。
const prog_uchar LINE[] = {1,2,3,4};
AtmanAvr C 定义了宏 FLASH , flash 空间的变量也可以如下定义:
FLASH char str[] = {"string in flash"};
读FLASH
pgm_read_byte
#include <pgmspace.h>
pgm_read_byte(unsigned short addr);
返回值
8-bit 数据
参数
addr 16-bit ROM 地址
注释
从程序存储空间 addr 读取一字节。
FLASH double d = 123.456; 学习了。感谢 这个学习了。 请问楼主你用的什么编程软件 是winAVR?
页:
[1]