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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人射人人插 | 欧洲精品一区 | 日韩精品视频中文字幕 | 精品在线看 | 草久久久| 97精品超碰一区二区三区 | 麻豆久久精品 | 尤物在线视频 | 国产精品片aa在线观看 | 国产欧美日韩二区 | 欧美日韩国产精品一区二区 | 日日摸夜夜添夜夜添特色大片 | 亚洲精品一区在线 | 韩日免费视频 | 精品国产鲁一鲁一区二区张丽 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 久久国产一区 | 黄视频免费 | 欧美性猛交一区二区三区精品 | 国产激情一区二区三区 | 超碰在线人人干 | 日韩国产精品一区二区三区 | 天天精品在线 | 国产精品久久在线观看 | 国产精品乱码一区二区三区 | 日韩一区二区三区在线 | 全免费a级毛片免费看视频免费下 | 日本精品视频一区二区三区四区 | 在线免费国产 | 国产大学生情侣呻吟视频 | 看片地址 | 91激情电影 | 999精品网 | 日韩日韩日韩日韩日韩日韩日韩 | 国产熟熟| 久久这里只有精品首页 | 香蕉视频91| 在线观看涩涩视频 | 欧美三级网站 | 亚洲精品亚洲人成人网 | 国产精品日日做人人爱 |