找回密码
 立即注册
查看: 3949|回复: 11

结构体中不允许定义bit 指针吗

[复制链接]

10

主题

70

回帖

5080

积分

论坛元老

单片机编程魔法师

积分
5080
发表于 2023-3-14 08:28:04 | 显示全部楼层 |阅读模式
写一个链表准备管理散乱的引脚,   结构体中 bit *pin;   咋不支持啊,应该如何改正
STC官方的文档,也没找到关于对散乱的IO口进行统一管理的方法

如果用sfr 定义 ,也无法对其他引脚做映射啊.相对的指针也没办法引出. 愁死了

下面是DEMO 测试编译的,直接不通过



  1. #include <STC32G.H>
  2. //定义链表节点的结构体:
  3. //其中,bit *pin表示指向引脚的指针,struct node *next表示指向下一个节点的指针。
  4. typedef struct node {
  5.     bit *pin;             // 指向引脚的指针
  6.     struct node *next;    // 指向下一个节点的指针
  7. } Node;
  8. Node *head = NULL;
  9. void addNode(bit *pin) {
  10.     Node *newNode = (Node *) malloc(sizeof(Node));    // 分配新节点内存
  11.     newNode->pin = pin;    // 设置新节点的引脚指针
  12.     newNode->next = head;    // 将新节点的next指针指向当前的头节点
  13.     head = newNode;    // 将头指针指向新节点
  14. }
  15. void main() {
  16.     bit *pin1 = &P10;
  17.     bit *pin2 = &P41;
  18.     bit *pin3 = &P52;
  19.    
  20.     addNode(pin1);
  21.     addNode(pin2);
  22.     addNode(pin3);
  23.    
  24.     // 遍历链表并访问每个引脚
  25.     Node *currentNode = head;
  26.     while (currentNode != NULL) {
  27.         *(currentNode->pin) = 1;    // 将引脚设置为高电平
  28.         currentNode = currentNode->next;
  29.     }
  30. }
复制代码






喜欢研究如何让电子产品变得更加智能和有趣.
回复

使用道具 举报 送花

已绑定手机

294

主题

1087

回帖

3547

积分

超级版主

积分
3547
QQ
发表于 2023-3-14 09:04:23 | 显示全部楼层
散乱的IO口进行统一管理的方法:
1.png
热线19952583534
www.STCAI.com
回复

使用道具 举报 送花

10

主题

70

回帖

5080

积分

论坛元老

单片机编程魔法师

积分
5080
 楼主| 发表于 2023-3-14 09:30:29 | 显示全部楼层
国学*** 发表于 2023-3-14 09:04
散乱的IO口进行统一管理的方法:

你发的这个图  不是简单的模式切换吗?  

我想实现的是  将不同地址IO口进行整合
变成一个类似于sfr P1 这样的寄存器
比如
P46 P47 P30 P31 P32 P33 P34 P35
由于这些引脚寄存器的地址有一部分不是连续性的,
无法使用 官方头文件中sfr 直接使用


我才想到使用结构体,或者链表的思路
在实践整合过程中,我发现bit指针直接会报错


喜欢研究如何让电子产品变得更加智能和有趣.
回复

使用道具 举报 送花

已绑定手机

51

主题

2744

回帖

9547

积分

论坛元老

积分
9547
发表于 2023-3-14 09:34:23 | 显示全部楼层
bit是C51/C251编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。
回复

使用道具 举报 送花

10

主题

70

回帖

5080

积分

论坛元老

单片机编程魔法师

积分
5080
 楼主| 发表于 2023-3-14 09:42:29 | 显示全部楼层
乘风*** 发表于 2023-3-14 09:34
bit是C51/C251编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。 ...

原来如此,又学到了.
喜欢研究如何让电子产品变得更加智能和有趣.
回复

使用道具 举报 送花

189

主题

1427

回帖

5560

积分

荣誉版主

积分
5560
发表于 2023-3-14 11:10:13 | 显示全部楼层
这个问题的本质是在8051和80251的指令中,BIT指令只有“直接寻址模式”(就是BIT地址直接写在机器码中),没有“间接寻址模式”(BIT地址在寄存器中,比如R0中)可以用@R0这种指令来实现动态指针寻址。未来采用80251扩展指令集的STC32系列单片机,由于地址空间足够,会通过位带的方式将BIT映射到存储空间,那时专门支持STC单片机的编译器就会支持BIT指针,实现楼主希望的BIT变量指针数组
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2023-3-14 11:45:43 | 显示全部楼层
这个 STC32的强大的位寻址,有无限的想象力啊
回复

使用道具 举报 送花

10

主题

70

回帖

5080

积分

论坛元老

单片机编程魔法师

积分
5080
 楼主| 发表于 2023-3-14 13:06:06 | 显示全部楼层
杨*** 发表于 2023-3-14 11:10
这个问题的本质是在8051和80251的指令中,BIT指令只有“直接寻址模式”(就是BIT地址直接写在机器码中), ...

到了那时,STC 的灵活性,扩展性.将踏入一个新的里程碑.
喜欢研究如何让电子产品变得更加智能和有趣.
回复

使用道具 举报 送花

14

主题

1423

回帖

7871

积分

论坛元老

积分
7871
发表于 2023-3-14 16:12:11 | 显示全部楼层
t1*** 发表于 2023-3-14 09:30
你发的这个图  不是简单的模式切换吗?  

我想实现的是  将不同地址IO口进行整合

你可以用这样的程序。

  1. sbit code0=P4^6;                       //定义数据端口
  2. sbit code1=P4^7;
  3. sbit code2=P3^0;
  4. sbit code3=P3^1;
  5. sbit code4=P3^2;
  6. sbit code5=P3^3;
  7. sbit code6=P3^4;
  8. sbit code7=P3^5;      
  9. void PX(uchar i)                           //写入8位数据
  10. {   
  11.         code0=i&0x01;i>>=1;      
  12.         code1=i&0x01;i>>=1;
  13.         code2=i&0x01;i>>=1;
  14.         code3=i&0x01;i>>=1;
  15.         code4=i&0x01;i>>=1;
  16.         code5=i&0x01;i>>=1;
  17.         code6=i&0x01;i>>=1;
  18.         code7=i&0x01;
  19. }
  20. PX(Data);                //传递数据
复制代码
回复

使用道具 举报 送花

10

主题

70

回帖

5080

积分

论坛元老

单片机编程魔法师

积分
5080
 楼主| 发表于 2023-3-14 17:56:47 | 显示全部楼层
angm*** 发表于 2023-3-14 16:12
你可以用这样的程序。

:handshake受教了
喜欢研究如何让电子产品变得更加智能和有趣.
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-23 16:14 , Processed in 0.082223 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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