共2条
1/1 1 跳转至页
C51,C51 C51求助:C51中加入汇编怎么编译错误?出现了怪事

问
各位看官、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,我多试试看吧!
如下程序,可是编译出现了错误(见下)
我看了汇编后的代码,竟然将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 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 |