原帖:http://bbs.cepark.com/thread-13010-1-1.html
http://bbs.cepark.com/thread-13028-1-1.html(原帖有附件)
第一步;按照建立普通c51程序的方法,建立c51工程文件。
建立兩個*.c文件(c51shi.c和asm.c),加入工程。c51shi.c爲主程序,asm.c爲彙編函數。
第二步:在 Project 窗口中包含彙編代碼的 C 文件上右鍵,選擇“Options for ...”,點擊右邊的“Generate Assembler SRC File”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態;
第三步: 根據選擇的編譯模式,把相應的庫文件加入工程中,該文件必須作爲工程的最後文件;
注:庫文件說明
C51S.LIB - 沒有浮點運算的 Small model
C51C.LIB - 沒有浮點運算的 Compact model
C51L.LIB - 沒有浮點運算的 Large model
C51FPS.LIB - 帶浮點運算的 Small model
C51FPC.LIB - 帶浮點運算的 Compact model
C51FPL.LIB - 帶浮點運算的 Large model
第四步: build這個工程後將會產生一個asm.SRC的文件,將這個文件改名爲asm.A51,然後在工程裏去掉庫文件(如C51S.Lib)和asm.c,而將asm.A51添加到工程裏。
第五步: 檢查c51shi.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效,若是有效則點擊使檢查框變成無效狀態;再次build這個工程,到此你已經得到彙編函數的主體,修改函數裏面的彙編代碼就得到你所需的彙編函數了。
c51.c代碼如下:
#include <reg52.h>
//*************** 函數定義 ******************
void asm(void); //彙編函數
//*************** 主程序 ********************
void main(void)
{
while(1)
{
asm();
}
}
asm.c代碼如下:
void asm(void)
{
}
經過以上五步後,您將得到一個asm.a51文件,在文件中紅色代碼後添加您的彙編語句即可。
; ./asm.SRC generated from: asm.c
; COMPILER INVOKED BY:
; C:/Keil/C51/BIN/C51.EXE asm.c BROWSE DEBUG OBJECTEXTEND SRC(./asm.SRC)
NAME ASM
?PR?asm?ASM SEGMENT CODE
PUBLIC asm
;
;
;
; void asm(void)
RSEG ?PR?asm?ASM
asm:
//在此處添加您的彙編代碼**************
ret
END
-----------------------------------------------------------------------------------------
第一步:在 Project 窗口中包含彙編代碼的 C 文件上右鍵,選擇“Options for ...”,點擊右邊的“Generate Assembler SRC File”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態;
第二步:根據選擇的編譯模式,把相應的庫文件(如 Small 模式時,是Keil/C51/Lib/C51S.Lib)加入工程中, 該文件必須作爲工程的最後文件;
C51S.LIB - 沒有浮點運算的 Small model
C51C.LIB - 沒有浮點運算的 Compact model
C51L.LIB - 沒有浮點運算的 Large model
C51FPS.LIB - 帶浮點運算的 Small model
C51FPC.LIB - 帶浮點運算的 Compact model
C51FPL.LIB - 帶浮點運算的 Large model
第三步:在需要嵌入彙編的地方以如下方式加入彙編代碼;
#pragma ASM
; Assembler Code Here
#pragma ENDASM
第四步:編譯,即可生成目標代碼;
功能演示程序如下; #include <reg52.h> void fun(void) { #pragma ASM //東西方向 紅燈 綠燈 黃燈 // P1.0 P1.1 P1.2 //南北方向 紅燈 綠燈 黃燈 // P1.5 P1.6 P1.7 GW EQU 30H SW EQU 31H STAR: MOV P0,#0FFH MOV P2,#0FFH MOV P1,#0FFH MOV P3,#0FFH MOV A,#00H MOV GW,#00H MOV SW,#02H MOV R1,#255 MOV R2,#30 DIS: MOV P1,#10111110B //南北放行 東西禁止 MOV DPTR,#TAB MOV A,GW MOVC A,@A+DPTR MOV P0,A MOV P2,#10111011B ACALL DELAY MOV P2,#0FFH MOV DPTR,#TAB MOV A,SW MOVC A,@A+DPTR MOV P0,A MOV P2,#01110111B ACALL DELAY MOV P2,#0FFH DJNZ R1,DIS DJNZ R2,DIS LJMP LP LP: MOV R1,#255 MOV R2,#30 DEC GW MOV A,GW CJNE A,#0FFH,ST MOV GW,#09H DEC SW MOV A,SW CJNE A,#0FFH,ST2 MOV GW,#00H MOV SW,#02H MOV P1,#01111011B //黃燈點亮2秒鐘 ACALL DEL2S LJMP DIS2 ST2: LJMP DIS ST: LJMP DIS DIS2: MOV P1,#11011101B //東西放行 南北禁止 MOV DPTR,#TAB MOV A,GW MOVC A,@A+DPTR MOV P0,A MOV P2,#10111011B ACALL DELAY MOV P2,#0FFH MOV DPTR,#TAB MOV A,SW MOVC A,@A+DPTR MOV P0,A MOV P2,#01110111B ACALL DELAY MOV P2,#0FFH DJNZ R1,DIS2 DJNZ R2,DIS2 LJMP LP2 LP2: MOV R1,#255 MOV R2,#30 DEC GW MOV A,GW CJNE A,#0FFH,ST3 MOV GW,#09H DEC SW MOV A,SW CJNE A,#0FFH,ST4 MOV GW,#00H MOV SW,#02H MOV P1,#01111011B //黃燈點亮2秒鐘 ACALL DEL2S LJMP DIS ST4: LJMP DIS2 ST3: LJMP DIS2 DELAY:MOV R7,#20H //1MS延時(按12MHZ算) DJNZ R7,$ RET DELAY2:MOV R7,#18H TM: MOV R6,#0FFH TM6: DJNZ R6,TM6 DJNZ R7,TM RET DEL2S: MOV R5,#10H F3: MOV R6,#0FFH F2: MOV R7,#0E1H F1: DJNZ R7,F1 DJNZ R6,F2 DJNZ R5,F3 RET TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,00H ; 0 1 2 3 4 5 6 7 8 9 ALL #pragma ENDASM } //*************** 主程序 ******************** void main(void) { while(1) { fun(); } } |