找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4772|回復(fù): 28
收起左側(cè)

怎樣把單片機(jī)的8個不同管腳定義成同一個IO口

  [復(fù)制鏈接]
ID:975927 發(fā)表于 2021-11-8 16:07 | 顯示全部樓層 |閱讀模式
能否將分散在不同口的8個led燈合并在一個IO口上方便做流水燈操作
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2021-11-8 16:47 | 顯示全部樓層
WS2812B 一個IO口就可以驅(qū)動無限級聯(lián),其他方法沒聽說過。
回復(fù)

使用道具 舉報

ID:548551 發(fā)表于 2021-11-8 17:14 | 顯示全部樓層
你是這意思么? 比如P10 P12 P32 P45 這四個IO口不是屬于同一組。但是操作的時候一個0XFF 可以全部電平都賦值為1. 同理如果賦值0X00則這幾個IO口電平都為0,是這意思么?
回復(fù)

使用道具 舉報

ID:262 發(fā)表于 2021-11-8 17:19 | 顯示全部樓層
單片機(jī)不同的io口怎樣用十六進(jìn)制賦值http://www.torrancerestoration.com/bbs/dpj-183792-1.html
回復(fù)

使用道具 舉報

ID:975927 發(fā)表于 2021-11-8 17:41 | 顯示全部樓層
xqleft 發(fā)表于 2021-11-8 17:14
你是這意思么? 比如P10 P12 P32 P45 這四個IO口不是屬于同一組。但是操作的時候一個0XFF 可以全部電平都賦 ...

是的,有什么辦法可以把他們放一起嗎
回復(fù)

使用道具 舉報

ID:739610 發(fā)表于 2021-11-8 20:36 | 顯示全部樓層
操作一個字  再把這個字的位控制IO口的輸出
回復(fù)

使用道具 舉報

ID:813640 發(fā)表于 2021-11-8 20:42 | 顯示全部樓層
不用定義啊,IO就是輸出高低電平啊,同時高電平,同時低電平,就可類似于一個IO口啊
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-11-8 21:28 | 顯示全部樓層
1027669350 發(fā)表于 2021-11-8 17:41
是的,有什么辦法可以把他們放一起嗎

沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:
sbit LED0 = P1^0;
sbit LED1 = P4^2;
…………
…………

然后,做個子函數(shù),然后主程序調(diào)用子函數(shù)。
void  LED_Light(uchar dat)
{
       dat <<= 1;
       LED0 = CY;
       dat <<= 1;
       LED1 = CY;
       dat <<= 1;
       LED2 = CY;
       dat <<= 1;
       LED3 = CY;
       dat <<= 1;
       LED4 = CY;
       dat <<= 1;
       LED5 = CY;
       dat <<= 1;
       LED6 = CY;
       dat <<= 1;
       LED7 = CY;
}
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2021-11-8 22:26 | 顯示全部樓層
188610329 發(fā)表于 2021-11-8 21:28
沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:

你直接一條 P1= dat; 就可以了,為何寫這么復(fù)雜。
回復(fù)

使用道具 舉報

ID:960619 發(fā)表于 2021-11-8 22:36 來自手機(jī) | 顯示全部樓層
燈要是共陰。P1=0x01就是點(diǎn)亮P10燈,P1=0xff就是點(diǎn)亮8個燈
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-11-8 23:03 | 顯示全部樓層
npn 發(fā)表于 2021-11-8 22:26
你直接一條 P1= dat; 就可以了,為何寫這么復(fù)雜。

看看樓主在 5 樓的 回復(fù),他要把不同總線上的 若干個 IO 控制的 總數(shù)為 8 的 LED 組成,如同在一個總線上 的8個LED , 再結(jié)合樓主 頂樓的發(fā)言, 他要做流水燈, 那么就需要可以 一個字節(jié) 控制 8個不同總線上的 LED,由于不知道具體幾個總線, 2-3 個總線的話, & | 還是比較方便的, 多了的話,只能各自位控制。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-11-9 05:52 | 顯示全部樓層
用結(jié)構(gòu)體與共用體寫較難理解,用函數(shù)寫好理解。這是實(shí)際應(yīng)用的一個函數(shù):
void PX(unsigned char x)
{
        P3&=0xc0;                //低6位清0,P36、37不變
        P3|=(x&0x3f);        //P3低6位賦值
        P2&=0xeb;                //P24、22清0,其它位不變
        P2|=((x>>3&0x10)|(x>>4&0x04));//P24、22賦值
}
回復(fù)

使用道具 舉報

ID:86450 發(fā)表于 2021-11-9 07:33 | 顯示全部樓層
自己定義一個函數(shù)實(shí)現(xiàn)
回復(fù)

使用道具 舉報

ID:78835 發(fā)表于 2021-11-9 08:04 | 顯示全部樓層
結(jié)構(gòu)體與共用體寫比較方便吧
回復(fù)

使用道具 舉報

ID:46065 發(fā)表于 2021-11-9 08:43 | 顯示全部樓層
A=P1^0;//第0位
B=P2^0; //第一位
C=P3^0;
D=P4^0;
E=P5^0;
F=P6^0;
G=P7^0;
H=P8^0;//第七位
dat|=A;//第0位賦值
dat=(dat<<1)|A;
dat=(dat<<2)|B;
dat=(dat<<3)|C;
dat=(dat<<4)|D;
dat=(dat<<5|E;
dat=(dat<<6)|F;
dat=(dat<<7)|G;//第7位賦值
以上是從散裝=》整個裝
逆過程用&每位判斷
一個思路希望對你有幫助
回復(fù)

使用道具 舉報

ID:420836 發(fā)表于 2021-11-9 09:43 | 顯示全部樓層
定義一個控制字,然后將每一位映射到物理 IO 引腳。
回復(fù)

使用道具 舉報

ID:592807 發(fā)表于 2021-11-9 11:10 | 顯示全部樓層
濤qq623942603 發(fā)表于 2021-11-9 08:04
結(jié)構(gòu)體與共用體寫比較方便吧

union LED_U
{


}
回復(fù)

使用道具 舉報

ID:975927 發(fā)表于 2021-11-9 13:54 | 顯示全部樓層
188610329 發(fā)表于 2021-11-8 21:28
沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:

多謝大佬,通過你的方式成功實(shí)現(xiàn)了
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2021-11-10 12:06 | 顯示全部樓層
188610329 發(fā)表于 2021-11-8 21:28
沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:

建議你定義個 unsigned char bdata 可位尋址的全局變量然后賦值,不用移位。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-11-10 13:55 | 顯示全部樓層
npn 發(fā)表于 2021-11-10 12:06
建議你定義個 unsigned char bdata 可位尋址的全局變量然后賦值,不用移位。

不知道,你有沒有看明白樓主的問題。

總覺得你說的東西,和樓主的問題不在一個頻道上,所以,你說的,我實(shí)在不能理解,對樓主能有什么幫助。
而你又是回復(fù)我,我就更不明白,你講的這些,和我回復(fù)的內(nèi)容有什么關(guān)系。

如果,你有看到,希望還是能詳細(xì)說明一下,實(shí)在是…… 不理解。
回復(fù)

使用道具 舉報

ID:548551 發(fā)表于 2021-11-10 14:20 | 顯示全部樓層
1027669350 發(fā)表于 2021-11-8 17:41
是的,有什么辦法可以把他們放一起嗎

vvoid SCAN_SEG(unsigned char show_data)
{
    P_SEG1=1;
    if((show_data&0x01)==0){P_SEG1=0;}
    P_SEG2=1;
    if((show_data&0x02)==0){P_SEG2=0;}
    P_SEG3=1;
    if((show_data&0x04)==0){P_SEG3=0;}
    P_SEG4=1;
    if((show_data&0x08)==0){P_SEG4=0;}
    P_SEG5=1;
    if((show_data&0x10)==0){P_SEG5=0;}
    P_SEG6=1;
    if((show_data&0x20)==0){P_SEG6=0;}
    P_SEG7=1;
    if((show_data&0x40)==0){P_SEG7=0;}
}
show_data你可以用個全局變量,每次進(jìn)行賦值。IO口的電平就變化了這樣的程序你能懂不
回復(fù)

使用道具 舉報

ID:447546 發(fā)表于 2021-11-12 13:46 | 顯示全部樓層
我這里有WS2812 驅(qū)動RGB的方法思路 。  只要一個IO口就可以控制N
回復(fù)

使用道具 舉報

ID:435676 發(fā)表于 2021-11-12 17:41 | 顯示全部樓層
失之東隅收之桑榆!方法無數(shù)看你怎么用了;既然有8個腳,為什么要做成1個目的是什么???節(jié)省IO口??   輸出正弦電壓
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2021-11-12 20:04 | 顯示全部樓層
188610329 發(fā)表于 2021-11-10 13:55
不知道,你有沒有看明白樓主的問題。

總覺得你說的東西,和樓主的問題不在一個頻道上,所以,你說的, ...

你可以看一下keil 的 bdata 變量用法,是可以用sbit位尋址操作的。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-11-12 22:49 | 顯示全部樓層
npn 發(fā)表于 2021-11-12 20:04
你可以看一下keil 的 bdata 變量用法,是可以用sbit位尋址操作的。

你是說得:
unsigned char bdata Transfr_Temp;
sbit MSB = Transfr_Temp^7;
sbit LSB = Transfr_Temp^0;

這個用法么? 用了十幾年了,然后呢? 你就說你究竟想表達(dá)什么意思吧?弄得人心癢的要命,不知重點(diǎn)。
回復(fù)

使用道具 舉報

ID:397211 發(fā)表于 2021-11-13 09:08 | 顯示全部樓層
可以使用端口重定義,自己定義一個可尋址的變量,unsigned char bdata ok;然后sbit ok^0;就可以了,最后只需要做一個子程序?qū)O口對應(yīng)起來,例如對應(yīng)好之后就可以直接使用ok=0xf0;賦值之后就調(diào)用一下子程序,這樣亂的IO口就變成了整齊了的
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-11-13 11:59 | 顯示全部樓層
npn 發(fā)表于 2021-11-10 12:06
建議你定義個 unsigned char bdata 可位尋址的全局變量然后賦值,不用移位。

看了26樓的解釋,大概明白你的意思了,

你的意思是用一個可位尋址的變量,通過給這個變量賦值,然后再調(diào)用一個函數(shù),函數(shù)中,分別把這個變量的每個位,賦值給不同的LED?
如果是這樣的話,目的是什么? 好看?
你必須要考慮一個問題,就是效率。
你把你的設(shè)想變成代碼,編譯之后和我給摟主的代碼比較一下,看看哪個代碼生成后 體積更?然后,嘗試跑一下,看看哪個代碼更快?
bdata是稀缺資源,只有16字節(jié),不能浪費(fèi)在這樣地方。關(guān)鍵是還沒提高效率。
回復(fù)

使用道具 舉報

ID:72088 發(fā)表于 2021-11-13 12:27 | 顯示全部樓層
樓主是驅(qū)動數(shù)碼管或者點(diǎn)陣的吧,我遇到過,
回復(fù)

使用道具 舉報

ID:587810 發(fā)表于 2021-11-13 14:40 | 顯示全部樓層
如果是51的話可以直接P1=0x00或者P1=0xFF
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表