在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;
}
}
以上就是关于单片机汇编语言子程序调用,keil4全部的内容,包括:单片机汇编语言子程序调用,keil4、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)