這是很好的,你的重點是模塊化。它不僅會帶給你可重用性,而且還會使調試變得更容易。
命名約定
你是對的。對於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本身的小程序。它有幾個目的。
- 它遵循Test-driven_development,這是一件好事。
- 它通過顯示一個功能示例提供了基本的文檔形式。
- 將來,您的LCD可能會突然停止工作。只需調用這段代碼,看看會發生什麼。如果測試有效,您知道您的最新更改以某種方式打破了LCD功能。如果沒有,你知道問題出在LCD本身或者它與PIC之間的連接上。
祝你好運!
感謝您花時間提供這種優秀的回覆,將採取您的方法。亞歷克斯問候 – Alex2134