找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4274|回复: 9
收起左侧

C语言通过数组控制不同的单片机IO口

[复制链接]
ID:714425 发表于 2020-12-18 11:16 | 显示全部楼层 |阅读模式
本帖最后由 南校貂 于 2020-12-19 00:18 编辑

在做彩灯遇到的一个问题,需要用到51 所有IO口(32个),想用for循环通过较少的代码实现IO口控制
例如这样:

sbit LED1 P0^0;
sbit LED2 P0^1;
sbit LED3 P0^2;

int LED[ = {LED1, LED2, LED3};

void one(u8 z)
{
     u8 x;
     x = 0;     LED(x) = 0;
     x++;               
     if(x = 3)
       x = 0;             //这里的代码有点乱,但不是需要解决的问题
                                //需要解决的问题是,当x不同时,通过给数组成员LED(x)赋值,然后达到控制对应IO口的目的
                               // 如果能实现,就可以根据x的值来给对应的IO口进行控制,如不是想控制那个IO口时都需要写出来
                           
}
   
例如想让LED1/2/3依次亮起来
for(x=3;x>0;x--)
{
    LED(x)=0;
    delay(200);
    LED(x)=1;
}
传统的话只能将LED1/2/3一个一个打出来,或者通过位移。当IO口过多的时候就不好用了、需要很多的代码,移植性不强。


在定义数组和IO口的关系的时候需要通过指针或者其他的一些方法吗?
不知道提出的这个问题可不可行,小白一枚望大佬们多多指教!!!





回复

使用道具 举报

ID:332444 发表于 2020-12-18 12:57 | 显示全部楼层
参考这里计算机流水灯就知道了https://blog.csdn.net/xianfajushi/article/details/82279726

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:267932 发表于 2020-12-18 14:22 | 显示全部楼层
u8 x;  你这个是不是静态变量, 每次进void one()  这个函数, x都是0;所以
     x++;
     if(x = 3)
       x = 0;
这里没作用

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:844772 发表于 2020-12-18 15:19 | 显示全部楼层
你那个不行啊,本来直接移位就行,没必要定义数组。
如 P0<<i;  或者做一些位运算。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:844772 发表于 2020-12-18 15:27 | 显示全部楼层
另外,反写是可以的,但看不出意义:
char LED[3] = {0x01,0x02,0x04}; //只三个口

void one()
{
     u8 x;
     x = 0;
    while(x<3) //这是死循环啊
   {
     P0= LED(x); //分别置1
     x++;
     if(x = 3)
       x = 0;   
   }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:775776 发表于 2020-12-18 18:08 | 显示全部楼层
执行一次for循环
回复

使用道具 举报

ID:146102 发表于 2020-12-18 18:48 | 显示全部楼层
u32 pbuf;
void main()
{
    pbuf=0x01;
   
    while(1)
    {

    }

}
回复

使用道具 举报

ID:714425 发表于 2020-12-19 00:03 | 显示全部楼层
glinfei 发表于 2020-12-18 15:19
你那个不行啊,本来直接移位就行,没必要定义数组。
如 P0

是可以通过位移实现,但在开发更多的亮灯方式的时候还是需要很多代码的,而且移植性不强。
回复

使用道具 举报

ID:213173 发表于 2020-12-19 08:37 | 显示全部楼层
南校貂 发表于 2020-12-19 00:03
是可以通过位移实现,但在开发更多的亮灯方式的时候还是需要很多代码的,而且移植性不强。

32个IO口组合LED用4维数组。
回复

使用道具 举报

ID:714425 发表于 2020-12-20 13:10 | 显示全部楼层
wulin 发表于 2020-12-19 08:37
32个IO口组合LED用4维数组。

这个怎么操作呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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