新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機匯編語言調(diào)用C語言的方法

單片機匯編語言調(diào)用C語言的方法

作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
keil中新建工程,先用匯編編寫主體程序,在主體程序中要對要調(diào)用的子程序進行聲明,如EXTRN CODE (function)

EXTRN DATA (DATT0,DATT1,DATT2) ,然后,另建立一個c語言的文件,(千萬不要把匯編和c放到一個文件中)并加入到新的工程中,進行編譯。下面給一個在網(wǎng)上搜的,有空我編一個例子。

本文引用地址:http://butianyuan.cn/article/201611/315865.htm

匯編語言調(diào)用C語言 

  這是我剛開始學(xué)硬件時做過的一個項目,剛開始是從匯編開始的,從下位機采集上來的數(shù)據(jù)是浮點數(shù)(4字節(jié))我要用接收下來,然后再送到數(shù)碼管去顯示這個浮點數(shù),這首先要把接收到的數(shù)(4字節(jié)數(shù))再變成浮點數(shù),雖然有浮點數(shù)的變換原理但要是用匯編程序來實現(xiàn)非常的繁瑣,我想到用C語言來自動實現(xiàn),如把4字節(jié)數(shù)賦給一個浮點變量后,這個變量就是一個浮點數(shù)然后再一位位分開送到數(shù)碼管去顯示根據(jù)這個原理理解下面的兩段程序。
;-------------------------------------------------
;三位數(shù)帶有一位小數(shù)的程式(例如顯示“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 ;調(diào)用C語言函數(shù)
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語言被調(diào)用部分
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;
}
}
現(xiàn)在有好多網(wǎng)友在剛上手階段會遇到這樣的問題,希望這個例程對一些網(wǎng)友起到拋磚引玉的作用同時對寫數(shù)碼管顯示有一定的啟示,大家注意顯示電路原理不同,程序有所不同,而且數(shù)碼管也有共陰共陽之分,七段數(shù)碼管各位中,不同型號數(shù)碼管還有所不一樣。上面程序是以數(shù)碼管共陽來編程的。



評論


技術(shù)專區(qū)

關(guān)閉