<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          單片機匯編語言調用C語言的方法

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/315865.htm

          匯編語言調用C語言 

            這是我剛開始學硬件時做過的一個項目,剛開始是從匯編開始的,從下位機采集上來的數(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 ;調用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語言被調用部分
          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ù)碼管共陽來編程的。



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();