51单片机中汇编语言如何调用C的子程序

51单片机中汇编语言如何调用C的子程序,第1张

我的程序是KEIL编译的,如下

先申明

EXTRN

CODE

(_Send_CRC)

;Send_CRC是C中的函数,汇编中加了_

调用的时候

LCALL

_Send_CRC

如果要使用C中的变量,那么CODE变成相应的DATA,XDATA等

中断是硬件入口的无须主程序调用,不同的单片机入口地址不同但地址固定,应该在头文件有定义。发生中断时硬件把当前地址入栈然后跳到中断地址去那里通常只是跳转指令,c编译时会把它指向中断子程序。返回时会返回到中断处继续执行。

这个东西应该很好解决才对

安装你说的那种你的报警程序是 强延时

而不是利用定时器的,所以在报警的中途只有中断来搞定

其实这种方法非常不可取,,代码稍微大一点你就没法搞定了

/////////////////////////////////////////////////

解决问题1

安装你这种方法来

中断源停止也就是你的代码需要重头开始重新运行那么没有关系

你的 代码开始处肯定有初始化SP的地方所以说代码是完整的从头开始的

我不知道你的 急停按钮时干什么的

是不是以为着急停按钮后你的报警声音就没有了

如果是这样

可以在中断中直接修改报警的延时亮

比如要循环1000次你直接改成1次那么马上就没有报警了

///////////////////////////////////

2

不要采用这种结构写代码

写一个定时器中断进行计数

比如beep开启的话中断计数

在主循环处检查是不是计数到你要的值了到了就关闭,

这样的话关闭开启声音就很容易啊

关闭的时候修改beep = 0;开启的时候,beep=1,在吧要报警的长度放入

多么省力

不能把另一个工程当成子函数,但可以把某个C程序当成子函数。有两个方法

一,把常用的写好的C程序生成库函数,xxlib,当某个工程用到是,就加载进去,然后声明一个外部函数,就可以调用了。

二,把写好的C程序(原程序)加载到某个工程中,或#include 加载进来,就可以调用了。

如果是mainasm中有这句话$INCLUDE(RESETASM),简单的说就是在编译mainasm前,编译器先把RESETASM这个文件的所有语句放到main文件中,然后再编译main,相当于RESETASM是mainasm的一部分代码。

这样设计的话,要求工程里不能再单独编译连接RESETASM,这样会出现同名的警告。另一点,RESETASM中不能有END的结束符,否则编译器在编译到END后面的代码就不编译了,你的main函数实际就没有被编译,这可能是你烧到开发板上不行的原因。

具体没看到代码,先做如上猜想。不过如果有调试环境的话,单步debug应该能很快发现问题。

以上就是关于51单片机中汇编语言如何调用C的子程序全部的内容,包括:51单片机中汇编语言如何调用C的子程序、单片机使用C语言时,中断子程序在主程序中是怎样被调用的各位helpme!、51单片机调用子程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9427862.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存