希望有人可以提供帮助 - 为这个非常基本的问题道歉,但是我使用标准C为PIC微控制器的一些实验编写代码,而且我对C语言也很陌生。
我有各种逻辑代码组,例如控制LCD显示器的功能,我想让它可以重复用于基于PIC的项目,并想知道如何最好地分解这些逻辑代码组为了重新使用。
在LCD函数的例子中,我假设我将声明拆分为名为'lcd.h'的头文件(包括我的IDE的'Header Files'项目目录中)和include'lcd.c中的函数定义。 '(包括在我的IDE的'源文件'项目目录中) - 这是正确的吗?
以这种方式分解代码的命名约定是什么?例如,所有全局声明都应该在名为“main.h”的头文件中?
非常感谢, 亚历
答案 0 :(得分:4)
你专注于模块化是件好事。它不仅会为您带来可重用性,而且还可以使调试更容易。
你是对的。对于LCD功能,请创建文件lcd.c
和lcd.h
。没有通用的函数命名约定,但这是我使用的:
lcd.h
:
void LCD_PublicFunction(void);
lcd.c
:
static void PrivateFunction(void);
void LCD_PublicFunction(void)
{
// Function goes here
}
static void PrivateFunction(void)
{
// Function goes here
}
我在所有公共函数前放置一个LCD_
前缀,以防止命名空间冲突,并帮助我在任何时候找到函数的位置。 static
键盘会阻止lcd.c
以外的任何功能查看PrivateFunction
,并删除前缀以表示私有。
请避免全局变量。随着项目的增长,跟踪逻辑将变得更加困难。相反,使用getter和setter函数。
static int brightness;
void LCD_SetBrightness(int var)
{
brightness = var;
}
int LCD_GetBrightness(void)
{
return brightness;
}
这为您提供了更大的灵活性。也许你需要在每次设置亮度时添加一点逻辑。也许您希望变量是只读的,因此您可以删除setter。
尝试尽可能地分解您的项目。我假设您将使用某种串行端口与LCD通信。从LCD显示器固件中分解通信固件。
例如,如果它使用SPI,那么您应该创建spi.c
和spi.h
。
我看到这种做法太过分了。我见过人们在所有I / O端口周围设置功能,以便它们具有将数字引脚设置为高电平和低电平的功能。
错误的例子:
void IO_PortA7 (char val)
{
LATAbits.LATA7 = val;
}
除了添加一些语法糖,我还没有真正获得任何东西。只需在代码中使用LATAbits.LATA7
,因为它是在PIC上打开和关闭I / O的标准方法。
很好的例子:
void FX_SetBuzzer (char is_active)
{
LATAbits.LATA7 = is_active;
}
只需阅读代码,您就可以知道我已将蜂鸣器连接到A7针脚。此外,其余的代码并不关心我如何连接蜂鸣器,如果我必须将蜂鸣器移动到另一个引脚,我只需要进行一项更改。最后,通过使用变量名is_active
,我记录了蜂鸣器处于高电平状态的事实。我尝试使用所有布尔变量的问题来记住在真实条件下发生的事情。
最后一条建议。在每个.c
文件中,创建一个测试工具。
#ifdef LCD_TEST
int main(void)
{
// Enable LCD communication.
LCD_Init();
// Display friendly greeting.
LCD_Display("Hello, world!");
// Wait for power-down.
for(;;);
}
#endif
通过这种方式,您可以构建一个可以自行测试LCD的小程序。它有几个目的。