我有6个LED连接到微控制器的不同端口。说
LED0 - > P1.0
LED1 - > P1.3
LED2 - > P1.2
LED3 - > P2.0
LED4 - > P3.0
LED5 - > P4.1
有什么办法可以将不同的地址映射到一个名字吗?
假设 LED_DATA = 0xFF 应将 HIGH 分配给所有相应的LED引脚。优选地,它必须在不使用函数的情况下完成,并且也不像下面的那样
#define ( LED_DATA = a ) ( function(a) )
还有其他方法可以使用struct,union,memory mapping或类似的东西吗?
答案 0 :(得分:4)
我建议不要使用宏或直接访问 最好编写一个函数,它封装了完整的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引脚的情况下,宏才会更好。
答案 1 :(得分:3)
澄清;你似乎想在这里将不同端口上的多个引脚映射到一个变量?
这可以在C ++中轻松完成,但不能在C中完成。在C ++中,您将创建一个重载赋值运算符的类,以便在赋值时,运行一个提取位并将它们分配给关联的函数。引脚。然而,即使这是语法糖,它仍然运行一个函数,它只是在语法上与正常赋值相同。
答案 2 :(得分:2)
我不知道是否有办法完全按照自己的意愿行事 - 在没有映射功能的情况下为非顺序内存区域分配单个名称。我认为你能做的最好的事情就是把你花在这个功能上的时间减少到最少。
根据实时要求和承载全局状态的容差,您可以定义一个全局变量,例如: 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的价值。缺点是前面对实时性能的影响,现在你必须携带更多的全局状态。