欧美激情综合一区二区三区,青柠影院免费观看电视剧高清8,无码人妻精品一区二区蜜桃老年人,亚洲最大成人网站,亚洲中文字幕无码一区在线

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 將16X2 LCD連接到AVR微控制器

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

作者: 時間:2023-04-28 來源:電子產品世界

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

本文引用地址://tjguifa.cn/article/202304/446098.htm

電路解釋:

這與與8051或PIC的接口方式沒有什么不同。水晶振蕩器將向微控制器提供時鐘。連接在晶體上的電容將作為過濾器,幫助晶體產生共振,并以平行共振的方式進行振蕩。

 連接到的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針腳)為高電平,你需要記住這個配置來發送命令。

在顯示數據時,程序員一般使用不同的命令和它們的十六進制代碼。

1682650753904628.png

如果我們想簡單說說在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;

}

評論


相關推薦

技術專區

關閉