新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)程序C語言與匯編語言混合編程

        單片機(jī)程序C語言與匯編語言混合編程

        作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏

        430單片機(jī)C語言匯編語言混合編程

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

        1.C語言函數(shù)和匯編語言函數(shù)相互調(diào)用
        在這個(gè)示例中C語言函數(shù)main()調(diào)用匯編語言函數(shù)get_rand()以得到一個(gè)隨機(jī)數(shù);匯編語言函數(shù)get_rand()首先調(diào)用C語言的標(biāo)準(zhǔn)庫(kù)函數(shù)rand()得到一個(gè)整型隨機(jī)值,然后用調(diào)用C語言函數(shù)mult()的方法把這個(gè)隨機(jī)值乘以main()函數(shù)傳遞給自己的實(shí)參,并把乘積值返回給main()函數(shù)。
        1.1C語言源文件
        #include

        extern unsigned long get_rand(unsigned char seed);

        void main( void )
        {
        unsigned char seed;
        unsigned long value;

        // ===系統(tǒng)初始化==========================================
        IFG1 = 0;
        WDTCTL = WDTPW+WDTHOLD;
        P1DIR = 0xff;
        // ===系統(tǒng)初始化結(jié)束========================================

        seed = 0x55;
        value = get_rand(seed);
        while(1);
        }
        // ===主程序結(jié)束==================================================

        unsigned long mult(int x , int y)
        {
        return (x *y);
        }
        // ===乘法子程序結(jié)束================================================

        1.2匯編語言源程序
        ; ******************************************************************
        ;文件名: asm_source.s43
        ; C語言和匯編語言混合編程,匯編語言源程序
        ;這段源程序調(diào)用兩個(gè)C語言函數(shù),標(biāo)準(zhǔn)庫(kù)函數(shù)rand()和用戶自定義函數(shù)mult()
        ; *******************************************************************
        #include "msp430x14x.h";頭文件
        NAME asmfile
        EXTERN rand; C語言標(biāo)準(zhǔn)庫(kù)函數(shù)rand()
        EXTERN mult; c_source.c中用戶自定義函數(shù)
        ;====================================================================
        ; get_rand
        ;====================================================================
        PUBLIC get_rand;導(dǎo)出函數(shù)名給C語言函數(shù)
        RSEG CODE
        get_rand;
        push R11;普通寄存器入棧保護(hù)
        mov.b R12,R11; C函數(shù)傳遞的實(shí)參在R12中,送入R16暫存

        Call #rand;調(diào)用C函數(shù)rand()
        ;函數(shù)值為整型返回在R12中

        ; rand()函數(shù)值作為mult()函數(shù)的第一實(shí)參
        ;送入R12進(jìn)行參數(shù)傳遞
        mov R11,R14; C函數(shù)傳遞的實(shí)參作為mult()函數(shù)的第二實(shí)參
        ;送入R14進(jìn)行參數(shù)傳遞
        Call #mult; mult()值返回在R12 / R13寄存器對(duì)
        pop R11;出?;謴?fù)寄存器內(nèi)容
        ret
        END

        2.匯編語言編寫中斷服務(wù)程序
        為了提高整個(gè)系統(tǒng)響應(yīng)速度,要求中斷服務(wù)程序的執(zhí)行時(shí)間較短,執(zhí)行速度較快,因此最好的方法就是用匯編語言編寫中斷服務(wù)程序。但要注意:1、中斷服務(wù)程序不能有參數(shù)傳遞和返回值。2、中斷服務(wù)程序中所有被用到的寄存器都需要保護(hù)。本示例用匯編語言編寫了看門狗定時(shí)器的中斷服務(wù)程序,用C語言編寫了主程序。
        2.1C語言主程序
        #include

        void main( void )
        {
        // ===系統(tǒng)初始化=============================================
        IFG1=0;
        WDTCTL=WDT_MDLY_32;
        P1DIR = 0x01;
        IFG1 &= ~WDTIFG;
        IE1 |= WDTIE;
        _EINT();
        // ===系統(tǒng)初始化結(jié)束===========================================
        while(1);/*主程序是一段死循環(huán)
        }
        // ===主函數(shù)結(jié)束==============================================

        2.2匯編語言中斷服務(wù)程序
        ;**********************************************************************
        ;文件名: wdt_int.s43
        ; C語言和匯編語言混合編程,匯編語言源程序
        ;看門狗定時(shí)器中斷服務(wù)程序
        ;***********************************************************************
        NAME WDT_ISR
        #include "msp430x14x.h";頭文件
        ;==============================================================
        ;看門狗定時(shí)器中斷服務(wù)程序
        ;================================================================
        PUBLIC wdt_isr;導(dǎo)出函數(shù)名給C語言函數(shù)
        RSEG CODE
        wdt_isr
        xor.b #001h,&P1OUT;觸發(fā)P1.0,led亮滅轉(zhuǎn)換
        reti;中斷返回
        ;================================================================
        COMMON INTVEC(1);中斷向量段
        ;================================================================
        ORG WDT_VECTOR
        DW wdt_isr
        END



        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 峨眉山市| 策勒县| 漳州市| 得荣县| 油尖旺区| 青铜峡市| 盖州市| 麻栗坡县| 吴桥县| 咸丰县| 沅陵县| 墨竹工卡县| 淮滨县| 文山县| 丰都县| 双桥区| 沙洋县| 常州市| 大港区| 谢通门县| 嘉祥县| 栾城县| 荥经县| 泽州县| 长寿区| 隆尧县| 广元市| 鄂温| 宁化县| 屯昌县| 探索| 呼伦贝尔市| 延川县| 深州市| 连江县| 光山县| 寿宁县| 沛县| 泉州市| 桦南县| 固镇县|