將16X2 LCD連接到AVR微控制器
本節課完全是關于AVR微控制器(ATMEGA 16)與16X2 LCD的接口問題。Atmega16屬于AVR微控制器系列。
本文引用地址://tjguifa.cn/article/202304/446098.htm電路解釋:
這與LCD與8051或PIC微控制器的接口方式沒有什么不同。水晶振蕩器將向微控制器提供時鐘。連接在晶體上的電容將作為過濾器,幫助晶體產生共振,并以平行共振的方式進行振蕩。
連接到LCD的3號和2號引腳的電位器將有助于調整LCD的對比度。LCD的4、5和6個引腳,即寄存器選擇、讀/寫和啟用引腳,與Atmega16的PD0、PD1和PD2引腳相連。LCD的數據引腳與Atmega16的33至40引腳相連。
對ATMEGA16進行編程,以便與16X2 LCD連接:
你可以從8051單片機的16×2接口一文中得到LCD的簡要信息。正如我前面所說的,編程的基本原理都是一樣的,就是使用微控制器的引腳和寄存器。
非常重要的是如何向LCD發送數據以及如何向LCD發送命令,假設你要向LCD發送數據,那么你必須在發送數據之前將16×2 LCD的ENABLE引腳調為低電平,當你認為你要發送的數據已經準備好時,再將ENABLE引腳調為高電平,用編碼語言表示為1。如果你把ENABLE引腳變成高電平,那么只有LCD會工作。
僅僅使ENABLE引腳為高電平是不行的,你必須使REGISTER SELECT引腳(RS引腳)也為高電平,這樣LCD才會接受必須在LCD屏幕上顯示的正常數據,如果你忘記使RS引腳為高電平,它最終會認為用戶在向它發送命令,并使它自己準備好根據命令行事,如使光標移動、清除LCD上的數據、改變光標位置等等。
最后但并非最不重要的是另一個你需要擔心的針腳--讀/寫針腳,我們都知道任何設備的基本功能都是從讀和寫開始的,讀數據和寫數據是任何外圍設備或系統的主要和重要功能。
僅僅發送數據和顯示數據并不能完成任務;以可理解的方式安排數據是程序員的重要和關鍵任務。你可以在LCD中安排數據或使LCD按照你的愿望工作,可以通過向LCD發送命令或特殊功能來完成,你可能會想,LCD需要什么類型的命令,光標位置的命令,增加或減少對比度,使光標改變行,如從第一行到第二行等等。 為了向LCD發送命令,你需要使引腳變成高電平和低電平,就像發送數據一樣。為了發送命令,你需要使ENABLE針腳為高電平,REGISTER SELECT針腳(RS針腳)為低電平,也就是程序員所說的0,而讀/寫針腳(R/W針腳)為高電平,你需要記住這個配置來發送命令。
在顯示數據時,程序員一般使用不同的命令和它們的十六進制代碼。

如果我們想簡單說說在LCD上顯示數據的情況
E=1;使能引腳應該是高電平
RS=1;寄存器選擇應該是高電平
R/W=0;讀/寫引腳應該為低電平。
對于向LCD發送命令
E=1;使能引腳應該為高電平
RS=0;寄存器選擇應該是低電平
R/W=1;讀/寫引腳應該為高電平。
當你傳遞一個字符串時,最好使用一個字符串指針并遞增這個指針,如果你遞增一個指針,它將自動進入變量的下一個地址,你可以在其中存儲你想顯示的字符。請看下面的例子。
void write_string(unsigned char *str) //store address value of the string in pointer *str
{
int i=0;
while(strng[i]!=’ ′) // loop will go on till the NULL character in the string
{
lcd_write(strng[i]);// sending data on LCD byte by byte
i++;
}
return;
}
Code for Interfacing the LCD to ATMEGA16:
LCD DATA port----PORT B
signal port------PORT D
rs-------PD0
rw-------PD1
en-------PD2
*/
#define LCD_DATA PORTB //LCD data port
#define ctrl PORTD
#define en PD2 // enable signal
#define rw PD1 // read/write signal
#define rs PD0 // register select signal
void LCD_cmd(unsigned char cmd);
void init_LCD(void);
void LCD_write(unsigned char data);
int main()
{
DDRB=0xff; // setting the port B
DDRD=0x07; // setting for port D
init_LCD(); // initialization of LCD
_delay_ms(50); // delay of 50 mili seconds
LCD_write_string(“hello world”); // function to print string on LCD
return 0;
}
void init_LCD(void)
{
LCD_cmd(0x38); // initialization of 16X2 LCD in 8bit mode
_delay_ms(1);
LCD_cmd(0x01); // clear LCD
_delay_ms(1);
LCD_cmd(0x0E); // cursor ON
_delay_ms(1);
LCD_cmd(0x80); // —8 go to first line and –0 is for 0th position
_delay_ms(1);
return;
}
void LCD_cmd(unsigned char cmd)
{
LCD_DATA=cmd;
ctrl =(0<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl =(0<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return;
}
void LCD_write(unsigned char data)
{
LCD_DATA= data;
ctrl = (1<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl = (1<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return ;
}
void LCD_write_string(unsigned char *str) //store address value of the string in pointer *str
{
int i=0;
while(str[i]!=’ ′) // loop will go on till the NULL character in the string
{
LCD_write(str[i]); // sending data on LCD byte by byte
i++;
}
return;
}
相關推薦
-
| 2007-12-04
-
| 2007-12-15
-
| 2010-02-10
-
| 2003-08-13
-
-
| 2003-06-10
-
| 2009-07-06
-
| 2009-07-06
-
| 2010-02-10
-
-
| 2003-06-10
-
| 2007-12-15
-
| 2009-10-19
-
| 2009-07-06
-
| 2010-02-10
-
| 2007-12-15
-
| 2009-07-06
-
| 2007-12-15
-
| 2004-10-18
-
| 2003-08-08
-
| 2009-07-06
-
-
| 2009-03-24





評論