找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2680|回复: 28
收起左侧

怎样把单片机的8个不同管脚定义成同一个IO口

  [复制链接]
ID:975927 发表于 2021-11-8 16:07 | 显示全部楼层 |阅读模式
能否将分散在不同口的8个led灯合并在一个IO口上方便做流水灯操作
回复

使用道具 举报

ID:57657 发表于 2021-11-8 16:47 | 显示全部楼层
WS2812B 一个IO口就可以驱动无限级联,其他方法没听说过。
回复

使用道具 举报

ID:548551 发表于 2021-11-8 17:14 | 显示全部楼层
你是这意思么? 比如P10 P12 P32 P45 这四个IO口不是属于同一组。但是操作的时候一个0XFF 可以全部电平都赋值为1. 同理如果赋值0X00则这几个IO口电平都为0,是这意思么?
回复

使用道具 举报

ID:262 发表于 2021-11-8 17:19 | 显示全部楼层
单片机不同的io口怎样用十六进制赋值http://www.51hei.com/bbs/dpj-183792-1.html
回复

使用道具 举报

ID:975927 发表于 2021-11-8 17:41 | 显示全部楼层
xqleft 发表于 2021-11-8 17:14
你是这意思么? 比如P10 P12 P32 P45 这四个IO口不是属于同一组。但是操作的时候一个0XFF 可以全部电平都赋 ...

是的,有什么办法可以把他们放一起吗
回复

使用道具 举报

ID:739610 发表于 2021-11-8 20:36 | 显示全部楼层
操作一个字  再把这个字的位控制IO口的输出
回复

使用道具 举报

ID:813640 发表于 2021-11-8 20:42 | 显示全部楼层
不用定义啊,IO就是输出高低电平啊,同时高电平,同时低电平,就可类似于一个IO口啊
回复

使用道具 举报

ID:624769 发表于 2021-11-8 21:28 | 显示全部楼层
1027669350 发表于 2021-11-8 17:41
是的,有什么办法可以把他们放一起吗

没有什么比较好的办法,只能是:

把每个LED sbit 一下,如:
sbit LED0 = P1^0;
sbit LED1 = P4^2;
…………
…………

然后,做个子函数,然后主程序调用子函数。
void  LED_Light(uchar dat)
{
       dat <<= 1;
       LED0 = CY;
       dat <<= 1;
       LED1 = CY;
       dat <<= 1;
       LED2 = CY;
       dat <<= 1;
       LED3 = CY;
       dat <<= 1;
       LED4 = CY;
       dat <<= 1;
       LED5 = CY;
       dat <<= 1;
       LED6 = CY;
       dat <<= 1;
       LED7 = CY;
}
回复

使用道具 举报

ID:57657 发表于 2021-11-8 22:26 | 显示全部楼层
188610329 发表于 2021-11-8 21:28
没有什么比较好的办法,只能是:

把每个LED sbit 一下,如:

你直接一条 P1= dat; 就可以了,为何写这么复杂。
回复

使用道具 举报

ID:960619 发表于 2021-11-8 22:36 来自手机 | 显示全部楼层
灯要是共阴。P1=0x01就是点亮P10灯,P1=0xff就是点亮8个灯
回复

使用道具 举报

ID:624769 发表于 2021-11-8 23:03 | 显示全部楼层
npn 发表于 2021-11-8 22:26
你直接一条 P1= dat; 就可以了,为何写这么复杂。

看看楼主在 5 楼的 回复,他要把不同总线上的 若干个 IO 控制的 总数为 8 的 LED 组成,如同在一个总线上 的8个LED , 再结合楼主 顶楼的发言, 他要做流水灯, 那么就需要可以 一个字节 控制 8个不同总线上的 LED,由于不知道具体几个总线, 2-3 个总线的话, & | 还是比较方便的, 多了的话,只能各自位控制。
回复

使用道具 举报

ID:213173 发表于 2021-11-9 05:52 | 显示全部楼层
用结构体与共用体写较难理解,用函数写好理解。这是实际应用的一个函数:
void PX(unsigned char x)
{
        P3&=0xc0;                //低6位清0,P36、37不变
        P3|=(x&0x3f);        //P3低6位赋值
        P2&=0xeb;                //P24、22清0,其它位不变
        P2|=((x>>3&0x10)|(x>>4&0x04));//P24、22赋值
}
回复

使用道具 举报

ID:86450 发表于 2021-11-9 07:33 | 显示全部楼层
自己定义一个函数实现
回复

使用道具 举报

ID:78835 发表于 2021-11-9 08:04 | 显示全部楼层
结构体与共用体写比较方便吧
回复

使用道具 举报

ID:46065 发表于 2021-11-9 08:43 | 显示全部楼层
A=P1^0;//第0位
B=P2^0; //第一位
C=P3^0;
D=P4^0;
E=P5^0;
F=P6^0;
G=P7^0;
H=P8^0;//第七位
dat|=A;//第0位赋值
dat=(dat<<1)|A;
dat=(dat<<2)|B;
dat=(dat<<3)|C;
dat=(dat<<4)|D;
dat=(dat<<5|E;
dat=(dat<<6)|F;
dat=(dat<<7)|G;//第7位赋值
以上是从散装=》整个装
逆过程用&每位判断
一个思路希望对你有帮助
回复

使用道具 举报

ID:420836 发表于 2021-11-9 09:43 | 显示全部楼层
定义一个控制字,然后将每一位映射到物理 IO 引脚。
回复

使用道具 举报

ID:592807 发表于 2021-11-9 11:10 | 显示全部楼层
涛qq623942603 发表于 2021-11-9 08:04
结构体与共用体写比较方便吧

union LED_U
{


}
回复

使用道具 举报

ID:975927 发表于 2021-11-9 13:54 | 显示全部楼层
188610329 发表于 2021-11-8 21:28
没有什么比较好的办法,只能是:

把每个LED sbit 一下,如:

多谢大佬,通过你的方式成功实现了
回复

使用道具 举报

ID:57657 发表于 2021-11-10 12:06 | 显示全部楼层
188610329 发表于 2021-11-8 21:28
没有什么比较好的办法,只能是:

把每个LED sbit 一下,如:

建议你定义个 unsigned char bdata 可位寻址的全局变量然后赋值,不用移位。
回复

使用道具 举报

ID:624769 发表于 2021-11-10 13:55 | 显示全部楼层
npn 发表于 2021-11-10 12:06
建议你定义个 unsigned char bdata 可位寻址的全局变量然后赋值,不用移位。

不知道,你有没有看明白楼主的问题。

总觉得你说的东西,和楼主的问题不在一个频道上,所以,你说的,我实在不能理解,对楼主能有什么帮助。
而你又是回复我,我就更不明白,你讲的这些,和我回复的内容有什么关系。

如果,你有看到,希望还是能详细说明一下,实在是…… 不理解。
回复

使用道具 举报

ID:548551 发表于 2021-11-10 14:20 | 显示全部楼层
1027669350 发表于 2021-11-8 17:41
是的,有什么办法可以把他们放一起吗

vvoid SCAN_SEG(unsigned char show_data)
{
    P_SEG1=1;
    if((show_data&0x01)==0){P_SEG1=0;}
    P_SEG2=1;
    if((show_data&0x02)==0){P_SEG2=0;}
    P_SEG3=1;
    if((show_data&0x04)==0){P_SEG3=0;}
    P_SEG4=1;
    if((show_data&0x08)==0){P_SEG4=0;}
    P_SEG5=1;
    if((show_data&0x10)==0){P_SEG5=0;}
    P_SEG6=1;
    if((show_data&0x20)==0){P_SEG6=0;}
    P_SEG7=1;
    if((show_data&0x40)==0){P_SEG7=0;}
}
show_data你可以用个全局变量,每次进行赋值。IO口的电平就变化了这样的程序你能懂不
回复

使用道具 举报

ID:447546 发表于 2021-11-12 13:46 | 显示全部楼层
我这里有WS2812 驱动RGB的方法思路 。  只要一个IO口就可以控制N
回复

使用道具 举报

ID:435676 发表于 2021-11-12 17:41 | 显示全部楼层
失之东隅收之桑榆!方法无数看你怎么用了;既然有8个脚,为什么要做成1个目的是什么???节省IO口??   输出正弦电压
回复

使用道具 举报

ID:57657 发表于 2021-11-12 20:04 | 显示全部楼层
188610329 发表于 2021-11-10 13:55
不知道,你有没有看明白楼主的问题。

总觉得你说的东西,和楼主的问题不在一个频道上,所以,你说的, ...

你可以看一下keil 的 bdata 变量用法,是可以用sbit位寻址操作的。
回复

使用道具 举报

ID:624769 发表于 2021-11-12 22:49 | 显示全部楼层
npn 发表于 2021-11-12 20:04
你可以看一下keil 的 bdata 变量用法,是可以用sbit位寻址操作的。

你是说得:
unsigned char bdata Transfr_Temp;
sbit MSB = Transfr_Temp^7;
sbit LSB = Transfr_Temp^0;

这个用法么? 用了十几年了,然后呢? 你就说你究竟想表达什么意思吧?弄得人心痒的要命,不知重点。
回复

使用道具 举报

ID:397211 发表于 2021-11-13 09:08 | 显示全部楼层
可以使用端口重定义,自己定义一个可寻址的变量,unsigned char bdata ok;然后sbit ok^0;就可以了,最后只需要做一个子程序将IO口对应起来,例如对应好之后就可以直接使用ok=0xf0;赋值之后就调用一下子程序,这样乱的IO口就变成了整齐了的
回复

使用道具 举报

ID:624769 发表于 2021-11-13 11:59 | 显示全部楼层
npn 发表于 2021-11-10 12:06
建议你定义个 unsigned char bdata 可位寻址的全局变量然后赋值,不用移位。

看了26楼的解释,大概明白你的意思了,

你的意思是用一个可位寻址的变量,通过给这个变量赋值,然后再调用一个函数,函数中,分别把这个变量的每个位,赋值给不同的LED?
如果是这样的话,目的是什么? 好看?
你必须要考虑一个问题,就是效率。
你把你的设想变成代码,编译之后和我给搂主的代码比较一下,看看哪个代码生成后 体积更小?然后,尝试跑一下,看看哪个代码更快?
bdata是稀缺资源,只有16字节,不能浪费在这样地方。关键是还没提高效率。
回复

使用道具 举报

ID:72088 发表于 2021-11-13 12:27 | 显示全部楼层
楼主是驱动数码管或者点阵的吧,我遇到过,
回复

使用道具 举报

ID:587810 发表于 2021-11-13 14:40 | 显示全部楼层
如果是51的话可以直接P1=0x00或者P1=0xFF
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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