16x2 字母數(shù)字 LCD 顯示屏是愛好者和愛好者中最常用的顯示屏。當(dāng)您想向用戶顯示基本信息時,顯示非常有用,并且還可以幫助測試或調(diào)試我們的代碼。這種特殊的 16x2 LCD 模塊很容易獲得,并且已經(jīng)流行了很長時間。您可以在鏈接文章中了解有關(guān)16x2 LCD模塊基礎(chǔ)知識的更多信息。
為了繼續(xù)我們的STM8 微控制器系列教程,在本教程中,我們將學(xué)習(xí)如何將 LCD 與 STM8 微控制器連接。
16x2 LCD 顯示器的工作原理
顧名思義,16x2 LCD 將有 16 列和 2 行。所以總的來說,我們將能夠在這個顯示器上顯示 32 個字符,這些字符可以是字母或數(shù)字,甚至是符號。我們在本教程中使用的一個簡單的16x2 LCD 引腳如下所示 -
如您所見,顯示器有 16 個引腳,我們可以將其分為五類,電源引腳、對比度引腳、控制引腳、數(shù)據(jù)引腳和背光引腳,如下表所示。在討論本教程的電路圖時,我們將詳細介紹每個引腳。
在 LCD 的背面,如下圖所示,你會發(fā)現(xiàn)兩個黑點,里面是HD44780 LCD 驅(qū)動 IC(紅色圈出)。我們的微控制器應(yīng)該與這個 IC 通信,這反過來將控制 LCD 上顯示的內(nèi)容。如果您想知道這一切究竟是如何工作的,您應(yīng)該查看16x2 LCD 顯示器的工作原理,我們已經(jīng)詳細討論了 LCD 的工作原理。
在本教程中,我們將討論使用簡單的 LCD_print_char和LCD_print_string命令在 16x2 LCD 顯示器上顯示字母字符(字母和數(shù)字)的電路圖和代碼。這些命令在包含我們的頭文件后可以直接在程序中使用。頭文件為您處理所有大部分內(nèi)容,因此不必了解顯示器或 HD44780 驅(qū)動 IC 的工作原理。
將 LCD 與 STM8 微控制器連接的電路圖
完整的STM8 LCD 電路如下圖所示。如您所見,STM8S103F3P6 控制器與 LCD的連接非常簡單,我們將 LCD 顯示器直接連接到我們的開發(fā)板,并且還連接了 ST-link 以對開發(fā)板進行編程。
電源管腳Vss和Vcc接STM8S板上的5V管腳,注意LCD的工作電壓為5V,接上工作在3.3V。因此,即使 STM8S103F3P6 微控制器在 3.3V 上運行必須為 LCD 提供 5V 電源,您可以通過使用充電控制器 IC 來避免這種情況,但我們不會在本教程中討論這個問題。
接下來,我們有用于設(shè)置 LCD 對比度的對比度引腳,我們將其連接到電位器,以便我們可以控制對比度。我們使用了 10k 電位器,但您也可以使用其他附近的值,電位器充當(dāng)分壓器,為對比度引腳提供 0-5 V,通常您也可以直接使用電阻器提供 2.2V 左右的合理對比度價值。然后我們有復(fù)位 (RS)、讀/寫 (RW) 和啟用 (E) 引腳。讀寫引腳接地,因為我們不會從 LCD 讀取任何內(nèi)容,我們只會執(zhí)行寫入操作。另外兩個控制引腳 Rs 和 E 分別連接到 PA1 和 PA2 引腳。
然后我們有數(shù)據(jù)引腳 DB0 到 DB7。16x2 LCD 可以在兩種模式下運行,一種是 8 位操作模式,我們必須使用 LCD 上的所有 8 個數(shù)據(jù)引腳(DB0-DB7),另一種是 4 位操作模式,我們只需要 4 個數(shù)據(jù)引腳(DB4-DB7) 。通常使用 4 位模式,因為它需要控制器的 GPIO 引腳較少,因此我們在本教程中也使用了 4 位模式,并且僅將引腳 DB4、DB5、DB6 和 DB7 連接到引腳 PD1、PD2、PD3 , 和 PD4 分別。
最后兩個引腳 BLA 和 BLK 用于為內(nèi)部背光 LED 供電,我們使用了一個 560 歐姆的電阻作為限流電阻。ST-Link 編程器的連接方式與我們之前的教程一樣。我在面包板上完成了完整的連接,我的設(shè)置如下圖所示。
STM8 LCD 庫——STM8S103F3P6 的頭文件
您可以下載完整的 repo 并獲取stm8s103_LCD_16x2.h文件,也可以簡單地從上面的鏈接中獲取代碼。在設(shè)置項目時,請確保在 inc 目錄中包含所有必需的頭文件以及此頭文件。
如果您不確定如何添加頭文件和編譯程序,請按照本頁底部的視頻進行操作。如果您對頭文件中的代碼如何工作感到好奇,您可以查看帶有 LCD 教程的 PIC。這個項目中使用的頭文件與那里解釋的非常相似,所以我們不會詳細介紹。
STM8S微控制器的LCD程序
為了演示,我們將對 STM8S 控制器進行編程以顯示一個簡單的字符串,例如“Circuit Digest”,然后我們將在第二行中每隔一秒增加一個“Test”值。完整的程序可以在本頁底部找到。說明如下。
我們通過定義引腳并像往常一樣添加所需的頭文件來啟動我們的程序。在我們上面討論的電路圖中,我們已將LCD_RS連接到 PA1,因此我們將其定義為LCD_RS GPIOA、GPIO_PIN_1。 同樣,我們對其他引腳也做了同樣的事情。如果它們遵循不同的電路,請確保相應(yīng)地更改這些值。
#define LCD_RS GPIOA,GPIO_PIN_1
#define LCD_EN GPIOA, GPIO_PIN_2
#define LCD_DB4 GPIOD,GPIO_PIN_1
#define LCD_DB5 GPIOD,GPIO_PIN_2
#define LCD_DB6 GPIOD,GPIO_PIN_3
#define LCD_DB7 GPIOD,GPIO_PIN_4
#包括“STM8S.h”
#include “stm8s103_LCD_16x2.h”
接下來在我們的主程序中,我們聲明了此示例代碼所需的變量。我們有一個名為test_var 的測試變量,它被初始化為零,我們將增加變量并將其顯示在 LCD 上。d1 到 d4 字符代表測試變量的 4 位,因為我們的 LCD 不能直接顯示 int 值,我們必須將它們轉(zhuǎn)換為字符。
//變量聲明
int test_var = 0;
字符 d4,d3,d2,d1;
LCD_Begin () 函數(shù)用于初始化 LCD。該函數(shù)將初始化所有需要的 GPIO 引腳并將 LCD 設(shè)置為 16x2 LCD 模式。然后我們有LCD_Clear()函數(shù),用于清除 LCD 上的所有值,這將擦除 LCD 上的所有內(nèi)容,以便寫入新值是干凈的。然后我們有LCD_Set_Cursor(x,y)函數(shù),其中 x 和 y 是我們需要寫入新字符的位置。例如,(1,1) 表示第一行和第一列,同樣,(2,12) 表示第二行 12 列,同樣。請注意,如前所述,我們在這里有 2 行和 16 列。
液晶開始();
液晶清除();
Lcd_Set_Cursor(1,1);
現(xiàn)在,LCD 已設(shè)置、清除,并且光標在該位置。接下來是在屏幕上打印一些東西。我們可以使用LCD_Print_String(“Sample String”) 將字符串打印到 LCD 并使用 LCD_Print_Char(a)將字符值打印到 LCD。在我們的程序中,我們打印了“STM8S103F3P3 LCD”并使用以下代碼創(chuàng)建了 5 秒的延遲。
Lcd_Print_String(“STM8S103F3P3 LCD”);
延遲毫秒(5000);
5 秒延遲后,我們再次清除 LCD,第一行顯示“Circuit Digest”,第二行顯示“Test:”。
液晶清除();
Lcd_Set_Cursor(1,1);
Lcd_Print_String(“電路文摘”);
Lcd_Set_Cursor(2,1);
Lcd_Print_String(“測試:”);
在while循環(huán)中,我們將整數(shù)變量test_var上的值拆分為單個字符,以便可以使用簡單的除法和模數(shù)運算符將其顯示在 LCD 上。我們還添加了“0”來將 ASCII 值轉(zhuǎn)換為字符。
d4 = test_var%10 + ‘0’;
d3 = (test_var/10)%10 + ‘0’;
d2 = (test_var/100)%10 + ‘0’;
d1 = (test_var/1000) + ‘0’;
然后我們將光標設(shè)置為 (2,6),因為我們已經(jīng)在第二行寫了“Test:”,即 6 個字符。如果我們覆蓋,現(xiàn)有字符將被 LCD 上的新字符替換。我們還添加了 1 秒的延遲并增加了變量。
Lcd_Set_Cursor(2,6);
Lcd_Print_Char(d1);
Lcd_Print_Char(d2);
Lcd_Print_Char(d3);
Lcd_Print_Char(d4);
延遲毫秒(1000);
測試變量++;
帶 LCD 的 STM8 – 工作
要測試我們的程序,只需將代碼上傳到我們的控制器并使用微型 USB 端口為其供電。請注意,LCD 需要 5V 才能工作,因此必須從 USB 端口為電路板供電。我們之前直接從 ST-link 為其供電,因為我們不需要 5V 電源。
如您所見,LCD 按預(yù)期工作,測試變量值大約每秒遞增一次。另外,請注意,我們沒有使用計時器,只使用了延遲函數(shù)來創(chuàng)建此延遲,因此不要期望延遲持續(xù)時間是準確的,我們稍后將在另一個教程中使用計時器來實現(xiàn)此目的。
/*LCD --> STM8s
* LCD_RS --> PA1
* LCD_EN --> PA2
* LCD_DB4 --> PD1
* LCD_DB5 --> PD2
* LCD_DB6 --> PD3
* LCD_DB7 --> PD4
*/
#define LCD_RS GPIOA,GPIO_PIN_1
#define LCD_EN GPIOA, GPIO_PIN_2
#define LCD_DB4 GPIOD,GPIO_PIN_1
#define LCD_DB5 GPIOD,GPIO_PIN_2
#define LCD_DB6 GPIOD,GPIO_PIN_3
#define LCD_DB7 GPIOD,GPIO_PIN_4
#包括“STM8S.h”
#include “stm8s103_LCD_16x2.h”
主要的()
{
//變量聲明
int test_var = 0;
字符 d4,d3,d2,d1;
液晶開始();
液晶清除();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("STM8S103F3P3 LCD");
延遲毫秒(5000);
液晶清除();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("電路文摘");
Lcd_Set_Cursor(2,1);
Lcd_Print_String("測試:");
而 (1)
{
d4 = test_var%10 + '0';
d3 = (test_var/10)%10 + '0';
d2 = (test_var/100)%10 + '0';
d1 = (test_var/1000) + '0';
Lcd_Set_Cursor(2,6);
Lcd_Print_Char(d1);
Lcd_Print_Char(d2);
Lcd_Print_Char(d3);
Lcd_Print_Char(d4);
延遲毫秒(1000);
測試變量++;
}
}
-
微控制器
+關(guān)注
關(guān)注
48文章
7464瀏覽量
150876 -
lcd
+關(guān)注
關(guān)注
34文章
4407瀏覽量
166948 -
STM8
+關(guān)注
關(guān)注
18文章
392瀏覽量
56678
發(fā)布評論請先 登錄
相關(guān)推薦
評論