梦想飞 发表于 2012-10-23 22:42:18

AVR一小段程序不能编译成功

本人写了一个avr的数码管显示程序,但是编译不成功,我用的是atmega48的芯片,希望高手能帮忙解决一下!
#include<iom48v.h>
#include<macros.h>
#define uchar unsigned char
#pragma data:code //共阳数码管断码                           
consttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,
                        0x80,0x90,0x88,0x83,0xc6,0x98,0x86,0x8e};
#pragma data:data//设置数据区回到数据存储区
void display(uchar shu1,uchar shu2,uchar shu3,uchar shu4);
void delay(uchar z);

void main()
{
   while(1)
   {
            display(1,2,3,4);
   }
}

void display(uchar shu1,uchar shu2,uchar shu3,uchar shu4)
{
   DDRC=0XFF;
   PORTC=0XFF;
   DDRB=0XFF;
   PORTB=0X00;
   
   PORTC&=~BIT(1);
   PORTB=table;
   delay(5);
   
   PORTC|=BIT(1);
   PORTB=0X00;
   PORTC&=~BIT(2);
   PORTB=table;
   delay(5);
   
   PORTC|=BIT(2);
   PORTB=0X00;
   PORTC&=~BIT(4);
   PORTB=table;
   delay(5);
   
   PORTC|=BIT(2);
   PORTB=0X00;
   PORTC&=~BIT(5);
   PORTB=table;
   delay(5);
}

void delay(uchar z)
{
       uchar i,j;
       for(i=z;i>0;i--)
               for(j=1141;j>0;j--);
}

梦想飞 发表于 2012-10-23 22:43:36

错误显示第七行有错:cannot initialize RAM area

lwb807 发表于 2012-10-23 23:15:51

#pragma abs_address:0xFD8 //从0XXXX处开始分配地址
const unsigned chartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,
                         0x80,0x90,0x88,0x83,0xc6,0x98,0x86,0x8e};
#pragma end_abs_address   //恢复正常的浮动定位
改用这种写法,就可以通过效果一样一样滴!

梦想飞 发表于 2012-10-24 22:30:09

用这个编译可以通过了,不过数码管显示全为八和小数点,是不是问题出在0xfd8?
#pragma是什么意思?谢谢回复!

yklstudent 发表于 2012-10-25 09:00:59

不知道什么意思 也想起来这么用 楼主可以去占卜了

Gorgon_Meducer 发表于 2012-10-25 09:59:50

#pragma data:code //共阳数码管断码                           
consttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,
                        0x80,0x90,0x88,0x83,0xc6,0x98,0x86,0x8e};
#pragma data:data//设置数据区回到数据存储区
修改为
__flash table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,
                        0x80,0x90,0x88,0x83,0xc6,0x98,0x86,0x8e};

不需要这两个多余的pragma

xqn2012 发表于 2012-10-28 22:32:59

#pragma data:code随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。
#pragma data:data随后的数据将存贮在数据区,即RAM区,此区可存贮常量和变量。

zpxa001 发表于 2012-10-28 22:44:17

#pragma: 编译器指令,告诉编译器相关代码如何编译。

qwermhb 发表于 2012-10-29 00:18:21

#pragma data:code //共阳数码管断码                           
consttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,
                        0x80,0x90,0x88,0x83,0xc6,0x98,0x86,0x8e};
#pragma data:data//设置数据区回到数据存储区
红色字不需要

直接
unsigned char consttable[]={};

yklstudent 发表于 2012-10-29 08:00:16

LS的方法是行不通的 数据压根存得地方就不对

gallle 发表于 2012-10-29 08:33:20

#pragma data:code //共阳数码管断码                           
const unsigned chartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,
                        0x80,0x90,0x88,0x83,0xc6,0x98,0x86,0x8e};
#pragma data:data//设置数据区回到数据存储区
即使是Flash区,也要有类型定义呀

qwermhb 发表于 2012-10-29 09:12:39

yklstudent 发表于 2012-10-29 08:00 static/image/common/back.gif
LS的方法是行不通的 数据压根存得地方就不对

直接uint8 const table[]={};就行了,可以的,只要是存储在flash区就行了,为什么要知道存在那里,在ICC里这样就行定义变量到flash区

yklstudent 发表于 2012-10-29 12:02:59

本帖最后由 yklstudent 于 2012-10-29 12:05 编辑

qwermhb 发表于 2012-10-29 09:12 static/image/common/back.gif
直接uint8 const table[]={};就行了,可以的,只要是存储在flash区就行了,为什么要知道存在那里,在ICC ...

哦 是我自己搞错了 这是ICC 而不是GCC

梦想飞 发表于 2012-11-2 22:31:13

谢谢指点!
页: [1]
查看完整版本: AVR一小段程序不能编译成功