新闻  |   论坛  |   博客  |   在线研讨会
怎样在CodeVision中使用结构型数组的用法实例
tvb2058 | 2007-12-04 14:49:37    阅读:2229   发布文章

在编写带有点阵液晶模块的程序时,需要将字模数据写成结构型数组,程序的表达比较清晰,在C51中我们都已经习惯于这样
写,虽然会多占用几个字节空间, 但是对扩展维护很有利。以前我曾将这种结构用于ICCAVR中,没有遇到问题。但不久前有网友用
CVAVR却遇到了麻烦,怎么写都通不过,原因是CVAVR在这方面的语言格式要求比较严谨,必须严格按照C语言的格式书写,否则就
会报错,而且所报的错误有点莫名其妙,有时仅说你漏了一个分号或者是漏了一个花括号,让人无从下手,现在我们给出一个实例
的演示代码,供大家参考。
#include <90s8515.h>

char tt[32];

flash struct flash_structure{     // 定义汉字字模数据结构
      signed char Index[4];       // 这里一定要定义成偶数,大于2
      char Msk[32];               // 点阵码部分,大于等于点阵码字节数
} GB_16[2] ={

{"中", {0x01,0x00,0x01,0x00,0x21,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,
        0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00}},
{"文", {0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x08,0x20,0x08,0x20,0x08,0x20,0x04,0x40,
        0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00}}
};

void main(void) // 测试用
{
unsigned char i;
        for(i=0;i<32;i++){
                tt[i]=GB_16[1].Msk[i];
        }
        while(1);
}

对应的汇编码:
          _GB_16:
          _0GB_16:
              .DB  0xD6,0xD0, 0x0
          _1GB_16:
              .DB   0x1, 0x0, 0x1, 0x0,0x21, 0x8,0x3F,0xFC
              .DB  0x21, 0x8,0x21, 0x8,0x21, 0x8,0x21, 0x8
              .DB  0x21, 0x8,0x3F,0xF8,0x21, 0x8, 0x1, 0x0
              .DB   0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0
          _2GB_16:
              .DB  0xCE,0xC4, 0x0
          _3GB_16:
              .DB   0x2, 0x0, 0x1, 0x0, 0x1, 0x0,0xFF,0xFE
              .DB   0x8,0x20, 0x8,0x20, 0x8,0x20, 0x4,0x40
              .DB   0x4,0x40, 0x2,0x80, 0x1, 0x0, 0x2,0x80
              .DB   0x4,0x60,0x18,0x1E,0xE0, 0x8, 0x0, 0x0

从汇编代码可以看到,实际占用的空间汉字部分只用了3字节而并不是我们定义的4字节,但这个第三字节对我们来说还是浪费掉了,
可惜。我们可以采用另一种写法,就是把汉字定义为int型,每个汉字可以节省一字节空间:
#include <90s8515.h>

char tt[32];

flash struct flash_structure{     // 定义汉字字模数据结构
      signed int Index;           // 这里定义为int型
      char Msk[32];               // 点阵码部分,大于等于点阵码字节数
} GB_16[2] ={
{'中', {0x01,0x00,0x01,0x00,0x21,0x08,0x3F,0xFC,
        0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,
        0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,
        0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00}},
{'文', {0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,
        0x08,0x20,0x08,0x20,0x08,0x20,0x04,0x40,
        0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,
        0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00}}
};
对应的汇编码:
          _GB_16:
          _0GB_16:
              .DW  0xD6D0
          _1GB_16:
              .DB   0x1, 0x0, 0x1, 0x0,0x21, 0x8,0x3F,0xFC
              .DB  0x21, 0x8,0x21, 0x8,0x21, 0x8,0x21, 0x8
              .DB  0x21, 0x8,0x3F,0xF8,0x21, 0x8, 0x1, 0x0
              .DB   0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0
          _2GB_16:
              .DW  0xCEC4
          _3GB_16:
              .DB   0x2, 0x0, 0x1, 0x0, 0x1, 0x0,0xFF,0xFE
              .DB   0x8,0x20, 0x8,0x20, 0x8,0x20, 0x4,0x40
              .DB   0x4,0x40, 0x2,0x80, 0x1, 0x0, 0x2,0x80
              .DB   0x4,0x60,0x18,0x1E,0xE0, 0x8, 0x0, 0x0

    注意:两种定义方法上的区别,在汉字上对应于char时用双引号,而对应于int型时应该用单引号。
    编译以后可以用AVR Studio3调试,观察RAM窗口中的数据变化,就会发现其中的“文”所对应的点阵码全部被正确地复制到了
RAM地址0xe0开始的空间中,你可以逐个核对一下。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客