xinxin3219 发表于 2011-4-25 22:04:04

小弟写了个AVR的小程序,用PROTUES仿真时出现“invalid opcode 0xffff at PC=0X0012”

#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char
#define uintunsigned int

void delayms(uint z)                  
{
uint i,j;
for( i=0;i<z;i++)
for(j=0;j<1141;j++);        //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}

void write_com(uchar com)//写命令函数
{DDRC|=BIT(0)|BIT(1);
DDRD=0XFF;
PORTD=com;
PORTC&=~BIT(0);
PORTC&=~BIT(1);
delayms(1);

}
void write_dat(uchar dat)//写数据函数
{DDRC|=0x03;
DDRD=0XFF;
PORTD=dat;
PORTC|=BIT(0);
PORTC&=~BIT(1);
delayms(1);
}
void lcd_init()    //初始化函数
{
write_com(0x38);//设置8位格式,2行,5*7
write_com(0x0c);//整体显示,关光标,不闪烁
write_com(0x06);//设定输入方式,增量不移位
write_com(0x01);//清屏指令
delayms(3);//延时来等待忙指令
}

void lcdshow(uint x,uint y,uint j)
{

if(y==1)
   write_com(0x80+x);
else
   write_com(0xc0+x);
   write_dat(0x30+j);

}//定坐标(x,y)显示数字j
void adc_init()
{
DDRA&=~BIT(3);
PORTA&=~BIT(3);//将PA3口配置为无上拉电阻
ADMUX=0Xe3;//选择2.56基准电压,左对齐,输入通道为PA3口
ADCSRA=0X80;//adc使能
}

void main()
{uint addata;
unsigned long v;
lcd_init();
adc_init();
ADCSRA|=BIT(ADSC);//ADSC=6,前面头文件里面定义过的,这里表示开始转换
while(1)
{
while(ADCSRA&BIT(ADIF));
addata=ADCL;
addata=addata+ADCH*256;

v=addata/1024.0*5;
v=(int)v*1000;
lcdshow(0,0,v/1000);
write_dat(0x2e);
lcdshow(2,0,v%1000/100);
lcdshow(3,0,v%100/10);
lcdshow(4,0,v%10);
}

}
以上是我的程序,下面是编译的结果,是用ICCAVR编译的
C:\icc\bin\imakew -f ad.mak
    iccavr -o ad -LC:\icc\lib\ -m -g -dram_end:0x25f -bdata:0x60.0x25f -Wl-W -bfunc_lit:0.0x2000 -dhwstk_size:16 -fihx_coff @ad.lk
Device 23% full.
Cannot find source file E:\chenxu\AVRC\ad\ad.c
Done.
页: [1]
查看完整版本: 小弟写了个AVR的小程序,用PROTUES仿真时出现“invalid opcode 0xffff at PC=0X0012”