t176 发表于 2023-3-14 08:28:04

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

写一个链表准备管理散乱的引脚,   结构体中 bit *pin;   咋不支持啊,应该如何改正
STC官方的文档,也没找到关于对散乱的IO口进行统一管理的方法

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

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




#include <STC32G.H>

//定义链表节点的结构体:
//其中,bit *pin表示指向引脚的指针,struct node *next表示指向下一个节点的指针。


typedef struct node {
    bit *pin;             // 指向引脚的指针
    struct node *next;    // 指向下一个节点的指针
} Node;

Node *head = NULL;

void addNode(bit *pin) {
    Node *newNode = (Node *) malloc(sizeof(Node));    // 分配新节点内存
    newNode->pin = pin;    // 设置新节点的引脚指针
    newNode->next = head;    // 将新节点的next指针指向当前的头节点
    head = newNode;    // 将头指针指向新节点
}


void main() {
    bit *pin1 = &P10;
    bit *pin2 = &P41;
    bit *pin3 = &P52;
   
    addNode(pin1);
    addNode(pin2);
    addNode(pin3);
   
    // 遍历链表并访问每个引脚
    Node *currentNode = head;
    while (currentNode != NULL) {
      *(currentNode->pin) = 1;    // 将引脚设置为高电平
      currentNode = currentNode->next;
    }
}






国学芯用 发表于 2023-3-14 09:04:23

散乱的IO口进行统一管理的方法:

t176 发表于 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指针直接会报错


乘风飞扬 发表于 2023-3-14 09:34:23

bit是C51/C251编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。

t176 发表于 2023-3-14 09:42:29

乘风飞扬 发表于 2023-3-14 09:34
bit是C51/C251编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。 ...

原来如此,又学到了.

杨为民 发表于 2023-3-14 11:10:13

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

神农鼎 发表于 2023-3-14 11:45:43

这个 STC32的强大的位寻址,有无限的想象力啊

t176 发表于 2023-3-14 13:06:06

杨为民 发表于 2023-3-14 11:10
这个问题的本质是在8051和80251的指令中,BIT指令只有“直接寻址模式”(就是BIT地址直接写在机器码中), ...

到了那时,STC 的灵活性,扩展性.将踏入一个新的里程碑.

angmall 发表于 2023-3-14 16:12:11

t176 发表于 2023-3-14 09:30
你发的这个图不是简单的模式切换吗?

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


你可以用这样的程序。

sbit code0=P4^6;                     //定义数据端口
sbit code1=P4^7;
sbit code2=P3^0;
sbit code3=P3^1;
sbit code4=P3^2;
sbit code5=P3^3;
sbit code6=P3^4;
sbit code7=P3^5;      

void PX(uchar i)                           //写入8位数据
{   
        code0=i&0x01;i>>=1;      
        code1=i&0x01;i>>=1;
        code2=i&0x01;i>>=1;
        code3=i&0x01;i>>=1;
        code4=i&0x01;i>>=1;
        code5=i&0x01;i>>=1;
        code6=i&0x01;i>>=1;
        code7=i&0x01;
}


PX(Data);                //传递数据

t176 发表于 2023-3-14 17:56:47

angmall 发表于 2023-3-14 16:12
你可以用这样的程序。

:handshake受教了
页: [1] 2
查看完整版本: 结构体中不允许定义bit 指针吗