|
|
| | -文章搜索 - 最新文章 - | |
第554篇:怎样在CodeVision中使用结构型数组的用法实例 作者[xiaoqi]© |
| 发布时间:2003年5月22日 点击次数:6149 |
| 来源: 作者: |
写,虽然会多占用几个字节空间, 但是对扩展维护很有利。以前我曾将这种结构用于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开始的空间中,你可以逐个核对一下。 |
|
|
|
|
[AVR单片机] 相关文章: 用mega8515 替换8515的相关问题--双龙简介: 通告:90S8515停产,MEGA8515兼容代替,性能更强 由于AT90S8515停产,请大家选用ATMEGA8515兼容代替,原AT90S8515本身的一些问题在ATMEGA8515得到改善,抗干扰性能更佳. 请下载AT908515向MEGA8515转换应用手册 http://www.laogu.com/download/tihuan8515.pdf ...... AVR Studio 问题!为什么我在串口中断程序中设置的断点,却不产生中断?? 请问AVR的I/O口能直接作数码管位选吗? AVR汇编语言如何实现如 LJMP @A+DPTR这样的散转结构 请问在CODEVISION AVR C中如何在函数中传递数组的地址? |
|
|
|