liu252799093 发表于 2012-9-4 15:59:03

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:23:57

本帖最后由 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移植过去的,应该是试过的,时间久了......

liu252799093 发表于 2012-9-4 16:43:45

ada1983 发表于 2012-9-4 16:23 static/image/common/back.gif
struct typFNT_GB16               // 汉字字模数据结构
{
    signed char Index;               // 汉 ...

谢谢你,非常感谢..

ada1983 发表于 2012-9-4 16:46:00

忘说了,要引入这个头文件的   #include <pgmspace.h>......

liu252799093 发表于 2012-9-5 10:00:50

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转过来,对这个非常不解.

ada1983 发表于 2012-9-5 10:38:41

const unsigned char sttBox PROGMEM ={
      0x11,0x11,0x11,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x10}

如上,都是直接在定义最后加PROGMEM即可......

prog_char 没研究过,当时移植了好用就没深究了,主要还是用ICC的:)



页: [1]
查看完整版本: ICCAVR 转WINAVR flash存储问题