久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2793|回復: 11
收起左側

單片機C語言函數的參數設置為端口?

[復制鏈接]
ID:356967 發表于 2022-7-7 09:33 | 顯示全部樓層 |閱讀模式
51單片機C語言的函數參數想要設置為單片機的端口,輸入P0,P1,P2這些來運行,該怎么弄?
回復

使用道具 舉報

ID:230742 發表于 2022-7-7 12:06 | 顯示全部樓層
好像不能直接用端口做函數的參數。可以用按鍵的辦法把端口的值讀進來,賦值給一個變量,
大概是這樣的:
ab=P0;
在用ab做參數傳遞。
回復

使用道具 舉報

ID:161164 發表于 2022-7-7 13:24 | 顯示全部樓層
不能直接傳參
只能間接操作

  1. #define GPIOP0  0x80
  2. #define GPIOP1  0x90
  3. #define GPIOP2  0xA0
  4. #define GPIOP3  0xB0

  5. void SetGPIO(char GPIO,char Pin)
  6. {
  7.     switch(GPIO)
  8.     {
  9.     case GPIOP0:
  10.         P0 |= (0x01 << Pin);
  11.         break;
  12.     case GPIOP1:
  13.         P1 |= (0x01 << Pin);
  14.         break;
  15.     case GPIOP2:
  16.         P2 |= (0x01 << Pin);
  17.         break;
  18.     case GPIOP3:
  19.         P3 |= (0x01 << Pin);
  20.         break;
  21.     }
  22. }
  23. void ResetGPIO(char GPIO,char Pin)
  24. {
  25.     switch(GPIO)
  26.     {
  27.     case GPIOP0:
  28.         P0 &= ~(0x01 << Pin);
  29.         break;
  30.     case GPIOP1:
  31.         P1 &= ~(0x01 << Pin);
  32.         break;
  33.     case GPIOP2:
  34.         P2 &= ~(0x01 << Pin);
  35.         break;
  36.     case GPIOP3:
  37.         P3 &= ~(0x01 << Pin);
  38.         break;
  39.     }
  40. }
  41. bit ReadGPIO(char GPIO,char Pin)
  42. {
  43.     bit IDR = 0;
  44.     switch(GPIO)
  45.     {
  46.     case GPIOP0:
  47.                                 if(P0 & (0x01 << Pin))IDR = 1;
  48.         break;
  49.     case GPIOP1:
  50.                                 if(P1 & (0x01 << Pin))IDR = 1;
  51.         break;
  52.     case GPIOP2:
  53.                                 if(P2 & (0x01 << Pin))IDR = 1;
  54.         break;
  55.     case GPIOP3:
  56.                                 if(P3 & (0x01 << Pin))IDR = 1;
  57.         break;
  58.     }
  59.     return IDR;
  60. }
復制代碼


回復

使用道具 舉報

ID:213173 發表于 2022-7-7 16:13 | 顯示全部樓層
//51單片機,P3接按鍵,P1接LED,實際電路證明可以用端口直接傳參

#include <reg51.h>

void display(unsigned char i)
{
        P1=i;
}

void main()                                                       
{
        while(1)
        {
                display(P3);
        }
}
回復

使用道具 舉報

ID:161164 發表于 2022-7-7 16:40 | 顯示全部樓層
wulin 發表于 2022-7-7 16:13
//51單片機,P3接按鍵,P1接LED,實際電路證明可以用端口直接傳參

#include

可能我誤會了樓主的意思
和另一個帖子的問題弄混了
另一個帖子問的是同一個函數(如IIC讀寫)
透過端口傳參來達到不同引腳共用函數的方法
回復

使用道具 舉報

ID:883242 發表于 2022-7-7 17:51 | 顯示全部樓層
wulin 發表于 2022-7-7 16:13
//51單片機,P3接按鍵,P1接LED,實際電路證明可以用端口直接傳參

#include

不對,他是要傳P0、P1、P2…… 給函數,然后函數對這幾個端口中的一個進行操作。
你寫的display(P3); 傳進去的是P3的值,而不是P3這個端口。
回復

使用道具 舉報

ID:883242 發表于 2022-7-7 18:04 | 顯示全部樓層
想了想,只能定義幾個偽端口,然后把偽端口傳進去,對真實端口操作。

  1. #include <reg51.h>
  2. //pseudoports
  3. #define PP0 0x80
  4. #define PP1 0x90
  5. #define PP2 0xa0
  6. #define PP3 0xb0
  7. void display(unsigned char i){
  8.         switch (i){
  9.                 case PP0:
  10.                         P0=0x55;
  11.                   break;
  12.                 case PP1:
  13.                         P1=0x55;
  14.                   break;
  15.                 case PP2:
  16.                         P2=0x55;
  17.                   break;
  18.                 case PP3:
  19.                         P3=0x55;
  20.                   break;
  21.                 }
  22. }

  23. void main(void){
  24.         for(;;){
  25.                 display(PP3);
  26.         }
  27. }
復制代碼
回復

使用道具 舉報

ID:401564 發表于 2022-7-7 20:14 | 顯示全部樓層
新手入門往往是想當然的要一種所謂的功能,然后就提問了,有時擠破腦子都不知道你要干嘛
但更多的時候,你所要的功能卻是另外一個很簡單的知識點而已
比如,你有個并口數據是連接P1的
你是不是想這樣:
函數(P1);
那我這樣不就行了:
a=P1;
函數(a);
難不成你想要這樣聲明函數:
函數(sfr a);
回復

使用道具 舉報

ID:86450 發表于 2022-7-7 22:26 | 顯示全部樓層
我感覺你要寫出一大推的宏定義。就能實現了
回復

使用道具 舉報

ID:771630 發表于 2022-7-8 07:01 | 顯示全部樓層
51的定義是靠sfr實現的,如果想要傳遞端口,可以把端口的指針傳遞,然后直接對地址進行寫值
回復

使用道具 舉報

ID:213173 發表于 2022-7-8 07:39 | 顯示全部樓層
Y_G_G 發表于 2022-7-7 20:14
新手入門往往是想當然的要一種所謂的功能,然后就提問了,有時擠破腦子都不知道你要干嘛
但更多的時候,你所 ...

你分析得對,從樓主上篇帖子《為什么單片機C語言按鍵掃描反應慢?》看,可能沒有解決問題而發了這個語焉不詳的帖子,誤導別人想多了。都砌到9樓了,樓主還沒有吭一聲。感覺好像是有人出了個腦筋急轉彎,眾人瞎猜。如果再遇上個懂王杠精就更無趣了。
回復

使用道具 舉報

ID:883242 發表于 2022-7-8 07:55 | 顯示全部樓層
XLinliY.Zhang 發表于 2022-7-8 07:01
51的定義是靠sfr實現的,如果想要傳遞端口,可以把端口的指針傳遞,然后直接對地址進行寫值

你去看看51指令集,你的想法根本就不可能,沒有指令可以實現。SFR位于RAM空間高128字節,只能直接尋址,能改變地址的是間接尋址,但是無法訪問SFR,只能訪問RAM。

比如給P0賦值,只能寫成MOV 0x80,A,注意這個0x80是寫死在flash里面的,無法被更改。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黑人成人网 | 午夜小电影| 欧洲精品码一区二区三区免费看 | 国产伦一区二区三区四区 | 亚洲免费网 | 成人夜晚看av| 久久久久久久电影 | 不卡在线一区 | 久久伊 | 91视视频在线观看入口直接观看 | 2019天天操 | av大片| 久草院线| 亚洲视频免费在线看 | 精品久久久久久一区二区 | 国产精品观看 | 日本在线中文 | 孰女乱色一区二区三区 | 久草在线 | 欧美精品久久久久久久久老牛影院 | 久久精品国产一区 | 久久国产一区二区三区 | 亚洲精品无 | 中文字幕 在线观看 | 久久久久中文字幕 | 欧美视频在线看 | 久久免费精品视频 | 日韩欧美精品 | 成人h电影在线观看 | 成人免费一级视频 | 91久久精品国产91久久 | 九色视频网站 | 天天操狠狠操 | 国产精品18久久久 | 99在线视频观看 | 国产精品久久精品 | 中文字幕在线第二页 | 亚洲精品白浆高清久久久久久 | 午夜私人影院 | 日韩成人免费av | 亚洲毛片一区二区 |