新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 將16X2 LCD連接到AVR微控制器

將16X2 LCD連接到AVR微控制器

作者: 時(shí)間:2023-04-28 來源:電子產(chǎn)品世界 收藏

本節(jié)課完全是關(guān)于(ATMEGA 16)與16X2 的接口問題。Atmega16屬于系列。

本文引用地址:http://m.butianyuan.cn/article/202304/446098.htm

電路解釋:

這與與8051或PIC的接口方式?jīng)]有什么不同。水晶振蕩器將向微控制器提供時(shí)鐘。連接在晶體上的電容將作為過濾器,幫助晶體產(chǎn)生共振,并以平行共振的方式進(jìn)行振蕩。

 連接到的3號和2號引腳的電位器將有助于調(diào)整LCD的對比度。LCD的4、5和6個(gè)引腳,即寄存器選擇、讀/寫和啟用引腳,與Atmega16的PD0、PD1和PD2引腳相連。LCD的數(shù)據(jù)引腳與Atmega16的33至40引腳相連。

對ATMEGA16進(jìn)行編程,以便與16X2 LCD連接:

你可以從8051單片機(jī)的16×2接口一文中得到LCD的簡要信息。正如我前面所說的,編程的基本原理都是一樣的,就是使用微控制器的引腳和寄存器。

非常重要的是如何向LCD發(fā)送數(shù)據(jù)以及如何向LCD發(fā)送命令,假設(shè)你要向LCD發(fā)送數(shù)據(jù),那么你必須在發(fā)送數(shù)據(jù)之前將16×2 LCD的ENABLE引腳調(diào)為低電平,當(dāng)你認(rèn)為你要發(fā)送的數(shù)據(jù)已經(jīng)準(zhǔn)備好時(shí),再將ENABLE引腳調(diào)為高電平,用編碼語言表示為1。如果你把ENABLE引腳變成高電平,那么只有LCD會工作。

 僅僅使ENABLE引腳為高電平是不行的,你必須使REGISTER SELECT引腳(RS引腳)也為高電平,這樣LCD才會接受必須在LCD屏幕上顯示的正常數(shù)據(jù),如果你忘記使RS引腳為高電平,它最終會認(rèn)為用戶在向它發(fā)送命令,并使它自己準(zhǔn)備好根據(jù)命令行事,如使光標(biāo)移動、清除LCD上的數(shù)據(jù)、改變光標(biāo)位置等等。

 最后但并非最不重要的是另一個(gè)你需要擔(dān)心的針腳--讀/寫針腳,我們都知道任何設(shè)備的基本功能都是從讀和寫開始的,讀數(shù)據(jù)和寫數(shù)據(jù)是任何外圍設(shè)備或系統(tǒng)的主要和重要功能。

僅僅發(fā)送數(shù)據(jù)和顯示數(shù)據(jù)并不能完成任務(wù);以可理解的方式安排數(shù)據(jù)是程序員的重要和關(guān)鍵任務(wù)。你可以在LCD中安排數(shù)據(jù)或使LCD按照你的愿望工作,可以通過向LCD發(fā)送命令或特殊功能來完成,你可能會想,LCD需要什么類型的命令,光標(biāo)位置的命令,增加或減少對比度,使光標(biāo)改變行,如從第一行到第二行等等。 為了向LCD發(fā)送命令,你需要使引腳變成高電平和低電平,就像發(fā)送數(shù)據(jù)一樣。為了發(fā)送命令,你需要使ENABLE針腳為高電平,REGISTER SELECT針腳(RS針腳)為低電平,也就是程序員所說的0,而讀/寫針腳(R/W針腳)為高電平,你需要記住這個(gè)配置來發(fā)送命令。

在顯示數(shù)據(jù)時(shí),程序員一般使用不同的命令和它們的十六進(jìn)制代碼。

1682650753904628.png

如果我們想簡單說說在LCD上顯示數(shù)據(jù)的情況

E=1;使能引腳應(yīng)該是高電平

RS=1;寄存器選擇應(yīng)該是高電平

R/W=0;讀/寫引腳應(yīng)該為低電平。

對于向LCD發(fā)送命令

E=1;使能引腳應(yīng)該為高電平

RS=0;寄存器選擇應(yīng)該是低電平

R/W=1;讀/寫引腳應(yīng)該為高電平。

當(dāng)你傳遞一個(gè)字符串時(shí),最好使用一個(gè)字符串指針并遞增這個(gè)指針,如果你遞增一個(gè)指針,它將自動進(jìn)入變量的下一個(gè)地址,你可以在其中存儲你想顯示的字符。請看下面的例子。

void write_string(unsigned char *str)   //store address value of the string in pointer *str

{


int i=0;


while(strng[i]!=’