欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3799|回復: 6
收起左側

C51單片機如何將MCU多個引腳分時復用同一個函數中?

[復制鏈接]
ID:662637 發表于 2021-3-23 22:31 | 顯示全部樓層 |閱讀模式
目前采用STC單片機,想實現mcu多個引腳分時復用同一函數WS2812_SendByte()來驅動不同的WS2812B LED進行顯示,但sbit位定義不能放置在函數中,請問需要如何定義才能將MCU多個IO分時復用WS2812_SendByte()函數?

void Ctrl_WEI(unsigned char i)
{
   switch(i)
        {
        case 0:sbit WS2812_IO = P1^0;break;
        case 1:sbit WS2812_IO = P1^1;break;
        case 2:sbit WS2812_IO = P1^2;break;
        case 4:sbit WS2812_IO = P1^3;break;
        }
}


void WS2812_SendByte(unsigned char dat)
{
    unsigned char i = 8;
    dat <<= 1;
    while (i)
    {
        WS2812_IO = 1;
        _nop_();   
        _nop_();                                                
        WS2812_IO = CY;
        WS2812_IO = 0;                        
        dat <<= 1;
        i--;
    }
}

回復

使用道具 舉報

ID:390416 發表于 2021-3-23 22:54 | 顯示全部樓層
所有的2812 可以串聯用一個IO口輸出
回復

使用道具 舉報

ID:662637 發表于 2021-3-23 23:09 | 顯示全部樓層
人人學會單片機 發表于 2021-3-23 22:54
所有的2812 可以串聯用一個IO口輸出

是的,所有的2812是可以串聯起來,但目前程序是分別采用4個IO分別控制4段WS2812燈串,每段WS2812燈串有24個WS2812,如果串聯起來,1個IO就需要驅動96個WS2812,因此為了減輕MCU IO的負擔,分了4個IO來驅動,目前為了優化程序,盡量想復用函數,否則4個IO就需要分別寫4個基本相同的WS2812_SendByte()函數來驅動了,不知道是否有好的方法還可以復用WS2812_SendByte()函數。
回復

使用道具 舉報

ID:213173 發表于 2021-3-24 08:39 | 顯示全部樓層
youwoowoo 發表于 2021-3-23 23:09
是的,所有的2812是可以串聯起來,但目前程序是分別采用4個IO分別控制4段WS2812燈串,每段WS2812燈串有24 ...

給你一個類似程序參考。DS18B20是單總線器件,一個IO口可以掛N個器件。如果用多路IO口分別接多路DS18B20,省去了識別地址的麻煩。此例只用一個驅動函數,輪流讀寫8個IO口。 8路溫度表 仿真.zip (267.43 KB, 下載次數: 22)

回復

使用道具 舉報

ID:592807 發表于 2021-3-24 08:47 | 顯示全部樓層
youwoowoo 發表于 2021-3-23 23:09
是的,所有的2812是可以串聯起來,但目前程序是分別采用4個IO分別控制4段WS2812燈串,每段WS2812燈串有24 ...

多寫幾行代碼而已
sbit WS2812_IO0 = P1^0;
sbit WS2812_IO1 = P1^0;
sbit WS2812_IO2 = P1^0;
void WS2812_SendByte(unsigned char dat,unsigned char dan)
{
unsigned char i = 8;
i <<= 1;
switch(dan)
{
case 0:
{
  while (i)
    {
        WS2812_IO0 = 1;
        _nop_();   
        _nop_();                                                
        WS2812_IO0 = CY;
        WS2812_IO0 = 0;                        
        dat <<= 1;
        i--;
    }
break;}
case 1:{}
case 2:{}
default;{}
}

}
回復

使用道具 舉報

ID:662637 發表于 2021-3-24 09:43 | 顯示全部樓層
黃youhui 發表于 2021-3-24 08:47
多寫幾行代碼而已
sbit WS2812_IO0 = P1^0;
sbit WS2812_IO1 = P1^0;

是的,增加代碼確實是可以解決問題,但是有沒有更優化的方式,可以在程序中將MCU管腳進行重新定義,這樣就可以復用同一個驅動函數,減小FLASH中的代碼量。
回復

使用道具 舉報

ID:662637 發表于 2021-3-24 11:29 | 顯示全部樓層
wulin 發表于 2021-3-24 08:39
給你一個類似程序參考。DS18B20是單總線器件,一個IO口可以掛N個器件。如果用多路IO口分別接多路DS18B20 ...

看了這個例程,在驅動函數里面對整個P3口同時進行操作,P3口接8個DS18B20,可以同時讀寫DS18B20,但是這個驅動函數是同時操作P3口,若如我需要采用WS2812B進行如時鐘數字的顯示,不同IO驅動WS2812顯示不同的內容是則不是很合適使用,但謝謝你的例程給我其它的一些思路!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表