新聞中心

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

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

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

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

        本文引用地址:http://www.104case.com/article/201611/315865.htm

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

          這是我剛開始學(xué)硬件時做過的一個項(xiàng)目,剛開始是從匯編開始的,從下位機(jī)采集上來的數(shù)據(jù)是浮點(diǎn)數(shù)(4字節(jié))我要用接收下來,然后再送到數(shù)碼管去顯示這個浮點(diǎn)數(shù),這首先要把接收到的數(shù)(4字節(jié)數(shù))再變成浮點(diǎn)數(shù),雖然有浮點(diǎn)數(shù)的變換原理但要是用匯編程序來實(shí)現(xiàn)非常的繁瑣,我想到用C語言來自動實(shí)現(xiàn),如把4字節(jié)數(shù)賦給一個浮點(diǎn)變量后,這個變量就是一個浮點(diǎn)數(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
        ;----------------------------------
        ;從機(jī)接收程序

        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)閉
        主站蜘蛛池模板: 榆社县| 舒城县| 新营市| 水富县| 巴马| 醴陵市| 陇川县| 义乌市| 北安市| 金阳县| 湟源县| 砀山县| 旬阳县| 土默特右旗| 晋城| 松原市| 偃师市| 上思县| 陕西省| 将乐县| 禹城市| 汉沽区| 安丘市| 遵义县| 常德市| 石屏县| 商城县| 贵港市| 柘城县| 建平县| 三台县| 锦屏县| 芜湖市| 应用必备| 昭平县| 固镇县| 弥渡县| 宁武县| 玉林市| 元江| 铜山县|