在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;
}
}
现在有很多网友在刚上手阶段会遇到这样的问题,期望这个例程对一些网友起到抛砖引玉的效果一起对写数码管显现有必定的启示,我们留意显现电路原理不同,程序有所不同,并且数码管也有共阴共阳之分,七段数码管各位中,不同类型数码管还有所不一样。上面程序是以数码管共阳来编程的。