ICCAVR 转WINAVR flash存储问题
上面的程序在ICCAVR中可以实现液晶的正常显示,想请教用WINAVR的大师们,如何改在能在WINAVR中正常使用.如果把字库存储到flash中,然后读取出来,谢谢.
display.H 无字库液晶,字模数据表
typedef structtyp_nAsciiDot8X16 // 汉字字模数据结构
{
unsigned char Index; // 汉字内码索引
unsigned char Msk; // 点阵码数据
};
// ------------------ASCII字模的数据表 ------------------------ //
// 码表从0x20~0x7e //
// 字库: C:\Documents and Settings\Administrator\桌面\解密与加密\12864液晶图片取模软件\12864液晶图片取模软件\Asc8X16E.dat 纵向取模下高位//
// -------------------------------------------------------------- //
const struct typ_nAsciiDot8X16 nAsciiDot8X16[] = // ASCII
{
'0',0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00, // -0-
'1',0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00, // -1-
'2',0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00, // -2-
'3',0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00, // -3-
'4',0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00, // -4-
'5',0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00, // -5-
'6',0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00, // -6-
'7',0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00, // -7-
'8',0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00, // -8-
'9',0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00, // -9-
}
display.c
for(number=0;number<=100; number++)
{
if((cl==GB_16.Index)&&(ch==GB_16.Index))
{
ICCAVR中的读取方式
}
}
本帖最后由 ada1983 于 2012-9-4 16:25 编辑
struct typFNT_GB16 // 汉字字模数据结构
{
signed char Index; // 汉字内码索引
unsigned char Msk; // 点阵码数据
};
struct typFNT_GB16 GB_16[] PROGMEM = // 数据表
{
{"电", {0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,
0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,}},
{"机", {0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFC,
0x04,0x04,0x04,0xFE,0x04,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x80,0x41,0x20,0x1F,
0x00,0x00,0x00,0x3F,0x40,0x40,0x70,0x00,}},
{"长", {0x80,0x80,0x80,0x80,0xFF,0x80,0x80,0xA0,
0x90,0x88,0x84,0x86,0x80,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x23,
0x04,0x08,0x10,0x20,0x60,0x20,0x00,0x00,}},
{"度", {0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,
0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,}},
};
for (k=0;k<sizeof(GB_16)/sizeof(GB_16);k++) // 查找定位
{
if (c1 ==pgm_read_byte(GB_16.Index) && c2 == pgm_read_byte(GB_16.Index+1))
break;
}
有个关键字PROGMEM,读取的时候用 pgm_read_byte();
******************************************************
以前折腾过一阵,翻了一堆程序翻出来的,你试下呢,我从ICC移植过去的,应该是试过的,时间久了......
ada1983 发表于 2012-9-4 16:23 static/image/common/back.gif
struct typFNT_GB16 // 汉字字模数据结构
{
signed char Index; // 汉 ...
谢谢你,非常感谢.. 忘说了,要引入这个头文件的 #include <pgmspace.h>...... ada1983 发表于 2012-9-4 16:46 static/image/common/back.gif
忘说了,要引入这个头文件的 #include ......
if (c1 ==pgm_read_byte(GB_16.Index) && c2 == pgm_read_byte(GB_16.Index+1))
最主要是你这种读取方式启发了我,如何取得结构体的数组成员地址...我仔细看了#include "Pgmspace.h"这个头文件定义,是不是现在都不用typedef char PROGMEM prog_char这定义里面的prog_char,我在studio 6里面如果这样定义: prog_char flash_a=100; 则会提示prog_char 未定义.现在是不是统一用PROGMEM,比如 unsigned char a PROGMEM =100;这样定义的话,就不会报错..还请明示,刚从ICCAVR转过来,对这个非常不解. const unsigned char sttBox PROGMEM ={
0x11,0x11,0x11,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x10}
如上,都是直接在定义最后加PROGMEM即可......
prog_char 没研究过,当时移植了好用就没深究了,主要还是用ICC的:)
页:
[1]