找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2798|回复: 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 单片机教程网

快速回复 返回顶部 返回列表