快捷搜索:

单片机汇编语言调用C语言的方法

单片机汇编语言调用C语言的方法

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

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

本文引用地址:

汇编语言调用C语言 

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

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 P3.4
MOV P1,A
ACALL DELAY
ACALL DELAY

SETB P3.4
CLR P3.3
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ANL A,#7FH
MOV P1,A
ACALL DELAY

ACALL DELAY
SETB P3.3
CLR P3.2
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
ACALL DELAY
ACALL DELAY
SETB P3.2
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;
}
}
现在有好多网友在刚上手阶段会遇到这样的问题,希望这个例程对一些网友起到抛砖引玉的作用同时对写数码管显示有一定的启示,大家注意显示电路原理不同,程序有所不同,而且数码管也有共阴共阳之分,七段数码管各位中,不同型号数码管还有所不一样。上面程序是以数码管共阳来编程的。

您可能还会对下面的文章感兴趣: