keil C51中函数调用无法正确返回怎么回事1.是否进去了死循环没有设置退出死循环汇编语言c51调用函数的条件汇编语言c51调用函数;
2.中断不能用返回语句,中断程序尽可能的短;
3.检查堆栈的使用情况,51单片机的堆栈是和RAM复用的,不是一个独立的空间,检查汇编语言c51调用函数你的堆栈预留量是否够用,每次调用函数都会做压栈动作;
4.检查是否使用了goto语句,如果有的话查看跳转的标号处有无返回机制 。
5.如果是用汇编写的程序检查汇编语言c51调用函数你的程序段中有无改变DPTR的指令,有无忘写RET指令 。
如何在64位的linux系统上使用汇编和C语言混合编程C51与汇编语言混合编程(1).C51语言中调用汇编语言程序1、在文件中选中FILEGROUP和C51程序原文件,在配置文件选项中激活“i”产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含“三个选项 。2、根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入到工程中 。3、在C51语言中必须声明需要调用的函数为外部函数 。externvoidDELAY(void);4、在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是新定位的 。PUBLICDELAY,DELDELAYYSEGMENTCODERSEGAELAYY实例如下:#include"reg51.h"externvoidDELAY(void);externvoidDEL(void);voidmain(void){P1=0x00;DELAY();DEL();P!=0xff;}汇编语言文件:PUBLICDELAY,DELDELAYYSEGMENTCODERSEGAELAYYDELAY:MOVR2,#3HDJNZR2,$RETDEL:MOVR3,#3HDJNZR3,$RETEND(2)、C51语言中嵌入汇编程序:在C51语言中嵌套使用汇编语言程序要注意以下几个问题:1、在文件中选中FILEGROUP和C51程序原文件,在配置文件选项中激活“i”产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含“三个选项 。2、根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入到工程中 。3、用#pragmaasm.和#pragmaendasm语句包含嵌入的汇编语言程序 。实例如下:#include"reg51.h"voiddelay(void);voidmain(void){voiddelay(void);P1=0x00;#pragmaasmMOVR3,#08HDINZR3,$#pragmaendasmP1=0xff;}voiddelay(void){#pragmaasmMOVR4,#08HDJNZR4,$#pragmaendasm}
初学C51 怎样进行子函数调用这个简单,首先创建其头文件,比如定义为 myself.h
//myself.h 头文件里面这么写
#ifndef _MYSELF_H_
#define _MYSELF_H_
#include//这里添加需要的头文件 , 比如math.h这些
//声明函数可被外部使用
extern void delay(); //可被其他c调用,只需要加载其头文件以及对应c即可
#endif
继续创建myself.c文件
//myself.c文件中写
#include "myself.h"
void delay()
{
_nop_();
}
然后把myself.c文件加载到工程,放置主函数文件中#include "myself.h"这样即可 。
如何在C51语言程序中调用汇编语言程序把汇编中的函数也在头文件中进行函数申明汇编语言c51调用函数,引用这个头文件后,C语言就能调用这个函数汇编语言c51调用函数了,跟调用C函数是一样的 。
C51函数是如何调用在汇编语言c51调用函数你原来的函数基础上,加上三个参数,分别是:
1 要操作的PORT口
2 要进行的操作
3 要操作的引脚
当然,如果你的目标很明确,可以把以上三个参数裁剪掉一些,利于系统的效率提高.
下面是汇编语言c51调用函数我写的示例程序,你可能参考一下:
#includereg52.h
#define Pin00x01
#define Pin10x02
#define Pin20x04
#define Pin30x08
#define Pin40x10
#define Pin50x20
#define Pin60x40
#define Pin70x80
#define OPT_CPL 0x00 //----取反某位操作
#define OPT_CLR 0x01 //----清零某位操作
#define OPT_SET 0x02 //----置一某位操作
void Operate(
/*这里写你原来的参数,*/
unsigned char Port_Num,
unsigned char Opr_Style,
unsigned char Pins
)
{
//----如果在单片机PORT口范围之内,刚读取当前PORT口的状
//----如果不在范围之内 , 死循环
//----注意,为汇编语言c51调用函数了效率起见,这个部分可以根据实际应用进行裁剪
if(Port_Num == 0)
{
Port_Num = P0;
}
else if(Port_Num == 1)
{
Port_Num = P1;
}
else if(Port_Num == 2)
{
Port_Num = P2;
}
else if(Port_Num == 3)
{
Port_Num = P3;
}
else
{
while(1);
}
//----如果是取反相应位,进行异或操作
//----如果清零相应位,则位与操作
//----如果置位相应位,则位或操作
【汇编语言c51调用函数 汇编语言调用c程序】//----如果都不在范围之内,则死循环
//----这段代码也根据实际情况裁剪
if(Opr_Style == OPT_CPL)
{
Port_Num ^= Pins;
}
else if(Opr_Style == OPT_CLR)
{
Port_Num = ~Pins;
}
else if(Opr_Style == OPT_SET)
{
Port_Num |= Pins;
}
else
{
while(1);
}
//----如果在单片机PORT口范围之内,刚读取当前PORT口的状
//----如果不在范围之内,死循环
//----注意,为了效率起见 , 这个部分可以根据实际应用进行裁剪
if(Port_Num == 0)
{
P0 = Port_Num;
}
else if(Port_Num == 1)
{
P1 = Port_Num;
}
else if(Port_Num == 2)
{
P2 = Port_Num;
}
else if(Port_Num == 3)
{
P3 = Port_Num;
}
else
{
while(1);
}
//----以上的内容,可根据实际情况进行裁剪,以实现程序最优化
//----添加你的功能的其他代码---------------
}
void main(void)
{
//----使用示例:函数功能的同时,置位P2口的P2.0,P2.5,P2.7
Operate(/*这里写你原来的参数*/2,OPT_SET,(Pin0|Pin5|Pin7));
//----使用示例:函数功能的同时,清零P1口的P1.2,P1.5,P2.6
Operate(/*这里写你原来的参数*/1,OPT_CLR,(Pin2|Pin5|Pin6));
}
关于汇编语言c51调用函数和汇编语言调用c程序的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- sqlserver思维导图,sql数据库基础知识思维导图
- 益智游戏投壶,幼儿园游戏趣味投壶教案
- 怎么打游戏更高帧率手机,如何使手机打游戏流畅
- go语言获取ftp文件 golang ftp client
- 鸿蒙276版本体验,鸿蒙20 136
- 适合做毕业设计的网站有哪些,适合做毕业设计的游戏
- java计算器清0代码的简单介绍
- vb.net字符转16 vba字符转换成数字
- sqlserver两表比对,sqlserver对比两个表的区别