这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » C51,C51 C51求助:C51中加入汇编怎么编译错误?出现了怪事

共2条 1/1 1 跳转至

C51,C51 C51求助:C51中加入汇编怎么编译错误?出现了怪事

院士
2006-09-17 18:14:16     打赏
C51,C51 C51求助:C51中加入汇编怎么编译错误?出现了怪事



关键词: 求助     加入     汇编     怎么     编译     错误     出现     怪事    

院士
2006-12-22 22:43:00     打赏
2楼
问 各位看官、DX你们好!小弟我在Keil V7.07环境下编了
如下程序,可是编译出现了错误(见下)
我看了汇编后的代码,竟然将ack()函数作为起始地址了!
我将startup.a51加入到源文件中,如下的警告多出了一个,再看代码
确实将RAM初始化加到了程序的开头,可是出现了死循环,一直初始化。
请问,中断中可否用汇编?若可用,该怎么用?先谢谢了

assembling .\g115.src...
linking...
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ?C_STARTUP
    MODULE:  .\g115.obj (G115)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ?C?CCASE
    MODULE:  .\g1105.obj (PG115)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  ?C?CCASE
    MODULE:  .\g1105.obj (G115)
    ADDRESS: 013DH

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^1;   /* i2c AT24C02 SCL pin */
sbit sda=P3^0;  /* i2c AT24C02 SDA pin */
sbit sound=P1^7;
sbit p01=P3^2;      
sbit p02=P3^3;
uchar volatile data getabyte,addres,dlycont;
uchar volatile data read[3],insbak;
uint data needfq;

void icstart(void)
void icstop(void)
void ack(void)

void time0() interrupt 1
{
  #pragma asm
PUSH    PSW
PUSH    ACC
PUSH    B
PUSH    DPH
PUSH    DPL
MOV     PSW,#08H
DEC     dlycont
MOV     TH0,#03CH
MOV     TL0,#0B8H
MOV     A,dlycont
JNZ     ?C0002
CLR     ET0
CLR     EA
MOV     A,#03H    
ADD     A,insbak
MOV     addres,A  ;将地址传回来
POP     DPL
POP     DPH
POP     B
POP     ACC
POP     PSW
POP     DPL  ;POP PC VALUE
POP     DPH
MOV    DPTR,#?main?red3
PUSH DPL
PUSH DPH
SJMP ?C0333

  ?C0002:
POP     DPL
POP     DPH
POP     B
POP     ACC
POP     PSW

?C0333:
RETI  
#pragma endasm
}

void time1() interrupt 3 using 2
{
TH1=needfq>>8;
TL1=(uchar)needfq;
sound=!sound;
}

void main ()
{
  uchar data counter,keyprstime,datan;
  uchar data addr,testb,tabf;
addr=addres=counter=0;   /*  */
keyprstime=insbak=0;
  if (!p01)
  {
   delay50ms(15);
   if (!p01) testb=0x74;
   ......
   
red3: if (testb==0xa5)
  .......
}

void icstart(void)
{
scl=0;
sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
sda=0;
_nop_();
}

void icstop(void)
{
.......
}

void ack(void)
{
scl=0;
_nop_();
sda=0;
_nop_();
scl=1;
_nop_();
_nop_();  
} 1: MOV    DPTR,#?main?red3这一句的作用是想中段后返回到指定地址 2: 再次请教啊! 3: 在options for files"g115.c"中我也勾选了:generate assmbler SRC filer和assmble SRC file 两选项 4: 顶 5: 这个问题没有人感兴趣吗? 6: 大家都准备过年了,不来了?祝大家春节快乐! 7: 我也出现过啊!!!!奇怪的是执行时没从MAIN函数开始反而从一个子函数开始,是不是KEIL不支持混合模式编程啊? 8: 急!求教高手指点!! 9: C中断C51编程只要是进入interrupt 函数
回自动把A,B,PSW等压入堆栈,你又写
PUSH    PSW
PUSH    ACC
PUSH    B
PUSH    DPH
PUSH    DPL
重复.没有必要这么做的.还是好好的去看看关于中断的C51的书吧. 10: 谢谢zhang_2000和eric_tj,我多试试看吧!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]