
在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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)