Keil3中为什么添加不了子程序模块

Keil3中为什么添加不了子程序模块,第1张

在keil中新建工程,先用汇编编写主体程序,在主体程序中要对要调用的子程序进行声明,如EXTRN CODE (function)

EXTRN DATA (DATT0,DATT1,DATT2) ,然后,另建立一个c语言的文件,(千万不要把汇编和c放到一个文件中)并加入到新的工程中,进行编译。下面给一个在网上搜的,有空我编一个例子。

汇编语言调用C语言 

这是我刚开始学硬件时做过的一个项目,刚开始是从汇编开始的,从下位机采集上来的数据是浮点数(4字节)我要用接收下来,然后再送到数码管去显示这个浮点数,这首先要把接收到的数(4字节数)再变成浮点数,虽然有浮点数的变换原理但要是用汇编程序来实现非常的繁琐,我想到用C语言来自动实现,如把4字节数赋给一个浮点变量后,这个变量就是一个浮点数然后再一位位分开送到数码管去显示根据这个原理理解下面的两段程序。

;-------------------------------------------------

;三位数带有一位小数的程式(例如显示“152”)

SLAVE EQU 26

FLAG BIT 2EH

REV0 EQU 30H

REV1 EQU 31H ;存放收到的字符

REV2 EQU 32H

REV3 EQU 33H

DAT0 EQU 34H

DAT1 EQU 35H ;要显示的字符

DAT2 EQU 36H

EXTRN CODE (function)

EXTRN DATA (DATT0,DATT1,DATT2)

ORG 0023H

AJMP RECV

ORG 0000H

AJMP START

ORG 0040H

START: NOP

MOV SP,#60H

SETB EA

SETB ES

MOV TMOD,#20H

MOV SCON,#0F4H

MOV TH1,#0FDH

MOV TL1,#0FDH

MOV PCON,#00H

SETB TR1

MOV R6,#4

CLR FLAG

MOV DAT0,#0

MOV DAT1,#0

MOV DAT2,#0

MOV DPTR,#NUM

MOV R1,#REV0

LOOP: MOV R0,#DAT0

MOV A,@R0

MOVC A,@A+DPTR

CLR P34

MOV P1,A

ACALL DELAY

ACALL DELAY

SETB P34

CLR P33

INC R0

MOV A,@R0

MOVC A,@A+DPTR

ANL A,#7FH

MOV P1,A

ACALL DELAY

ACALL DELAY

SETB P33

CLR P32

INC R0

MOV A,@R0

MOVC A,@A+DPTR

MOV P1,A

ACALL DELAY

ACALL DELAY

SETB P32

JNB FLAG,GGG

MOV DAT0,DATT0

MOV DAT1,DATT1

MOV DAT2,DATT2

CLR FLAG

GGG: SJMP LOOP

DELAY: MOV R7,#0FFH

DJNZ R7,$

RET

;----------------------------------

;从机接收程序

RECV: PUSH ACC

PUSH PSW

CLR RI

MOV A,SBUF

XRL A,#SLAVE

JZ TORECV

OUT: POP PSW

POP ACC

RETI

TORECV: CLR SM2

RECVNEXT:JNB RI,$

CLR RI

JNB RB8,ISNUM

SJMP OUT

ISNUM: MOV A,SBUF

MOV @R1,A

INC R1

DJNZ R6,RECVNEXT

LCALL function ;调用C语言函数

SETB FLAG

MOV R6,#4

MOV R1,#REV0

SETB SM2

SJMP OUT

NUM: DB 0C0H,0F9H,0A4H,0B0H,99H

DB 92H,82H,0F8H,80H,98H

DB 86H END

//C语言被调用部分

char data DATT0,DATT1,DATT2;

void function()

{

float data good=0x30;

int data gg=0x3a;

// good=(good)100;

gg=(int)good;

if(gg>=0)

{

DATT0=(gg)%10;

gg=(gg)/10;

DATT1=(gg)%10;

DATT2=(gg)/10;

}

else

{

DATT0=10;

DATT1=10;

DATT2=10;

}

}

你好!

Keil5本身并不提供直接生成流程图的功能,但可以使用一些工具来生成流程图。

下面介绍一些生成Keil5程序流程图和子程序流程图的方法:

使用Doxygen工具

Doxygen是一种自动化文档生成工具,它可以自动分析源代码并生成各种文档,包括流程图。在Keil5中,可以将程序文件导出为一个文件夹,然后使用Doxygen对该文件夹进行分析,生成程序流程图和子程序流程图。具体使用方法可以参考Doxygen的官方文档。

使用GraphViz工具

GraphViz是一种开源的图形可视化工具,它可以生成各种流程图、状态图等。在Keil5中,可以将程序文件导出为一个dot文件,然后使用GraphViz将该文件转换成流程图。具体使用方法可以参考GraphViz的官方文档。

使用Cscope工具

Cscope是一种代码浏览器,它可以方便地查找函数、变量、宏等。在Keil5中,可以使用Cscope查找程序中的函数和调用关系,然后手动绘制流程图和子程序流程图。

你说的keil或者是vc++60都只是一个编译的环境(就是常说的IDE)他们只是一个软件,都可以写程序,但是vc++60无法把程序编译成hex文件(就是单片机懂得文件),所以vc++60上可以写,但是没法编译。

程序是:

/大概是一毫秒延时/

void delay(unsigned int z)

{

for(x=z;x--;x>0)

for(y=110;y--;y>0);

}

有什么具体不懂得,继续问,或者我空间留言!希望帮到你

C51里面,汇编语言跟C语言可以互相调用,这我都试验过的,C调用汇编,汇编调用C!!!要这么做的话,汇编语言必须严格遵守Keil的格式,需要加入很多控制语句,一点都不能省(我曾经用C调用汇编,少了一个字符,编译的时候提示一个警告,没在意,结果编译通过,程序不能运行);其次就是参数传递的问题,建议楼主在百度文库里面搜索《Cx51 编译器 用户手册》中文,403页,可以下载,看第六章,里面讲的是参数的传递规则,还有C调用汇编的方法,关于汇编调用C,可以看\Keil\C51\LIB里面的STARTUPA51文件,这是C语言的启动文件,典型的汇编语言调用C函数(只不过这个函数的名字叫 main 呵呵),然后模仿它的写法在里面根据前面讲的参数传递规则加入需要传递的参数就好了。

注意:汇编调用C的话,必须要在汇编程序里面初始化堆栈指针SP,因为C语言肯定会用到堆栈。

PS:C语言多简单啊,比汇编简单多了,会汇编得人学C很容易的,我就是先学的汇编,建议LZ学习C语言

以上就是关于Keil3中为什么添加不了子程序模块全部的内容,包括:Keil3中为什么添加不了子程序模块、怎么让keil代码同时运行两个函数、单片机汇编语言子程序调用,keil4等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9812901.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存