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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4700|回復: 28
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:975927 發表于 2021-11-8 16:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
能否將分散在不同口的8個led燈合并在一個IO口上方便做流水燈操作
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:57657 發表于 2021-11-8 16:47 | 只看該作者
WS2812B 一個IO口就可以驅動無限級聯,其他方法沒聽說過。
回復

使用道具 舉報

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

使用道具 舉報

地板
ID:262 發表于 2021-11-8 17:19 | 只看該作者
單片機不同的io口怎樣用十六進制賦值http://www.zg4o1577.cn/bbs/dpj-183792-1.html
回復

使用道具 舉報

5#
ID:975927 發表于 2021-11-8 17:41 | 只看該作者
xqleft 發表于 2021-11-8 17:14
你是這意思么? 比如P10 P12 P32 P45 這四個IO口不是屬于同一組。但是操作的時候一個0XFF 可以全部電平都賦 ...

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

使用道具 舉報

6#
ID:739610 發表于 2021-11-8 20:36 | 只看該作者
操作一個字  再把這個字的位控制IO口的輸出
回復

使用道具 舉報

7#
ID:813640 發表于 2021-11-8 20:42 | 只看該作者
不用定義啊,IO就是輸出高低電平啊,同時高電平,同時低電平,就可類似于一個IO口啊
回復

使用道具 舉報

8#
ID:624769 發表于 2021-11-8 21:28 | 只看該作者
1027669350 發表于 2021-11-8 17:41
是的,有什么辦法可以把他們放一起嗎

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

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

然后,做個子函數,然后主程序調用子函數。
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;
}
回復

使用道具 舉報

9#
ID:57657 發表于 2021-11-8 22:26 | 只看該作者
188610329 發表于 2021-11-8 21:28
沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:

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

使用道具 舉報

10#
ID:960619 發表于 2021-11-8 22:36 來自手機 | 只看該作者
燈要是共陰。P1=0x01就是點亮P10燈,P1=0xff就是點亮8個燈
回復

使用道具 舉報

11#
ID:624769 發表于 2021-11-8 23:03 | 只看該作者
npn 發表于 2021-11-8 22:26
你直接一條 P1= dat; 就可以了,為何寫這么復雜。

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

使用道具 舉報

12#
ID:213173 發表于 2021-11-9 05:52 | 只看該作者
用結構體與共用體寫較難理解,用函數寫好理解。這是實際應用的一個函數:
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賦值
}
回復

使用道具 舉報

13#
ID:86450 發表于 2021-11-9 07:33 | 只看該作者
自己定義一個函數實現
回復

使用道具 舉報

14#
ID:78835 發表于 2021-11-9 08:04 | 只看該作者
結構體與共用體寫比較方便吧
回復

使用道具 舉報

15#
ID:46065 發表于 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位賦值
以上是從散裝=》整個裝
逆過程用&每位判斷
一個思路希望對你有幫助
回復

使用道具 舉報

16#
ID:420836 發表于 2021-11-9 09:43 | 只看該作者
定義一個控制字,然后將每一位映射到物理 IO 引腳。
回復

使用道具 舉報

17#
ID:592807 發表于 2021-11-9 11:10 | 只看該作者
濤qq623942603 發表于 2021-11-9 08:04
結構體與共用體寫比較方便吧

union LED_U
{


}
回復

使用道具 舉報

18#
ID:975927 發表于 2021-11-9 13:54 | 只看該作者
188610329 發表于 2021-11-8 21:28
沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:

多謝大佬,通過你的方式成功實現了
回復

使用道具 舉報

19#
ID:57657 發表于 2021-11-10 12:06 | 只看該作者
188610329 發表于 2021-11-8 21:28
沒有什么比較好的辦法,只能是:

把每個LED sbit 一下,如:

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

使用道具 舉報

20#
ID:624769 發表于 2021-11-10 13:55 | 只看該作者
npn 發表于 2021-11-10 12:06
建議你定義個 unsigned char bdata 可位尋址的全局變量然后賦值,不用移位。

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

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

如果,你有看到,希望還是能詳細說明一下,實在是…… 不理解。
回復

使用道具 舉報

21#
ID:548551 發表于 2021-11-10 14:20 | 只看該作者
1027669350 發表于 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你可以用個全局變量,每次進行賦值。IO口的電平就變化了這樣的程序你能懂不
回復

使用道具 舉報

22#
ID:447546 發表于 2021-11-12 13:46 | 只看該作者
我這里有WS2812 驅動RGB的方法思路 。  只要一個IO口就可以控制N
回復

使用道具 舉報

23#
ID:435676 發表于 2021-11-12 17:41 | 只看該作者
失之東隅收之桑榆!方法無數看你怎么用了;既然有8個腳,為什么要做成1個目的是什么???節省IO口??   輸出正弦電壓
回復

使用道具 舉報

24#
ID:57657 發表于 2021-11-12 20:04 | 只看該作者
188610329 發表于 2021-11-10 13:55
不知道,你有沒有看明白樓主的問題。

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

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

使用道具 舉報

25#
ID:624769 發表于 2021-11-12 22:49 | 只看該作者
npn 發表于 2021-11-12 20:04
你可以看一下keil 的 bdata 變量用法,是可以用sbit位尋址操作的。

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

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

使用道具 舉報

26#
ID:397211 發表于 2021-11-13 09:08 | 只看該作者
可以使用端口重定義,自己定義一個可尋址的變量,unsigned char bdata ok;然后sbit ok^0;就可以了,最后只需要做一個子程序將IO口對應起來,例如對應好之后就可以直接使用ok=0xf0;賦值之后就調用一下子程序,這樣亂的IO口就變成了整齊了的
回復

使用道具 舉報

27#
ID:624769 發表于 2021-11-13 11:59 | 只看該作者
npn 發表于 2021-11-10 12:06
建議你定義個 unsigned char bdata 可位尋址的全局變量然后賦值,不用移位。

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

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

使用道具 舉報

28#
ID:72088 發表于 2021-11-13 12:27 | 只看該作者
樓主是驅動數碼管或者點陣的吧,我遇到過,
回復

使用道具 舉報

29#
ID:587810 發表于 2021-11-13 14:40 | 只看該作者
如果是51的話可以直接P1=0x00或者P1=0xFF
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲逼院| 久久久久无码国产精品一区 | 综合久久av | 91新视频| 老司机久久| 在线观看中文字幕 | 综合久久av | 久日精品 | 国产毛片视频 | 国产精品成人免费 | 国产精品色婷婷久久58 | 国产视频日韩 | 国产精品久久久久久久久图文区 | 在线免费观看色 | 91大神在线资源观看无广告 | 岛国av在线免费观看 | 亚洲成av片人久久久 | 久久精品高清视频 | 国产视频h | 国户精品久久久久久久久久久不卡 | 日本一区二区三区在线观看 | 亚洲视频一区在线 | 欧美日韩成人 | 国产精品亚洲成在人线 | 国产精品久久久久久久久免费软件 | 91视频久久| 欧美久久久久久 | 中文字幕视频一区 | 夜夜操天天艹 | 欧美一区二区激情三区 | 成人国产精品一级毛片视频毛片 | 中文字幕在线观看精品 | 黄色片a级 | 国产高清自拍视频在线观看 | 国产激情一区二区三区 | 亚洲 欧美 综合 | av看看| 亚洲一区二区三区高清 | 一区二区三区视频在线免费观看 | 日韩精品1区2区3区 成人黄页在线观看 | 免费亚洲网站 |