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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3257|回復: 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--;
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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)

回復

使用道具 舉報

5#
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;{}
}

}
回復

使用道具 舉報

6#
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中的代碼量。
回復

使用道具 舉報

7#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩久久精品 | 久久99精品久久久久婷婷 | 中文在线播放 | 在线观看视频一区二区三区 | 成人高清在线 | 一区二区三区四区国产 | 日批的视频 | 中国一级大毛片 | 做a视频在线观看 | 一级黄色片毛片 | 羞羞网站在线观看 | 国产精品欧美一区二区 | 作爱视频免费看 | 毛片在线看片 | av在线免费播放 | 亚洲精品日韩精品 | 国产日韩欧美一区二区 | 中文字幕精品一区二区三区精品 | 欧美精品成人一区二区三区四区 | 国产精品久久久久久久久久免费 | 亚洲 中文 欧美 日韩 在线观看 | 天天玩天天干天天操 | 女人牲交视频一级毛片 | 日韩精品视频在线观看一区二区三区 | 日本免费在线 | 日韩精品激情 | av在线天堂网 | 国产精品一区二区av | 成人在线 | 亚洲精品久久久久久久久久吃药 | 天天操夜夜操 | 国产乱码精品一区二区三区中文 | 日韩高清中文字幕 | 欧美一区二区三区精品免费 | 99精品视频免费观看 | 天天天天操 | 久久久久成人精品亚洲国产 | 男女在线免费观看 | 国产精品久久久久一区二区三区 | 亚洲成人一二区 | 一级片免费网站 |