共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |