『壹』 使用KEIL4 編模塊化編程的時候 為什麼在C文件中定義的數組編譯能通過 把數組放到頭文件H裡面就不行了呢
這些錯誤都是有重復的公共定義。
「我把它放到ds1302.h裡面怎麼就不行了呢」
原來的刪掉了嗎?不會在頭文件和程序文件中同時都有吧?
另外樓主,你那個mian.c文件的命名真的很別扭……
『貳』 如何寫在keil中寫單片機的模塊化的程序
首先要會編寫滿足使用要求的程序,在此基礎上,把一些功能獨立的子程序單獨編成一個源文件,這些源文件里的子程序一旦試驗成功,以後就不需修改,也不需復制粘貼,只管整體添加即,源文件可能工巧匠比較長,為便於查找,可編一個頭文件將這些子程序聲明一下,然後在主程序包含這個頭文件即可,如液晶屏1602的驅動函數,寫命令 寫數據 初始化函數 甚至再編寫一些常用的字元串顯示函數,整型數據顯示函數,都有可以單獨作為一個源文件 還有EEPROM操作的相關函數,跟其它部分聯系較少,也可以單獨編成源文件, 子程序比較少的源文件可以直接引用,為便於查找,子程序多的模塊都有要有頭文件和該源文件對應,以下是我封裝的STC單片機內部的EEPROM操作的頭文件和源文件,跟其它部分就沒什麼聯系,因此作為一個獨立模塊 頭文件eeprom.h如下:
ifndef __EEPROM_H__
#define __EEPROM_H__
#define uchar unsigned char
#define uint unsigned int
//擦除片內EEPROM的一個扇區 這些函數在此只是聲明一下,實體在源文件中
void eepromEraseSector (uint address);
void eepromWrite(uint address, uchar write_data);
//讀取STC單片機內部EEPROM的一個位元組
uchar eepromRead(uint address);
#endif
源文件eeprom.c 如下,裡面的幾個子函數都是STC單片機說明文檔里有的,不需要任何修改,只管調用,所以平時我們只看頭文件就行了
#include<STC12C54.H>
#define uchar unsigned char
#define uint unsigned int
//擦除片內EEPROM的一個扇區
void eepromEraseSector (uint address)
{
uchar ii;
ISP_ADDRL=address;
ISP_ADDRH=address>>8;
ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x82; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
ISP_CMD=0x03;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
for(ii=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
//對STC片內EEPROM的指定地址寫入數據(即,位元組編程)
void eepromWrite(uint address, uchar write_data)
{
uchar ii;
ISP_DATA=write_data;
ISP_ADDRL=address;
ISP_ADDRH=address>>8;
ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x82; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
ISP_CMD=0x02;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
for(ii=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
//讀取STC單片機內部EEPROM的一個位元組
uchar eepromRead(uint address)
{
uchar ii,z;
ISP_ADDRL=address;
ISP_ADDRH=address>>8;
//ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x82; // 0x80 if SYS
ISP_CMD=0x01;//讀命令切記哦
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
for(ii=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
z=ISP_DATA;
return(z);
}
『叄』 keil C編程,模塊化有警告,求解答
keyscan這個函數有聲明、無實體。
你需要把keyscan.c文件添加到項目中,同時在keyscan.h頭文件中的函數聲明前面應當加上extern,這樣外部模塊才能正確調用。
『肆』 C語言keil模塊化 編程 需要注意哪些
模塊化編程是指將一個龐大的程序劃分為若干個功能獨立的模塊,對各個模塊進行獨立開發,然後再將這些模塊統一合並為一個完整的程序。這是C語言面向過程的編程方法,可以縮短開發周期,提高程序的可讀性和可維護性。
在單片機程序里,程序比較小或者功能比較簡單的時候,我們不需要採用模塊化編程,但是,當程序功能復雜、涉及的資源較多的時候,模塊化編程就能體現它的優越性了。如前面我們寫過的HT1380驅動程序、獨立按鍵掃描程序和12864程序,每一個程序都是只用一個源文件編寫就能完成,但是,當您製作一個12864液晶日歷的時候,需要用到HT1380驅動程序、獨立按鍵掃描程序和12864顯示程序,如果把這三個程序全部集中在一個源文件里,將導致主體程序臃腫且雜亂,這樣做並非不可取,只是降低了程序可讀性、可維護性和代碼的重用率。如果把這三個程序當做三個獨立的模塊放到你的主體工程進行模塊化編程,效果就不一樣了。
實際上,模塊化編程就是模塊合並的過程,就是建立每個模塊的頭文件和源文件並將其加入到主體程序的過程。主體程序調用模塊的函數是通過包含模塊的頭文件來實現,模塊的頭文件和源文件是模塊密不可分的兩個部分,缺一不可。所以,模塊化編程必須提供每個模塊的頭文件和源文件。下面我們以一個簡單的例子(主體程序實現指示燈閃爍,延時模塊實現延時功能)來演示模塊化編程。
有些程序員為了省事,只建立模塊的源文件,不建立頭文件,在主體工程里直接將源文件包含進來,建議大家不要採取這樣的做法,這是一種不符合C語言標準的做法,是一種冒險方法。只包含一個源文件可能沒事,同時包含多個源文件的時候問題就會出現。
『伍』 關於51單片機C語言KEIL模塊化編程
主程序中只能添加頭文件,
樓主可以把C文件做成頭文件格式,這樣可以直接調用,不用再添加C文件了
『陸』 keil關於模塊化編程中的位定義
你說的不完整,不太明白你的意思。不過你放在自建的頭文件里定義成全部變數,在兩個模塊中都包含進頭文件,行嗎?
又看了一遍你的問題,有點明白了。你的問題就是要把SCLK=P1^2的定義放在頭文件里,還是放在.C文件里。你的問題與模塊化編程沒有一點關系,所以叫人看糊塗了。放在哪裡都成。頭文件里、C文件里都可以。
『柒』 keil c 模塊化編程中 位定義的問題
你這是在main.c中定義的 LCD_RS 在LCD_DISPLAY.c 這個文件中找不到LCD_RS的定義
你可以把它定義在LCD_DISPLAY.c這個文件中 然後在LCD_DISPLAY.c中包含LCD_DISPLAY.H
還有就在在main.c不用包含LCD_DISPLAY.c的 把LCD_DISPLAY.c添加到項目中就可以了
『捌』 msp430的IAR能不能和keil c 一樣,模塊化編程
用IAR寫MSP軟體我沒試過,但用IAR寫ARM代碼我做過,與KEIL C是一樣的。在我想來,只要是C代碼,都能一一對應的。
另外,注意在工程中增加C文件。
『玖』 以前寫了一個比較長的程序,用KEIL編譯是可行通過的,現學習C語言模塊化編程,從將其模塊化,但碰到
對於比較小的程序,一般只有一個c文件和一個頭文件,全局變數我們通常會直接定義在c文件中,在程序之前加int i定義。如果要在頭文件中定義有以下兩種方法:用extern來聲明:extern int i;這一句只是對變數i進行聲明,在c文件的程序之前必須加上int i進行定義。extern int i=0;這一句聲明和定義都做了。
對於大一點的程序,有很多c文件和頭文件,這個時候全局變數就必須在頭文件中聲明(不需要初始化),然後在一個c文件中定義(該初始化的要初始化)。如果在頭文件中定義,則編譯的時候會出現重復定義的錯誤。如果只有頭文件中聲明就會出現沒有定義有警告。
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: K
MODULE: 222.obj (222)
出現上述錯誤則是因為變數k重復定義,把你的頭文件中的變數定義前加extern(只是變數聲明不用初始化),再在某一個你要調用該變數的c文件的程序之前再定義(注意第一個調用的c文件要負責附帶初始化該變數,其他調用的c文件就不需要初始化過程啦)
『拾』 使用keil進行模塊化編程時,對I/O口的定義寫在c文件裡面還是h頭文件裡面比較好啊
sbit這樣的埠定義建議放在.h頭文件中。
對於多個源文件的項目而言,這是必然的選擇。