首页 新闻 会员 周边 捐助

数码管位选问题

0
悬赏园豆:10 [已解决问题] 解决于 2023-06-27 09:55

我编写了一段代码想要实现四个两位数码管的显示,共八个位选,分为上下两组,结果发现选中上边(下边)一组任意一个位选,上边(下边)一组的位选全部被选中(低电平选中,段选也是低电平选中)每一段显示没问题,这是代码的问题还是硬件有问题?求解答
代码如下所示:
GPIO_InitStruct.Pin = A_PIN|B_PIN|C_PIN|D_PIN|E_PIN|F_PIN|DP2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
gpio_WRITE(GPIOA,A_PIN|B_PIN|C_PIN|D_PIN|E_PIN|F_PIN|DP2_PIN,SET);

GPIO_InitStruct.Pin = A2_PIN|B2_PIN|C2_PIN|G_PIN|DP_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
gpio_WRITE(GPIOB,A2_PIN|B2_PIN|C2_PIN|G_PIN|DP_PIN,SET);

GPIO_InitStruct.Pin = D2_PIN|E2_PIN|F2_PIN|G2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
gpio_WRITE(GPIOD,D2_PIN|E2_PIN|F2_PIN|G2_PIN,SET);

GPIO_InitStruct.Pin = BS2_1_PIN|BS2_2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
gpio_WRITE(GPIOA,BS2_1_PIN|BS2_2_PIN,SET);

GPIO_InitStruct.Pin = BS1_PIN|BS2_PIN|BS3_PIN|BS4_PIN|BS2_3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
gpio_WRITE(GPIOB,BS1_PIN|BS2_PIN|BS3_PIN|BS4_PIN|BS2_3_PIN,SET);

GPIO_InitStruct.Pin = BS2_4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
gpio_WRITE(GPIOC,BS2_4_PIN,SET);
小白熬夜写不出来的主页 小白熬夜写不出来 | 初学一级 | 园豆:167
提问于:2023-06-25 17:51
< >
分享
最佳答案
0

这段代码看起来没啥大问题,但是要注意以下几点:

1.首先,检查每个引脚的连接,确保它们正确连接到数码管的位选端口。
2.在使用 GPIO 控制数码管之前,需要先初始化对应的 GPIO 端口。
3.在初始化 GPIO 端口时,需要设置正确的引脚编号和模式。
4.逐个设置每个位选引脚并观察结果。例如,先将上边第一组的位选引脚都设置为高电平,然后观察下边的位选引脚是否也被选中。然后再将上边第一组的位选引脚都设置为低电平,观察结果是否符合预期。重复这个过程,依次测试每个位选引脚。
5.在控制数码管时,需要注意段选和位选的对应关系。
6.在控制数码管时,需要注意低电平选中的问题。
7.如果在设置某个位选引脚时,其他位选引脚也被选中了,那么可能有电路连接错误或者硬件问题。检查每个引脚的电路连接,确保没有并联或错误连接。
8.如果设置引脚的操作没有问题,那么可能是代码中其他地方的设置导致了问题。检查其他可能设置位选的地方,确保没有重复设置。

你在初始化 GPIO 端口时,将所有的位选都设置为低电平选中,因此上边(下边)一组的所有位选都会被选中。如果你想要独立控制每个位选,你需要将每个位选的引脚都设置为独立输出模式,并且设置不同的电平。

你在控制数码管时,没有使用具体的段选引脚来控制数码管的显示。如果你想要显示数字,你需要将对应的段选引脚设置为高电平选中。

收获园豆:10
lanedm | 老鸟四级 |园豆:2396 | 2023-06-25 19:35

独立控制每个位选的时候这个独立输出模式是怎么设置的,不明白我该怎么做

小白熬夜写不出来 | 园豆:167 (初学一级) | 2023-06-26 08:55

@小白熬夜写不出来: 要独立控制每个位选引脚,你需要将每个引脚都设置为独立的输出模式,并设置不同的电平。下面是一个示例代码,演示如何独立控制每个位选引脚:

// 设置位选引脚为独立输出模式
GPIO_InitStruct.Pin = BS1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

// 设置每个位选引脚的电平
HAL_GPIO_WritePin(GPIOB, BS1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, BS2_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, BS3_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, BS4_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, BS2_3_PIN, GPIO_PIN_RESET);

在上面的示例中,我们使用了HAL_GPIO_Init()函数将每个位选引脚设置为独立的输出模式。然后,使用HAL_GPIO_WritePin()函数将每个引脚的电平设置为相应的值,以控制位选引脚的选中状态。
请注意,上述示例代码是基于HAL库的,如果你使用的是其他库或者平台,可能会有所不同,但基本原理是相同的。你需要根据你使用的库和平台进行相应的调整。

lanedm | 园豆:2396 (老鸟四级) | 2023-06-26 08:57

@lanedm: 经过以下操作之后,BS2,3,4还是全都亮起来了,是我设置的问题吗?
我在主函数中写了以下代码:
gpio_WRITE(GPIOB,BS1_PIN,RESET);
gpio_WRITE(GPIOA,A_PIN,RESET);
设置的独立输出为:
GPIO_InitStruct.Pin = BS1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB,BS1_PIN,GPIO_PIN_SET);

GPIO_InitStruct.Pin = BS2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB,BS2_PIN,GPIO_PIN_RESET);

GPIO_InitStruct.Pin = BS3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB,BS3_PIN,GPIO_PIN_RESET);

GPIO_InitStruct.Pin = BS4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB,BS4_PIN,GPIO_PIN_RESET);

GPIO_InitStruct.Pin = BS2_1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA,BS2_1_PIN,GPIO_PIN_SET);

GPIO_InitStruct.Pin = BS2_2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA,BS2_2_PIN,GPIO_PIN_RESET);

GPIO_InitStruct.Pin = BS2_3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB,BS2_3_PIN,GPIO_PIN_RESET);

GPIO_InitStruct.Pin = BS2_4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
   HAL_GPIO_WritePin(GPIOC,BS2_4_PIN,GPIO_PIN_RESET);

段选:
GPIO_InitStruct.Pin = A_PIN|B_PIN|C_PIN|D_PIN|E_PIN|F_PIN|DP2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOA,A_PIN|B_PIN|C_PIN|D_PIN|E_PIN|F_PIN|DP2_PIN,GPIO_PIN_SET);

GPIO_InitStruct.Pin = A2_PIN|B2_PIN|C2_PIN|G_PIN|DP_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB,A2_PIN|B2_PIN|C2_PIN|G_PIN|DP_PIN,GPIO_PIN_SET);

GPIO_InitStruct.Pin = D2_PIN|E2_PIN|F2_PIN|G2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOD,D2_PIN|E2_PIN|F2_PIN|G2_PIN,GPIO_PIN_SET);
小白熬夜写不出来 | 园豆:167 (初学一级) | 2023-06-26 09:48

@小白熬夜写不出来: 根据你提供的代码,注意到在设置独立输出模式之后,你第一次对BS1_PIN使用了HAL_GPIO_WritePin(GPIOB,BS1_PIN,GPIO_PIN_SET);来设置电平为高,而后面的位选引脚BS2_PINBS3_PINBS4_PIN以及BS2_3_PIN都被同时设置为低电平。

这可能导致BS1_PIN被选中,而后面的位选引脚也同时被选中,导致它们全都亮起来。

要独立控制每个位选引脚,你应该在设置独立输出模式之后再对每个引脚进行电平设置。例如,你可以根据需要设置每个位选引脚的电平,示例代码如下:

gpio_WRITE(GPIOB,BS1_PIN,RESET);
gpio_WRITE(GPIOA,A_PIN,RESET);

// 设置位选引脚为独立输出模式
GPIO_InitStruct.Pin = BS1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BS2_4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

// 设置每个位选引脚的电平
HAL_GPIO_WritePin(GPIOB,BS1_PIN,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,BS2_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,BS3_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,BS4_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,BS2_1_PIN,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,BS2_2_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,BS2_3_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,BS2_4_PIN,GPIO_PIN_RESET);

在这个示例代码中,我将电平设置移到了初始化之后,以确保每个位选引脚的电平能够正确地被设置。

lanedm | 园豆:2396 (老鸟四级) | 2023-06-26 09:53
其他回答(1)
0

根据你提供的代码,首先检查硬件连接是否正确。确保每个数字管段(A_PIN、B_PIN、C_PIN、等等)都正确连接到相应的引脚,并且位选引脚(BS1_PIN、BS2_PIN、等等)也正确连接。

在代码方面,你使用了GPIO的初始化和写入操作。确保你的GPIO初始化和写入操作与你的硬件连接一致。

此外,你的代码片段没有展示任何与位选引脚相关的设置。如果位选引脚是共阳(共阳数码管)或共阴(共阴数码管),你需要根据硬件规格正确设置这些引脚。

最后,确保你的GPIO库或驱动程序与你使用的硬件兼容,并且已正确初始化。

如果你确认硬件连接正确,并且代码没有明显的问题,那么可能是硬件存在问题。你可以检查硬件电路、引脚连接、电源供应等方面,或者尝试在其他硬件上运行相同的代码,以确定问题的根源。

如果你需要更具体的帮助,请提供更多关于硬件配置和问题描述的信息。

Technologyforgood | 园豆:7231 (大侠五级) | 2023-06-25 23:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册