结构体中不允许定义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;
}
}
散乱的IO口进行统一管理的方法:
国学芯用 发表于 2023-3-14 09:04
散乱的IO口进行统一管理的方法:
你发的这个图不是简单的模式切换吗?
我想实现的是将不同地址IO口进行整合
变成一个类似于sfr P1 这样的寄存器
比如
P46 P47 P30 P31 P32 P33 P34 P35
由于这些引脚寄存器的地址有一部分不是连续性的,
无法使用 官方头文件中sfr 直接使用
我才想到使用结构体,或者链表的思路
在实践整合过程中,我发现bit指针直接会报错
bit是C51/C251编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。 乘风飞扬 发表于 2023-3-14 09:34
bit是C51/C251编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。 ...
原来如此,又学到了. 这个问题的本质是在8051和80251的指令中,BIT指令只有“直接寻址模式”(就是BIT地址直接写在机器码中),没有“间接寻址模式”(BIT地址在寄存器中,比如R0中)可以用@R0这种指令来实现动态指针寻址。未来采用80251扩展指令集的STC32系列单片机,由于地址空间足够,会通过位带的方式将BIT映射到存储空间,那时专门支持STC单片机的编译器就会支持BIT指针,实现楼主希望的BIT变量指针数组
这个 STC32的强大的位寻址,有无限的想象力啊 杨为民 发表于 2023-3-14 11:10
这个问题的本质是在8051和80251的指令中,BIT指令只有“直接寻址模式”(就是BIT地址直接写在机器码中), ...
到了那时,STC 的灵活性,扩展性.将踏入一个新的里程碑. 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); //传递数据
angmall 发表于 2023-3-14 16:12
你可以用这样的程序。
:handshake受教了
页:
[1]
2