在嵌入式 c 中使用单个名称访问不同的端口引脚



我有 6 个 LED 连接到微控制器的不同端口。说

LED0 -> P1.0

LED1 -> P1.3

LED2 -> P1.2

LED3 -> P2.0

LED4 -> P3.0

LED5 -> P4.1

有什么方法可以将不同的地址映射到一个名称吗?

假设LED_DATA = 0xFF应该为所有相应的LED引脚分配HIGH。最好必须在不使用函数的情况下完成,也不像下面的函数

#define ( LED_DATA = a ) ( function(a) )

有没有其他方法可以使用结构、联合、内存映射或类似的东西来做到这一点?

我建议不要使用宏或直接访问。
最好写一个函数,它封装了完整的 LED 处理。

void led_set(unsigned char ledNo, unsigned char mode)
{
  switch (ledNo)
  {
    case 0:
      P1.0 = mode;
      break;
    ...
  }
}
void led_set_mask(unsigned char bitmask)
{
  for (i=0; i< 8; i++)
  {
     led_set(i, bitmask & ( 1 << i) );
  }
}

只有在您需要非常快速或经常访问LED引脚的情况下,宏才更好。

澄清一下; 您似乎想在这里将不同端口上的多个引脚映射到单个变量?

这在C++中可以很容易地完成,但在 C 中则不然。 在C++中,您将创建一个重载赋值运算符的类,以便在赋值时,运行一个函数来提取位并将其分配给关联的引脚。 然而,即使这是语法糖,它仍然运行一个函数,它只是在语法上与正常的赋值相同。

我不知道

是否有办法完全按照您的要求 - 在没有映射函数的情况下为非顺序内存区域分配一个名称。 我认为你能做的最好的事情就是尽量减少你在上述功能上花费的时间。

根据实时要求和您对携带全局状态的容忍度,您可以定义一个全局变量,例如 unsigned char g_led_data;,并分配各个 LED 状态,例如使用g_led_data &= 0xef;指示您要关闭 LED4。 然后从主循环中,您可以调用一个函数,该函数将值从g_led_data写入硬件:

/* Call this from the main loop. */
void update_leds( void )
{
  P1.0 = ( g_led_data & 0x01 );
  P1.3 = ( g_led_data & 0x02 ) >> 1;
  ...
}

此方法的优点是,它可以最大限度地减少在函数调用中设置 LED 值所花费的时间 - 每次主循环迭代时只调用一次函数,而不是每次代码设置特定 LED 的值时调用函数。 缺点是上述对实时性能的影响,现在您必须携带更多的全局状态。

最新更新