❶ 51單片機上,C語言函數調用過程是怎樣 哪些東西需要壓堆棧保護起來,參數如何傳遞
就是直接跳到子程序那裡執行,至於堆棧的話,只有當用到中斷的時候再使用堆棧,一般像acc,dptr都會自動堆棧的,編譯的時候生成的
❷ 51單片機匯編如何調用C函數
先聲明,後調出。
若C語言函數名為ABC,匯編的入口符號為_ABC。
例:CALL _ABC ,就調用的了ABC涵數。
至於如何聲明,如何傳函數參數,就要查編譯器的使用說明了。
我也沒這么做過,一般是高級語言調用低級語言,只是一個建議。
❸ 單片機是如何調用函數的
呵呵,當然不是這么簡單。你想一下,調用完函數你返回哪裡?
一般來說,調用函數這個指令都至少隱含著將當前棧指針入棧的操作。
❹ C51函數是如何調用
在你原來的函數基礎上,加上三個參數,分別是:
1 要操作的PORT口
2 要進行的操作
3 要操作的引腳
當然,如果你的目標很明確,可以把以上三個參數裁剪掉一些,利於系統的效率提高.
下面是我寫的示常式序,你可能參考一下:
#include<reg52.h>
#define Pin0 0x01
#define Pin1 0x02
#define Pin2 0x04
#define Pin3 0x08
#define Pin4 0x10
#define Pin5 0x20
#define Pin6 0x40
#define Pin7 0x80
#define OPT_CPL 0x00 //----取反某位操作
#define OPT_CLR 0x01 //----清零某位操作
#define OPT_SET 0x02 //----置一某位操作
void Operate(
/*這里寫你原來的參數,*/
unsigned char Port_Num,
unsigned char Opr_Style,
unsigned char Pins
)
{
//----如果在單片機PORT口范圍之內,剛讀取當前PORT口的狀
//----如果不在范圍之內,死循環
//----注意,為了效率起見,這個部分可以根據實際應用進行裁剪
if(Port_Num == 0)
{
Port_Num = P0;
}
else if(Port_Num == 1)
{
Port_Num = P1;
}
else if(Port_Num == 2)
{
Port_Num = P2;
}
else if(Port_Num == 3)
{
Port_Num = P3;
}
else
{
while(1);
}
//----如果是取反相應位,進行異或操作
//----如果清零相應位,則位與操作
//----如果置位相應位,則位或操作
//----如果都不在范圍之內,則死循環
//----這段代碼也根據實際情況裁剪
if(Opr_Style == OPT_CPL)
{
Port_Num ^= Pins;
}
else if(Opr_Style == OPT_CLR)
{
Port_Num &= ~Pins;
}
else if(Opr_Style == OPT_SET)
{
Port_Num |= Pins;
}
else
{
while(1);
}
//----如果在單片機PORT口范圍之內,剛讀取當前PORT口的狀
//----如果不在范圍之內,死循環
//----注意,為了效率起見,這個部分可以根據實際應用進行裁剪
if(Port_Num == 0)
{
P0 = Port_Num;
}
else if(Port_Num == 1)
{
P1 = Port_Num;
}
else if(Port_Num == 2)
{
P2 = Port_Num;
}
else if(Port_Num == 3)
{
P3 = Port_Num;
}
else
{
while(1);
}
//----以上的內容,可根據實際情況進行裁剪,以實現程序最優化
//----添加你的功能的其他代碼---------------
}
void main(void)
{
//----使用示例:函數功能的同時,置位P2口的P2.0,P2.5,P2.7
Operate(/*這里寫你原來的參數*/2,OPT_SET,(Pin0|Pin5|Pin7));
//----使用示例:函數功能的同時,清零P1口的P1.2,P1.5,P2.6
Operate(/*這里寫你原來的參數*/1,OPT_CLR,(Pin2|Pin5|Pin6));
}
❺ 如何調用單片機函數模塊
看你要調用的函數是什麼類型的咯。
1、如果是這種預設的,void可寫可不寫,如:
fuction()
//或者void
fuction()
或者fuction(
void
)
或者void
fuction(
void
)
{
//函數實體
}
這種既沒有入參,也沒有出參、返回值的,就在你要調用的地方直接這么寫fuction();
2、有入參,類型預設的,如
void
fuction(
unsigned
char
Data
)
//當然數據類型有很多,這個看用戶需要
{
//函數實體
}
調用的時候,就這么寫
fuction(DATA);//保證DATA和Data的數據類型一樣比較好
3、有返回值的,甚至有入參的,如
unsigned
char
fuction(
unsigned
char
Data
)
{
unsigned
char
n;
//函數實體
return
n;
}
調用的時候,把這個函數的返回值賦給其他的變數,如m
=
fuction(
DATA
);
//還是那句話,數據類型不要變來變去,最後保持一致,否則可能導致未知的錯誤。
以上字字手打,希望對你有幫助
❻ 【單片機】 知道函數的地址怎麼調用
還需要知道函數的調用規則,比如:
int fun1(int a,int b) { return a+b; }
int fun2(int a,int b) { return a-b; }
typedef int (*pfun)(int,int);
#define MYFUNCTION1 0x80002000 //假設函數fun1的地址位於0x80002000
#define MYFUNCTION2 0x80003000 //假設函數fun2的地址位於0x80003000
void main()
{ int a=2,b=1,c;
fun=(pfun)MYFUNCTION1; c=(*fun)(a,b);
fun=(pfun)MYFUNCTION2; c=(*fun)(a,b);
}