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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2875|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧日韩在线| 日日干干 | 日韩欧美国产综合 | 中文字幕男人的天堂 | 一区二区三区免费 | 日韩在线欧美 | 97伦理电影 | 精品国产乱码久久久久久闺蜜 | 亚洲精品一区中文字幕乱码 | 精品福利在线 | 日韩免费在线视频 | 国产精品久久久久999 | 日韩三级在线 | 久久精品久久久 | 亚洲一区二区高清 | 欧美精品91| 国产色网| 一级片在线观看 | 国产亚洲精品久久午夜玫瑰园 | 国产精品一区在线观看 | 欧美极品少妇xxxxⅹ免费视频 | 国产精品欧美日韩 | 伦理午夜电影免费观看 | 日韩一级精品视频在线观看 | 视频一区二区三区在线观看 | 一级网站| 麻豆av免费观看 | 久久夜视频 | 日韩一二区在线 | 国产一区二区三区四区 | 国产二区在线播放 | 国产一区二区三区久久久久久久久 | 国产精品免费视频一区 | 91精品国产一区二区三区 | 亚洲电影一区二区三区 | 国产精品国产精品国产专区不蜜 | 欧美一区二区免费 | 国产美女高潮 | 久久久国产精品视频 | 欧洲高清转码区一二区 | 中文字幕免费中文 |