- การทำงานของจอ LCD 16x2
- แผนภาพวงจรไปยังอินเตอร์เฟส LCD พร้อมไมโครคอนโทรลเลอร์ STM8
- STM8 LCD Library - ไฟล์ส่วนหัวสำหรับ STM8S103F3P6
- โปรแกรม LCD สำหรับไมโครคอนโทรลเลอร์ STM8S
- STM8 พร้อม LCD - ทำงาน
จอ LCD แบบตัวเลขและตัวอักษร 16x2 เป็นจอแสดงผลที่ใช้กันมากที่สุดในหมู่ผู้ที่ชื่นชอบงานอดิเรกและผู้ที่ชื่นชอบ การแสดงผลมีประโยชน์มากเมื่อคุณต้องการแสดงข้อมูลพื้นฐานแก่ผู้ใช้และยังสามารถช่วยในการทดสอบหรือแก้ไขข้อบกพร่องของโค้ดของเราได้อีกด้วย โมดูล LCD 16x2 โดยเฉพาะนี้สามารถหาซื้อได้ง่ายและได้รับความนิยมมาอย่างยาวนาน คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับพื้นฐานของโมดูล LCD 16x2 ได้ในบทความที่เชื่อมโยง
เพื่อดำเนินการต่อกับชุดของเราบทเรียน STM8 ไมโครคอนโทรลเลอร์ในการกวดวิชานี้เราจะได้เรียนรู้วิธีการอินเตอร์เฟซ แอลซีดีพร้อม STM8 ไมโครคอนโทรลเลอร์ ก่อนหน้านี้เราได้เชื่อมต่อ LCD 16x2 กับไมโครคอนโทรลเลอร์อื่น ๆ ด้วยเช่นกันบทช่วยสอนจะแสดงไว้ด้านล่างและคุณสามารถตรวจสอบได้หากสนใจ
หากคุณยังใหม่กับ STM8 โปรดดูบทความการเริ่มต้นใช้งานไมโครคอนโทรลเลอร์ STM8 เพื่อทำความเข้าใจพื้นฐานของบอร์ดควบคุมและสภาพแวดล้อมการเขียนโปรแกรม เราจะไม่พูดถึงพื้นฐานในบทช่วยสอนนี้
การทำงานของจอ LCD 16x2
ตามชื่อที่แนะนำ LCD 16x2 จะมี 16 คอลัมน์และ 2 แถว ดังนั้นโดยรวมแล้วเราจะสามารถแสดงอักขระได้ 32 ตัวบนจอแสดงผลนี้และอักขระเหล่านี้สามารถเป็นตัวอักษรหรือตัวเลขหรือแม้แต่สัญลักษณ์ Pinout LCD 16x2แบบง่ายๆที่เราใช้ในบทช่วยสอนนี้แสดงไว้ด้านล่าง -
อย่างที่คุณเห็นจอแสดงผลมี 16 พินและเราสามารถแบ่งออกเป็นห้าประเภท ได้แก่ Power Pins, contrast pin, Control Pins, Data pins และ Backlight ตามที่แสดงในตารางด้านล่าง เราจะเข้าสู่รายละเอียดของแต่ละพินเมื่อเราพูดถึงแผนภาพวงจรของบทช่วยสอนนี้
ประเภท | หมายเลขพิน | ชื่อพิน | ฟังก์ชัน |
พาวเวอร์พิน | 1 | VSS | Ground Pin เชื่อมต่อกับกราวด์ |
2 | VDD หรือ Vcc | พินแรงดันไฟฟ้า + 5V | |
คอนทราสต์พิน | 3 | V0 หรือ VEE | การตั้งค่าความคมชัดเชื่อมต่อกับ Vcc ผ่านตัวต้านทานตัวแปร |
พินควบคุม | 4 | อาร์เอส | ลงทะเบียนเลือก Pin, RS = 0 โหมดคำสั่ง, RS = 1 โหมดข้อมูล |
5 | RW | อ่าน / เขียนพิน RW = 0 โหมดเขียน RW = 1 โหมดอ่าน | |
6 | จ | เปิดใช้งานพัลส์สูงถึงต่ำจำเป็นต้องเปิดใช้งาน LCD | |
หมุดข้อมูล | 7-14 | D0-D7 | หมุดข้อมูลเก็บข้อมูลที่จะแสดงบน LCD หรือคำสั่งคำสั่ง |
หมุดแบ็คไลท์ | 15 | LED + หรือ A | เพื่อเปิดไฟแบ็คไลท์ + 5V |
16 | LED- หรือ K | แบ็คไลท์กราวด์ |
ที่ด้านหลังของ LCD ดังที่แสดงในภาพด้านล่างคุณจะพบจุดสีดำสองจุดซึ่งภายในเรามีIC ไดรเวอร์ HD44780 LCD (ล้อมรอบด้วยสีแดง) ไมโครคอนโทรลเลอร์ของเราควรสื่อสารกับ IC นี้ซึ่งจะควบคุมสิ่งที่แสดงบน LCD หากคุณอยากรู้ว่าทั้งหมดนี้ทำงานอย่างไรคุณควรตรวจสอบการทำงานของจอ LCD 16x2 ซึ่งเราได้พูดถึงวิธีการทำงานของ LCD โดยละเอียดแล้ว
ในการกวดวิชานี้เราจะหารือเกี่ยวกับวงจรและรหัสเพื่อแสดงตัวอักษร alphamerical (ตัวอักษรและตัวเลข) บนจอแสดงผลแอลซีดี 16x2 ใช้ง่าย LCD_print _char และ LCD_print_string คำสั่ง คำสั่งเหล่านี้สามารถใช้ได้โดยตรงในโปรแกรมหลังจากรวมไฟล์ส่วนหัวของเราแล้ว ไฟล์ส่วนหัวเกี่ยวข้องกับสิ่งต่างๆเกือบทั้งหมดสำหรับคุณดังนั้นจึงไม่จำเป็นต้องทราบว่าจอแสดงผลหรือ IC ไดรเวอร์ HD44780 ทำงานอย่างไร
แผนภาพวงจรไปยังอินเตอร์เฟส LCD พร้อมไมโครคอนโทรลเลอร์ STM8
STM8 LCD Circuit ที่สมบูรณ์สามารถพบได้ในภาพด้านล่าง อย่างที่คุณเห็นการเชื่อมต่อสำหรับ STM8S103F3P6 Controller กับ LCDนั้นง่ายมากเรามีจอ LCD ที่เชื่อมต่อโดยตรงกับบอร์ดของเราและ ST-link ก็เชื่อมต่อกับโปรแกรมบอร์ดด้วย
หมุดเพาเวอร์ Vss และ Vcc เชื่อมต่อกับขา 5V บนบอร์ด STM8S โปรดทราบว่าแรงดันไฟฟ้าของ LCD คือ 5V และเชื่อมต่อเพื่อทำงานบน 3.3V ดังนั้นแม้ว่าไมโครคอนโทรลเลอร์ STM8S103F3P6 จะทำงานบน 3.3V แต่จำเป็นต้องมีแหล่งจ่ายไฟ 5V สำหรับ LCD แต่คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยใช้ IC ควบคุมการชาร์จ แต่เราจะไม่พูดถึงเรื่องนั้นในบทช่วยสอนนี้
ต่อไปเรามีพินคอนทราสต์ที่ใช้ตั้งค่าคอนทราสต์ของ LCD เราได้เชื่อมต่อกับโพเทนชิออมิเตอร์เพื่อให้เราสามารถควบคุมคอนทราสต์ได้ เราใช้หม้อ 10k แต่คุณยังสามารถใช้ค่าใกล้เคียงอื่น ๆ ได้หม้อทำหน้าที่เป็นตัวแบ่งที่มีศักยภาพเพื่อให้ 0-5 V ไปยังขาคอนทราสต์โดยทั่วไปคุณสามารถใช้ตัวต้านทานโดยตรงเพื่อให้ประมาณ 2.2V เพื่อความเปรียบต่างที่เหมาะสม มูลค่า. จากนั้นเราจะมีหมุดรีเซ็ต (RS), อ่าน / เขียน (RW) และเปิดใช้งาน (E) พินอ่าน - เขียนถูกต่อสายดินเนื่องจากเราจะไม่อ่านอะไรจากจอ LCD เราจะดำเนินการเขียนเท่านั้น อีกสองพินควบคุม Rs และ E เชื่อมต่อกับพิน PA1 และ PA2 ตามลำดับ
จากนั้นเรามีหมุดข้อมูล DB0 ถึง DB7 LCD 16x2 สามารถทำงานในสองโหมดหนึ่งคือโหมดการทำงาน 8 บิตที่เราต้องใช้หมุดข้อมูลทั้งหมด 8 พิน (DB0-DB7) บนจอ LCD และอีกโหมดคือโหมดการทำงาน 4 บิตที่เราต้องการเพียง 4 หมุดข้อมูล (DB4-DB7) โหมด 4 บิตมักใช้เนื่องจากต้องใช้พิน GPIO น้อยจากคอนโทรลเลอร์ดังนั้นเราจึงใช้โหมด 4 บิตในบทช่วยสอนนี้และได้เชื่อมต่อเฉพาะพิน DB4, DB5, DB6 และ DB7 เพื่อพิน PD1, PD2, PD3 และ PD4 ตามลำดับ
BLA และ BLK สองพินสุดท้ายใช้เพื่อจ่ายไฟให้กับไฟ LED แบ็คไลท์ภายในเราใช้ตัวต้านทาน 560 โอห์มเป็นตัวต้านทาน จำกัด กระแส โปรแกรมเมอร์ ST-Link เชื่อมต่อเช่นเคยเหมือนในบทช่วยสอนก่อนหน้านี้ ฉันทำการเชื่อมต่ออย่างสมบูรณ์บน breadboard และการตั้งค่าของฉันมีลักษณะดังที่แสดงในภาพด้านล่าง
STM8 LCD Library - ไฟล์ส่วนหัวสำหรับ STM8S103F3P6
ก่อนที่เราจะดำเนินการต่อในแผนภาพวงจรเรามารับไฟล์ส่วนหัว STM8 LCDจาก GitHub โดยใช้ลิงค์ต่อไปนี้ -
ไฟล์ส่วนหัว LCD STM8S 16x2
คุณสามารถดาวน์โหลด repo ที่สมบูรณ์และรับไฟล์ stm8s103_LCD_16x2.h หรือโค้ดง่ายๆจากลิงค์ด้านบน ขณะตั้งค่าโปรเจ็กต์ตรวจสอบให้แน่ใจว่าคุณรวมไฟล์ส่วนหัวที่จำเป็นทั้งหมดไว้ในไดเร็กทอรี inc พร้อมกับไฟล์ส่วนหัวนี้
หากคุณไม่แน่ใจว่าจะเพิ่มไฟล์ส่วนหัวและคอมไพล์โปรแกรมอย่างไรให้ทำตามวิดีโอที่ด้านล่างของหน้านี้ และหากคุณอยากรู้ว่าโค้ดภายในไฟล์ส่วนหัวทำงานอย่างไรคุณสามารถดู PIC ด้วยบทช่วยสอน LCD ไฟล์ส่วนหัวที่ใช้ในโปรเจ็กต์นี้คล้ายกับไฟล์ที่อธิบายไว้ในนั้นมากดังนั้นเราจะไม่ลงรายละเอียดในเรื่องนั้น
โปรแกรม LCD สำหรับไมโครคอนโทรลเลอร์ STM8S
สำหรับการสาธิตเราจะตั้งโปรแกรมคอนโทรลเลอร์ STM8S ของเราให้แสดงสตริงง่ายๆเช่น“ Circuit Digest” จากนั้นเราจะเพิ่มค่า“ Test” ทุกๆ 1 วินาทีในบรรทัดที่สอง โปรแกรมที่สมบูรณ์สามารถพบได้ที่ด้านล่างของหน้านี้ คำอธิบายดังนี้.
เราเริ่มโปรแกรมของเราโดยกำหนดพินและเพิ่มไฟล์ส่วนหัวที่ต้องการเช่นเคย ในแผนภาพวงจรที่กล่าวถึงข้างต้นเราได้เชื่อมต่อ LCD_RS กับ PA1 ดังนั้นเราจึงได้กำหนดเป็น LCD_RS GPIOA, GPIO_PIN_1 ในทำนองเดียวกันเราได้ทำเช่นเดียวกันสำหรับหมุดอื่น ๆ เช่นกัน หากกำลังติดตามวงจรอื่นตรวจสอบให้แน่ใจว่าคุณเปลี่ยนค่าเหล่านี้ตามนั้น
#define LCD_RS GPIOA, GPIO_PIN_1 # กำหนด LCD_EN GPIOA, GPIO_PIN_2 # กำหนด LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 # กำหนด LCD_DB6 GPIOA, GPIO_PIN_2 # กำหนด LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 # กำหนด LCD_DB6 GPIOD, GPIO_PIN_2 #define LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 # กำหนด LCD_DB6 GPIOD, GPIO_PIN_3 #define LCD_DB_DB.X2
ถัดไปในโปรแกรมหลักของเราเราได้ประกาศตัวแปรที่จำเป็นสำหรับโค้ดตัวอย่างนี้ เรามีตัวแปรทดสอบที่เรียกว่า test_var ซึ่งเริ่มต้นเป็นศูนย์เราจะเพิ่มตัวแปรและแสดงบน LCD อักขระ d1 ถึง d4 แสดงถึงตัวเลข 4 หลักของตัวแปรทดสอบเนื่องจาก LCD ของเราไม่สามารถแสดงค่า int ได้โดยตรงเราจึงต้องแปลงเป็นอักขระ
// การประกาศตัวแปร int test_var = 0; ถ่าน d4, d3, d2, d1;
LCD_Begin () ฟังก์ชั่นที่ใช้ในการเริ่มต้นจอแอลซีดี ฟังก์ชันนี้จะเริ่มต้นพิน GPIO ที่จำเป็นทั้งหมดและตั้งค่า LCD ในโหมด LCD 16x2 จากนั้นเรามี ฟังก์ชัน LCD_Clear () ซึ่งใช้เพื่อล้างค่าทั้งหมดบน LCD ซึ่งจะลบทุกอย่างบน LCD เพื่อให้เขียนค่าใหม่ได้อย่างสะอาด จากนั้นเรามี ฟังก์ชัน LCD_Set_Cursor (x, y) โดยที่ x และ y เป็นตำแหน่งที่เราต้องเขียนอักขระใหม่ของเรา ตัวอย่างเช่น (1,1) หมายถึงแถวแรกและ Colum แรกในทำนองเดียวกัน (2,12) หมายถึงแถวที่สอง 12 คอลัมน์ในทำนองเดียวกัน โปรดทราบว่าเรามี 2 แถวและ 16 คอลัมน์ที่นี่ตามที่เรากล่าวไว้ก่อนหน้านี้
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
ตอนนี้ LCD ถูกตั้งค่าล้างและเคอร์เซอร์อยู่ที่ตำแหน่ง สิ่งต่อไปคือการพิมพ์บางอย่างบนหน้าจอ เราสามารถใช้ LCD_Print_String (“ สตริงตัวอย่าง”) เพื่อพิมพ์สตริงไปยัง LCD และ LCD_Print_Char (a) เพื่อพิมพ์ค่าอักขระไปยัง LCD ในโปรแกรมของเราที่นี่เราได้พิมพ์“ STM8S103F3P3 LCD” และสร้างความล่าช้า 5 วินาทีโดยใช้รหัสด้านล่าง
Lcd_Print_String ("STM8S103F3P3 LCD"); delay_ms (5000);
หลังจากหน่วงเวลา 5 วินาทีเราจะล้าง LCD อีกครั้งและแสดง“ Circuit Digest” ในแถวแรกและ“ Test:” I แถวที่สอง
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("เซอร์กิตไดเจสต์"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("ทดสอบ:");
ภายในลูป while เราจะแบ่งค่าของตัวแปรจำนวนเต็ม test_var เป็นอักขระแต่ละตัวเพื่อให้สามารถแสดงบน LCD โดยใช้ตัวดำเนินการหารและโมดูลัสอย่างง่าย นอกจากนี้เรายังเพิ่ม '0' เพื่อแปลงค่า ASCII เป็นอักขระ
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
จากนั้นเราได้ตั้งค่าเคอร์เซอร์เป็น (2,6) เนื่องจากเราได้เขียน "Test:" ไว้แล้วในแถวที่สองซึ่งมีความยาว 6 ตัวอักษร หากเราเขียนทับอักขระที่มีอยู่จะถูกแทนที่ด้วยอักขระใหม่บน LCD เราได้เพิ่มการหน่วงเวลา 1 วินาทีและเพิ่มตัวแปร
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); delay_ms (1,000); test_var ++;
STM8 พร้อม LCD - ทำงาน
ในการทดสอบโปรแกรมของเราเพียงแค่อัปโหลดโค้ดไปยังคอนโทรลเลอร์ของเราและเปิดเครื่องด้วยพอร์ต micro-USB โปรดทราบว่า LCD ต้องใช้ 5V ในการทำงานดังนั้นจึงจำเป็นต้องจ่ายไฟให้บอร์ดจากพอร์ต USB ก่อนหน้านี้เราได้ขับเคลื่อนโดยตรงจาก ST-link เนื่องจากเราไม่ต้องการแหล่งจ่ายไฟ 5V
อย่างที่คุณเห็น LCD ทำงานตามที่คาดไว้โดยค่าตัวแปรทดสอบจะเพิ่มขึ้นทุก ๆ วินาทีโดยประมาณ นอกจากนี้โปรดทราบว่าเราไม่ได้ใช้ตัวจับเวลาและใช้ฟังก์ชันหน่วงเวลาเพื่อสร้างการหน่วงเวลานี้เท่านั้นดังนั้นอย่าคาดหวังว่าระยะเวลาหน่วงจะแม่นยำเราจะใช้ตัวจับเวลาในภายหลังในบทช่วยสอนอื่นเพื่อจุดประสงค์นั้น
การทำงานทั้งหมดของโครงการสามารถพบได้ในวิดีโอที่ลิงก์ด้านล่าง หวังว่าคุณจะสนุกกับบทช่วยสอนและเรียนรู้สิ่งที่เป็นประโยชน์ หากคุณมีคำถามใด ๆ โปรดทิ้งไว้ในส่วนความคิดเห็นหรือใช้ฟอรัมของเราสำหรับคำถามทางเทคนิคอื่น ๆ