c51編譯器代碼補全
Ⅰ 在C51語言中如何嵌入匯編語言
keil C 語言中嵌入匯編語言進行混合編程,方法如下:
1、在C 文件中要嵌入匯編代碼片以如下方式加入匯編代碼
#pragma ASM
; Assembler Code Here
#pragma ENDASM
2、在Project 窗口中包含匯編代碼的C 文件上右鍵,選擇「Options for ...」
4、編譯,即可生成目標代碼
實例:
#include<reg52.h>
#define uchar unsigned char
sbit LED1=P1^0;
//C 嵌入匯編常式
void delay_ms(void)
{
#pragma asm
MOV R0,#0FFH
MOV R1,#0FFH
D_LOOP1:
DJNZ R0,D_LOOP1
MOV R0,#0FFH
DJNZ R1,D_LOOP1
#pragma endasm
}
void main(void)
{
uchar i;
P1 = 0xFF;
while(1)
{
i++;
delay_ms();
if(i>=7)
{
LED1 =~LED1;
i=0;
}
}
}
Ⅱ c51編譯時出現fail to execute:c\keil\c51\bin\c51.exe怎麼整
有時候我們打開別人的KEIL程序時,會經常碰到can't execute 'c:\keil\c51\bin\c51.exe'的錯誤
解決對策:
出錯原因:被打開的KEIL程序的編譯器安裝在C盤,即c:\keil的路徑下。而使用者的KEIL裝在不同路徑。
針對這樣的原因,就有兩種解決方法:
1、自己重建工程,把要打開的程序的文件拷貝過去,編譯即可以通過,但這樣做比較費事。
2、打開出錯的程序,選擇菜單:Project-Compoonents,Environment and Books
選擇Folders/Extensions,並把「Use settings from TOOLS.INI」前面的勾打上即可.
但有的KEIL版本在Project下找不到Compoonents,Environment and Books選項,可以在快捷欄上找,位於「Target1」後面的一個呈「品」字的彩色圖標,就是Compoonents,Environment and Books選項了。
Ⅲ KEIL C51程序中如何嵌入匯編
模塊內介面:
使用如下標志符:
#pragma
asm
匯編語句
#pragma
endasm
注意:如果在c51程序中使用了匯編語言,注意在Keil編譯器中需要激活Properties中的
「Generate
Assembler
SRC
File」
和「Assembler
SRC
File
」兩個選項
1、把"xx.c"加入工程中,右擊"xx.c"選擇「options
for
file"xx.c"
選擇
「Generate
Assembler
SRC
File」和「Assemble
SRC
File」打上黑勾有效;
2、根據選擇的編譯模式,把相應的庫文件象加"xx.c"一
樣加入工程中並放在"xx.c"下面,如smail模式下選"keil\c51\lib\c51s.lib"
加入工程中,如果要進行浮點運算把"keil\c51\lib\c51fpl.lib"也加入工程中。
即:
在
Keil
安裝目錄下的
\C51\LIB\
目錄的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
3、在"xx.c"頭文件中加入優化:比如#pragma
OT(4,speed)
4、在"xx.c"中加入匯編代碼
#pragma
ASM
;Assembler
Code
Here
#pragma
ENDASM
5、編譯生成xx.hex
例:
#include
void
delay(void)
{
#pragma
asm
MOV
R5,#5
DEL:
MOV
R6,#2
DEL1:
MOV
R7,#255
DJNZ
R7,$
DJNZ
R6,DEL1
DJNZ
R5,DEL
;MOV
A,P1
;CPL
A
;MOV
P1,A
#pragma
endasm
}
void
delay1(unsigned
int
cnt)
{
while(cnt--);
}
void
main()
{
while(1)
{
delay1(1000);
P1=0x55;
delay();
}
}
Ⅳ C51編譯時提示出錯,但我怎麼也找不出錯在哪裡了
你前面加了頭文件(*.h)沒有?
我加了個main函數,編譯之後 是沒有錯誤的啊
error C141: syntax error near 'void'可能是函數前後少了"{"或者"}",你應該仔細檢查一下的
還有,error C202: 'TempCyc': undefined identifier這一句錯誤可能是在main函數中也使用了TempCyc,而沒有在主函數中定義,這個變數在void Delay5Ms(void)中只是局部變數
#include "reg52.h"
void Delay5Ms(void)
{
unsigned int TempCyc;
TempCyc=5552;
while(TempCyc--);
}
//******400ms延時******
void Delay400Ms(void)
{
unsigned char TempCycA=5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
void main()
{
while(1)
{
Delay5Ms();
Delay400Ms();
}
}
Ⅳ Keil-MDK5.11設置了代碼自動補全,怎麼還是不能補全
不知道解決了沒有,我也遇見一樣的情況。現在可以了。設置界面後有個設置幾個字母提示,換個數字,然後在換回來。確定就可以了。
Ⅵ 主流C51單片機編譯器比對
int short 的大小是因機器而異嘛(准確點應該是編譯器)。你都說了人家規定的是「最小」為16位,又不是只能是16位,也沒有說兩者應該相等(事實上是short不超過int就OK啦)。所以當然可以short類型為半個機器字長,而int類型則為一個機器字長的啦。
「C++標准規定了每個算術類型的最小存儲空間,但他並不自知編譯器使用更大的存儲空間 」
說簡單點就是C++規定了個最小的值,但是將你的代碼編譯成機器碼的編譯器則確定了你這個長度值為多少。因為C++是一種語言,一個規范,或者說只是一種規定,然後要將你按這種規范寫的代碼編譯成能在機器上運行的代碼的是編譯器。而在不同的機器上運行的程序的實際結構是不一樣的,比如單片機與PC相差就很大。要將按相同規范寫的程序在各種各樣亂七八糟的機器上運行,就需要相應的編譯器了。所以實際的大小是由你編譯代碼的編譯器確定的。
PS:當然當前一般的PC上int都是32位,short16位的。因為現在32位的機子是主流嘛。如果你不寫什麼單片機的程序可以不用太在意這個問題。但是寫單片機程序時就要注意了,因為一般一個單片機的編譯器可以編譯很多種型號晶元的代碼,而這些型號有可能從8位到32位都有……
Ⅶ C51語言的混合編程
C51編譯器能對C語言源程序進行高效率的編譯,生成高效簡潔的代碼,在絕大多數場合採用C語言編程即可完成預期的目的。但有時為了編程直觀或某些特殊地址的處理,還須採用一定的匯編語言編程。而在另一些場合,出於某種目的,匯編語言也可調用C語言。在這種混合編程中,關鍵是參數的傳遞和函數的返回值。它們必須有完整的約定,否則數據的交換就可能出錯,例 C語言程序與匯編語言程序的調用,其子程序如下:
PUBLIC AD ;入口地址
SEG_AD SEGMENT CODE;程序段
RSEG SEG_AD
USING 0
AD: MOV R6,#00
MOV R7,#00
SETB P1.1
ACALL DELAY
CLR P1.1
ACALL DELAY
MOV R0,#10
RR0: SETB P1.2
NOP
CLR P1.2
DJNZ R0,RR0
ACALL DELAY
MOV 30H,R6 ;A/D轉換的高
;兩位保存在R6中
ACALL CIR
MOV R6,30H
SETB P1.2
NOP
CLR P1.2
MOV 30H,R6
ACALL CIR
MOV R6,30H
MOV R0,#8 ;A/D轉換的低
;8位保存在R7中
RR2: SETB P1.2
NOP
CLR P1.2
MOV 30H,R7
ACALL CIR
MOV R7,30H
DJNZ R0,RR2
RET
CIR: CLR C
MOV C,P1.0
MOV A,30H
RLC A
MOV 30H,A
RET
END
在以上程序中,函數的返回值為一無符號整型數,根據調用規則,返回值的高位必須在R6中,低位在R7中,這樣才可保證數據的傳遞不出錯。另外,在調用過程中,必須注意寄存器的入棧。這樣在以後用到A/D轉換時,在C語言中調用匯編語言子程序AD()即可。
Ⅷ keilc51有代碼補全功能嗎
不可以實現代碼補全功能
Ⅸ keil c51優化等級介紹
一般用優化等級8,其它的別用,容易出事。
編譯完之後多留意data,xdata,看有沒超出晶元的最大值,
特別是data,不能超過128,甚至太接近128有時也會出問題。
如果data 需要使用到256,則另外的128用idata定義
Ⅹ C51將C代碼匯編有ADD A , ACC 怎麼回事
A與ACC都代表累加器,同一地址,但是在匯編里,寫法A與ACC擁有不同的含義
A是包含在指令里的,指令碼不同;而ACC卻是作為操作數出現,代表地址
就相當於匯編指令有,MOV A,Rn同時也有MOV direct,Rn等不同的指令
MOV A,R0 與 MOV ACC,R0就會生成上述兩種不同的機器碼,但是結果一樣
那麼就好理解了ADD A,ACC就使用指令ADD A,direct,direct就是ACC符號所表示的地址,也就是累加器自己相加,相當於X2,也就是左移