將16X2 LCD連接到AVR微控制器
本節(jié)課完全是關(guān)于AVR微控制器(ATMEGA 16)與16X2 LCD的接口問(wèn)題。Atmega16屬于AVR微控制器系列。
本文引用地址:http://2s4d.com/article/202304/446098.htm電路解釋?zhuān)?/strong>
這與LCD與8051或PIC微控制器的接口方式?jīng)]有什么不同。水晶振蕩器將向微控制器提供時(shí)鐘。連接在晶體上的電容將作為過(guò)濾器,幫助晶體產(chǎn)生共振,并以平行共振的方式進(jìn)行振蕩。
連接到LCD的3號(hào)和2號(hào)引腳的電位器將有助于調(diào)整LCD的對(duì)比度。LCD的4、5和6個(gè)引腳,即寄存器選擇、讀/寫(xiě)和啟用引腳,與Atmega16的PD0、PD1和PD2引腳相連。LCD的數(shù)據(jù)引腳與Atmega16的33至40引腳相連。
對(duì)ATMEGA16進(jìn)行編程,以便與16X2 LCD連接:
你可以從8051單片機(jī)的16×2接口一文中得到LCD的簡(jiǎn)要信息。正如我前面所說(shuō)的,編程的基本原理都是一樣的,就是使用微控制器的引腳和寄存器。
非常重要的是如何向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)為高電平,用編碼語(yǔ)言表示為1。如果你把ENABLE引腳變成高電平,那么只有LCD會(huì)工作。
僅僅使ENABLE引腳為高電平是不行的,你必須使REGISTER SELECT引腳(RS引腳)也為高電平,這樣LCD才會(huì)接受必須在LCD屏幕上顯示的正常數(shù)據(jù),如果你忘記使RS引腳為高電平,它最終會(huì)認(rèn)為用戶在向它發(fā)送命令,并使它自己準(zhǔn)備好根據(jù)命令行事,如使光標(biāo)移動(dòng)、清除LCD上的數(shù)據(jù)、改變光標(biāo)位置等等。
最后但并非最不重要的是另一個(gè)你需要擔(dān)心的針腳--讀/寫(xiě)針腳,我們都知道任何設(shè)備的基本功能都是從讀和寫(xiě)開(kāi)始的,讀數(shù)據(jù)和寫(xiě)數(shù)據(jù)是任何外圍設(shè)備或系統(tǒng)的主要和重要功能。
僅僅發(fā)送數(shù)據(jù)和顯示數(shù)據(jù)并不能完成任務(wù);以可理解的方式安排數(shù)據(jù)是程序員的重要和關(guān)鍵任務(wù)。你可以在LCD中安排數(shù)據(jù)或使LCD按照你的愿望工作,可以通過(guò)向LCD發(fā)送命令或特殊功能來(lái)完成,你可能會(huì)想,LCD需要什么類(lèi)型的命令,光標(biāo)位置的命令,增加或減少對(duì)比度,使光標(biāo)改變行,如從第一行到第二行等等。 為了向LCD發(fā)送命令,你需要使引腳變成高電平和低電平,就像發(fā)送數(shù)據(jù)一樣。為了發(fā)送命令,你需要使ENABLE針腳為高電平,REGISTER SELECT針腳(RS針腳)為低電平,也就是程序員所說(shuō)的0,而讀/寫(xiě)針腳(R/W針腳)為高電平,你需要記住這個(gè)配置來(lái)發(fā)送命令。
在顯示數(shù)據(jù)時(shí),程序員一般使用不同的命令和它們的十六進(jìn)制代碼。
如果我們想簡(jiǎn)單說(shuō)說(shuō)在LCD上顯示數(shù)據(jù)的情況
E=1;使能引腳應(yīng)該是高電平
RS=1;寄存器選擇應(yīng)該是高電平
R/W=0;讀/寫(xiě)引腳應(yīng)該為低電平。
對(duì)于向LCD發(fā)送命令
E=1;使能引腳應(yīng)該為高電平
RS=0;寄存器選擇應(yīng)該是低電平
R/W=1;讀/寫(xiě)引腳應(yīng)該為高電平。
當(dāng)你傳遞一個(gè)字符串時(shí),最好使用一個(gè)字符串指針并遞增這個(gè)指針,如果你遞增一個(gè)指針,它將自動(dòng)進(jìn)入變量的下一個(gè)地址,你可以在其中存儲(chǔ)你想顯示的字符。請(qǐng)看下面的例子。
void write_string(unsigned char *str) //store address value of the string in pointer *str
{
int i=0;
while(strng[i]!=’