在本教程中,我們將了解如何將 16x2 LCD 與 ARM7-LPC2148 微控制器連接,并顯示簡單的歡迎消息。如果您是 ARM7 的新手,請從 ARM7 LPC2148 的基礎知識開始,并了解如何使用 Keil uVision 對其進行編程
所需材料
ARM7-LPC2148 微控制器板
液晶屏 (16X2)
電位計
5V 穩壓器 IC
試驗板
連接線
9V電池
微型 USB 連接線
軟件
凱爾烏維森 5
魔術閃光工具
在進入項目之前,我們必須對LCD操作模式和LCD十六進制代碼知之甚少。
16X2液晶顯示模塊
16X2 LCD表示它有16列和2行。此液晶屏有 16 個引腳。下圖顯示了LCD顯示器的引腳名稱及其功能。
LCD可以在兩種不同的模式下工作,即4位模式和8位模式。在 4 位模式下,我們逐個半字節發送數據,首先是上半字節,然后是下半字節。對于那些不知道什么是半字節的人:半字節是一組四位,所以字節的下四位(D0-D3)形成下半字節,而字節的上四位(D4-D7)形成較高的半字節。這使我們能夠發送8位數據。
而在8位模式下,我們可以一次直接發送8位數據,因為我們使用了所有8條數據線。
在本項目中,我們將使用最常用的模式,即4位模式。在四位模式下,我們可以節省4個引腳的微控制器,并減少布線開銷。
16x2還使用十六進制代碼來接受任何命令,LCD有許多十六進制命令,例如移動光標,選擇模式,將控件移動到第二行等。
電路圖和連接
下表顯示了液晶屏與 ARM7-LPC2148 之間的電路連接。
穩壓器與液晶屏的連接 / ARM7 棒
下表顯示了 ARM7 和 LCD 與穩壓器之間的連接。
帶液晶屏的電位計
電位計用于改變LCD顯示器的對比度。電位器有三個引腳,左引腳(1)連接到+5V,中心(2)連接到LCD模塊的VEE或V0,右引腳(3)連接到GND。我們可以通過轉動旋鈕來調整對比度。
跳線設置
ARM7-Stick中存在跳線引腳,因此我們可以通過使用USB或使用5V DC輸入來供電和上傳代碼。您可以看到下面的圖像。
下圖顯示了跳線處于直流位置。這意味著我們必須從外部5V電源為電路板供電。
這張圖片顯示跳線是在USB模式下連接的。在這里,電源和代碼通過微型USB端口提供。
注意:在本教程中,我們通過使用USB上傳代碼,將跳線設置為USB,然后將跳線更改為直流模式,以從穩壓器的5v輸入為LPC2148供電。您可以在最后給出的視頻中查看。
將16x2 LCD 與 ARM7 微控制器連接的最終電路如下所示:
編程 ARM7-液化板 2148
要對ARM7-LPC2148進行編程,我們需要可視化和閃存魔術工具。我們正在使用USB電纜通過微型USB端口對ARM7記憶棒進行編程。我們使用Keil編寫代碼并創建一個十六進制文件,然后使用閃存魔術將HEX文件閃存到ARM7棒。
本教程末尾給出了將 LCD 與 ARM 7 連接的完整代碼,下面我們將介紹其中的一些部分。
首先,我們需要包含所需的頭文件
#include -Header File to include LPC214x libraries
#include -Header File for using integer type with specified widths
#include - Header File for include standard library
#include - Header File for include standard input output library
初始化LCD模塊是一個非常重要的步驟。在這里,我們使用某些十六進制代碼,這些代碼實際上是命令,以告訴LCD有關操作模式(4位),LCD類型(16x2),起始行等的信息。
void LCD_INITILIZE(void) //Function to get ready the LCD
{
IO0DIR = 0x0000FFF0; //Sets pin P0.4,P0.6 ,P0.12,P0.13,P0.14,P0.15as OUTPUT
delay_ms(20);
LCD_SEND(0x02); // Initialize lcd in 4-bit mode of operation
LCD_SEND(0x28); // 2 lines (16X2)
LCD_SEND(0x0C); // Display on cursor off
LCD_SEND(0x06); // Auto increment cursor
LCD_SEND(0x01); // Display clear
LCD_SEND(0x80); // First line first position
}
對于4位模式,我們對引腳有不同類型的寫入功能,即使用上下半字節。讓我們看看,它是如何完成的
void LCD_SEND(char command) //Function to send hex commands nibble by nibble
{
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0xF0)<<8) ); //Send upper nibble of command?
IO0SET = 0x00000040; //Making Enable HIGH
IO0CLR = 0x00000030; //Making RS & RW LOW
delay_ms(5);
IO0CLR = 0x00000040; //Makeing Enable LOW
delay_ms(5);
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0x0F)<<12) ); //Send Lower nibble of command?
IO0SET = 0x00000040; //ENABLE HIGH
IO0CLR = 0x00000030; //RS & RW LOW
delay_ms(5);
IO0CLR = 0x00000040; //ENABLE LOW
delay_ms(5);
}
蠶食發送邏輯
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0x0F)<<12) ); //Send Lower nibble of command?
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0xF0)<<8) ); //Send upper nibble of command?
以上兩種說法在本方案中起著重要作用。第一個命令發送下半字節,第二個命令發送上半字節。這不會影響我們所做的其他引腳。讓我們先看看它是如何發生的,然后再了解這個邏輯
ORing- (A|0=A),(A|1=1)
ANDing-(A&0=0),(A&1=A)
因此,我們使用屏蔽概念和邏輯移位操作,而不會影響其他引腳。表示僅使用引腳 (P0.12-P0.15),不影響 P0.4、P0.6 等其他引腳。它將通過將數據移入四位并使上半字節代替下半字節并掩蓋上半字節來完成。然后,我們將下位設為零(0XF0),并使用半字節數據進行ORed,以獲得輸出端的上半字節數據。
類似的過程用于較低的蠶食數據,但在這里我們不需要移動數據。
在將數據寫入輸出時,即在命令模式下,RS 應為 LOW,執行使能必須為高電平,而在數據模式下,RS 應為高電平,執行使能必須為高電平。
現在,為了發送要在輸出端打印的字符串數據,相同的原理是逐個半字節地使用。這里的重要步驟是寄存器選擇(RS)對于數據模式必須為高電平。
void LCD_DISPLAY (char* msg) //Function to print the characters sent one by one
{
uint8_t i=0;
while(msg[i]!=0)
{
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0xF0)<<8) ); //Sends Upper nibble?
IO0SET = 0x00000050; //RS HIGH & ENABLE HIGH to print data
IO0CLR = 0x00000020; //RW LOW Write mode
delay ms(2);
IO0CLR = 0x00000040; // EN = 0, RS and RW unchanged(i.e. RS = 1, RW = 0)
delay ms(5);
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0x0F)<<12) ); //Sends Lower nibble
IO0SET = 0x00000050; //RS & EN HIGH
IO0CLR = 0x00000020;
delay ms(2);
IO0CLR = 0x00000040;
delay ms(5);
i++;
}
-
微控制器
+關注
關注
48文章
7542瀏覽量
151318 -
lcd
+關注
關注
34文章
4424瀏覽量
167410 -
LPC2148
+關注
關注
0文章
25瀏覽量
14926
發布評論請先 登錄
相關推薦
評論