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--);
} 错误显示第七行有错:cannot initialize RAM area #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 //恢复正常的浮动定位
改用这种写法,就可以通过效果一样一样滴! 用这个编译可以通过了,不过数码管显示全为八和小数点,是不是问题出在0xfd8?
#pragma是什么意思?谢谢回复! 不知道什么意思 也想起来这么用 楼主可以去占卜了 #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 #pragma data:code随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。
#pragma data:data随后的数据将存贮在数据区,即RAM区,此区可存贮常量和变量。
#pragma: 编译器指令,告诉编译器相关代码如何编译。 #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[]={}; LS的方法是行不通的 数据压根存得地方就不对 #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区,也要有类型定义呀 yklstudent 发表于 2012-10-29 08:00 static/image/common/back.gif
LS的方法是行不通的 数据压根存得地方就不对
直接uint8 const table[]={};就行了,可以的,只要是存储在flash区就行了,为什么要知道存在那里,在ICC里这样就行定义变量到flash区 本帖最后由 yklstudent 于 2012-10-29 12:05 编辑
qwermhb 发表于 2012-10-29 09:12 static/image/common/back.gif
直接uint8 const table[]={};就行了,可以的,只要是存储在flash区就行了,为什么要知道存在那里,在ICC ...
哦 是我自己搞错了 这是ICC 而不是GCC 谢谢指点!
页:
[1]