行傳遞的,一個(gè)數(shù)組的數(shù)組名表示該數(shù)組的首地址,在用數(shù)組名作為函數(shù)的調(diào)用參數(shù)時(shí),它 的傳遞方式是采用了地址傳遞,就是將實(shí)際參數(shù)數(shù)組的首地址傳遞給函數(shù)中的形式參數(shù)數(shù) 組,這個(gè)時(shí)候?qū)嶋H參數(shù)數(shù)組和形式參數(shù)數(shù)組實(shí)際上是使用了同一段內(nèi)存單元,當(dāng)形式參數(shù)數(shù)組在 函數(shù)體中改變了元素的值,同時(shí)也會(huì)影響到實(shí)際參數(shù)數(shù)組,因?yàn)樗鼈兪谴娣旁谕粋€(gè)地址的。 上面的例子同時(shí)還使用到字符數(shù)組。字符數(shù)組中每一個(gè)數(shù)據(jù)都是一個(gè)字符,這樣一個(gè)一 維的字符數(shù)組就組成了一個(gè)字符串,在 C 語言中字符串是以字符數(shù)組來表達(dá)處理的。為了 能測定字符串的長度,C 語言中規(guī)定以‘\o’來做為字符串的結(jié)束標(biāo)識(shí),編譯時(shí)會(huì)自動(dòng)在字 符串的最后加入一個(gè)‘\o’,那么要注意的是如果用一個(gè)數(shù)組要保存一個(gè)長度為 10 字節(jié)的字 符串則要求這個(gè)數(shù)組至少能保存 11 個(gè)元素?!甛o’是轉(zhuǎn)義字符,它的含義是空字符,它的 ASCII 碼為 00H,也就是說當(dāng)每一個(gè)字符串都是以數(shù)據(jù) 00H 結(jié)束的,在程序中操作字符數(shù) 據(jù)組時(shí)要注意這一點(diǎn)。字符數(shù)組除了能對(duì)數(shù)組中單個(gè)元素進(jìn)行訪問,還能訪問整個(gè)數(shù)組, 其實(shí)整個(gè)訪問字符數(shù)組就是把數(shù)組名傳到函數(shù)中,數(shù)組名是一個(gè)指向數(shù)據(jù)存放空間的地址指 針,函數(shù)根據(jù)這個(gè)指針和‘/o’就能完整的操作這個(gè)字符數(shù)組。對(duì)于這一段所說的,能 參看下面一例 1602LCD 顯示模塊的驅(qū)動(dòng)演示例子進(jìn)行理解。這里要注意就是能用單個(gè)字
符數(shù)組元素來進(jìn)行運(yùn)算,但不能用整個(gè)數(shù)組來做運(yùn)算,因?yàn)閿?shù)組名是指針而不是數(shù)據(jù)。
/*============================================================
使用 1602 液晶顯示的實(shí)驗(yàn)例子 明浩 2004/2/27
==============================================================
SMC1602A(16*2)模擬口線接線方式 連接線圖:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
---------------------------------------------|
|DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 |
|DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1 |
|DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
|DB3-----P1.3 | DB7-----P1.7 | VLCD 接 1K 電阻到 GND|
---------------------------------------------------
[注:AT89S51 使用 12M 晶體震蕩器]
=============================================================*/
#define LCM_RW P2_0 //定義引腳
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Busy 0x80 //用于檢測 LCM 狀態(tài)字中的 Busy 標(biāo)識(shí)
#include
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void); void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code cdle_net[] = {"www.51hei.com"};
unsigned char code email[] = {"pnzwzw@51hei.com"};
void main(void)
{
Delay400Ms(); //啟動(dòng)等待,等 LCM 講入工作狀態(tài)
LCMInit(); //LCM 初始化
Delay5Ms(); //延時(shí)片刻(可不要)
DisplayListChar(0, 0, cdle_net); DisplayListChar(0, 1, email); ReadDataLCM();//測試用句無意義 while(1);
}
//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙 LCM_Data = WDLCM; LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶體震蕩器速度太高能在這后加小的延時(shí)
LCM_E = 0; //延時(shí)
LCM_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC 為 0 時(shí)忽略忙檢測
{
if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0;
LCM_E = 0;
LCM_E = 0; LCM_E = 1;
}
//讀數(shù)據(jù)
unsigned char ReadDataLCM(void)
{
LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data);
}
//讀狀態(tài)
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;
while (LCM_Data & Busy); //檢測忙信號(hào)
return(LCM_Data);
}
void LCMInit(void) //LCM 初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號(hào)
Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms();
WriteCommandLCM(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號(hào)
電子發(fā)燒友App














評(píng)論