单片机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;

}

}

现在有好多网友在刚上手阶段会遇到这样的问题,希望这个例程对一些网友起到抛砖引玉的作用同时对写数码管显示有一定的启示,大家注意显示电路原理不同,程序有所不同,而且数码管也有共阴共阳之分,七段数码管各位中,不同型号数码管还有所不一样。上面程序是以数码管共阳来编程的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值